シフト演算子

右シフトの引数は、整数値か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;