論理演算子

論理演算子では、次の表に列挙した記号と組み込み関数を使用します。

ビット単位演算 演算子の記号 構文の使用方法 対応する組み込み関数
標準 代入付き 標準 代入付き
AND & &= R = A & B R &= A _mm_and_si64
_mm_and_si128
OR | |= R = A | B R |= A _mm_and_si64
_mm_and_si128
XOR ^ ^= R = A^B R ^= A _mm_and_si64
_mm_and_si128
ANDNOT andnot N/A R = A andnot B N/A _mm_and_si64
_mm_and_si128

論理演算子と例外

A と B を M64 に変換して、結果を Iu8vec8 に割り当てます。

I64vec1 A;

Is8vec8 B;

Iu8vec8 C;

C = A & B;

同じサイズと符号の演算子は、共通の親データ型のうち最も近いデータ型を返します。

I32vec2 R = Is32vec2 A ^ Iu32vec2 B;

A & B は M64 を返します。戻り値は Iu8vec8 にキャストします。

C = Iu8vec8(A&B) + C;

AB が同じクラスの場合、戻り値はそれと同じ型になります。AB とが別のクラスの場合、戻り値は、両者に共通する親データ型のうち最も近いデータ型になります。

クラスを複数組み合わせた場合に論理演算子の戻り値がどうなるかを次の表に示します。これは、AB が別のクラスの場合に適用されるものです。

Ivec 論理演算子の多重定義

戻り値 (R) AND OR XOR NAND オペランド A オペランド B
I64vec1 R & | ^ andnot I[s|u]64vec2 A I[s|u]64vec2 B
I64vec2 R & | ^ andnot I[s|u]64vec2 A I[s|u]64vec2 B
I32vec2 R & | ^ andnot I[s|u]32vec2 A I[s|u]32vec2 B
I32vec4 R & | ^ andnot I[s|u]32vec4 A I[s|u]32vec4 B
I16vec4 R & | ^ andnot I[s|u]16vec4 A I[s|u]16vec4 B
I16vec8 R & | ^ andnot I[s|u]16vec8 A I[s|u]16vec8 B
I8vec8 R & | ^ andnot I[s|u]8vec8 A I[s|u]8vec8 B
I8vec16 R & | ^ andnot I[s|u]8vec16 A I[s|u]8vec16 B

代入付き論理演算子の場合は次表のように、戻り値 R は常に、事前に宣言した値 R と同じデータ型になります。

代入付き Ivec 論理演算子の多重定義

戻り値の型 左辺 (R) AND OR XOR 右辺 (任意の Ivec 型)
I128vec1 I128vec1 R &= |= ^= I[s|u][N]vec[N] A;
I64vec1 I64vec1 R &= |= ^= I[s|u][N]vec[N] A;
I64vec2 I64vec2 R &= |= ^= I[s|u][N]vec[N] A;
I[x]32vec4 I[x]32vec4 R &= |= ^= I[s|u][N]vec[N] A;
I[x]32vec2 I[x]32vec2 R &= |= ^= I[s|u][N]vec[N] A;
I[x]16vec8 I[x]16vec8 R &= |= ^= I[s|u][N]vec[N] A;
I[x]16vec4 I[x]16vec4 R &= |= ^= I[s|u][N]vec[N] A;
I[x]8vec16 I[x]8vec16 R &= |= ^= I[s|u][N]vec[N] A;
I[x]8vec8 I[x]8vec8 R &= |= ^= I[s|u][N]vec[N] A;