右シフトの引数は、整数値か Ivec 値であれば何でもかまわず、暗黙的に M64 データ型に変換されます。<< という演算子の 1 番目のオペランドまたは左側のオペランドには、I[s|u]8vec[8|16] 以外のどの型でも使用できます。
/* Automatic size and sign conversion */
Is16vec4 A,C;
Iu32vec2 B;
C = A;
*/ A&B returns I16vec4, which must be cast to Iu16vec4 to ensure logical shift, not arithmetic shift */
Is16vec4 A, C;
Iu16vec4 B, R;
R = (Iu16vec4)(A & B) C;
*/ A&B returns I16vec4, which must be cast to Is16vec4 to ensure arithmetic shift, not logical shift */
R = (Is16vec4)(A & B) C;
操作 | 記号 | 構文の使用方法 | 組込み関数 |
---|---|---|---|
左シフト | << &= |
R = A << B R &= A |
_mm_sll_si64 _mm_slli_si64 _mm_sll_pi32 _mm_slli_pi32 _mm_sll_pi16 _mm_slli_pi16 |
右シフト | >> | R = A >> B R >>= A |
_mm_srl_si64 _mm_srli_si64 _mm_srl_pi32 _mm_srli_pi32 _mm_srl_pi16 _mm_srli_pi16 _mm_sra_pi32 _mm_srai_pi32 _mm_sra_pi16 _mm_srai_pi16 |
符号付きのデータ型を右にシフトするときは算術シフトを使用します。符号なしクラスおよび中間クラスのときはすべて、論理シフトが使用されます。次の表は、最初の引数の型によって戻り値の型がどう決まるかを示したものです。
操作 | R | 右シフト | 左シフト | A | B | ||
---|---|---|---|---|---|---|---|
論理 | I64vec1 | >> | >>= | << | <<= | I64vec1 A; | I64vec1 B; |
論理 | I32vec2 | >> | >>= | << | <<= | I32vec2 A | I32vec2 B; |
算術 | Is32vec2 | >> | >>= | << | <<= | Is32vec2 A | I[s|u][N]vec[N] B; |
論理 | Iu32vec2 | >> | >>= | << | <<= | Iu32vec2 A | I[s|u][N]vec[N] B; |
論理 | I16vec4 | >> | >>= | << | <<= | I16vec4 A | I16vec4 B |
算術 | Is16vec4 | >> | >>= | << | <<= | Is16vec4 A | I[s|u][N]vec[N] B; |
論理 | Iu16vec4 | >> | >>= | << | <<= | Iu16vec4 A | I[s|u][N]vec[N] B; |