条件付き選択演算子

条件付き選択演算子の場合は、3 番目と 4 番目のオペランドによって戻り値のデータ型が決まります。3 番目と 4 番目のオペランドがサイズが同じで符号が異なる場合、戻り値は共通の親データ型のうち最も近いデータ型になります。

条件付き選択演算子の構文の使用方法

3 番目と 4 番目のオペランドがサイズが同じで符号が異なる場合、戻り値は共通の親データ型のうち最も近いデータ型になります。

I16vec4 R = select_neq(Is16vec4, Is16vec4, Is16vec4, Iu16vec4);

「等しい」条件付き選択

R0 := (A0 == B0) ? C0 : D0;

R1 := (A1 == B1) ? C1 : D1;

R2 := (A2 == B2) ? C2 : D2;

R3 := (A3 == B3) ? C3 : D3;

「等しくない」条件付き選択

R0 := (A0 != B0) ? C0 : D0;

R1 := (A1 != B1) ? C1 : D1;

R2 := (A2 != B2) ? C2 : D2;

R3 := (A3 != B3) ? C3 : D3;

条件付き選択演算子と対応する組み込み関数

条件付き選択の条件 演算子 構文 対応する組み込み関数 その他の組み込み関数 (すべてに適用)
等しい select_eq R = select_eq(A, B, C, D) _mm_cmpeq_pi32
_mm_cmpeq_pi16
_mm_cmpeq_pi8
_mm_and_si64
_mm_or_si64
_mm_andnot_si64
等しくない select_neq R = select_neq(A, B, C, D) _mm_cmpeq_pi32
_mm_cmpeq_pi16
_mm_cmpeq_pi8

 

より大きい select_gt R = select_gt(A, B, C, D) _mm_cmpgt_pi32
_mm_cmpgt_pi16
_mm_cmpgt_pi8

 

以上 select_ge R = select_gt(A, B, C, D) _mm_cmpge_pi32
_mm_cmpge_pi16
_mm_cmpge_pi8

 

より小さい select_lt R = select_lt(A, B, C, D) _mm_cmplt_pi32
_mm_cmplt_pi16
_mm_cmplt_pi8

 

以下 select_le R = select_le(A, B, C, D) _mm_cmple_pi32
_mm_cmple_pi16
_mm_cmple_pi8

 

条件付き選択演算のオペランドはすべて同じサイズでなければなりません。戻り値のデータ型は、オペランド C および D に共通する親データ型の中でも最も近いデータ型になります。「>」および「<」という比較を用いて条件付き選択演算を行う場合は、1 番目と 2 番目のオペランドの符号は次の表に従わなければなりません。

条件付き選択演算子の多重定義

R 比較条件 A、B C D
I32vec2 R select_eq
select_ne

I[s|u]32vec2

I[s|u]32vec2 I[s|u]32vec2
I16vec4 R

 

I[s|u]16vec4 I[s|u]16vec4
I8vec8 R

 

I[s|u]8vec8 I[s|u]8vec8
I32vec2 R select_gt
select_ge
select_lt
select_le

Is32vec2

Is32vec2 Is32vec2
I16vec4 R

 

Is16vec4 Is16vec4
I8vec8 R

 

Is8vec8 Is8vec8

次の表は、任意の要素数に対する R0 から R7 までの戻り値の対応表です。戻り値が 4 つ未満のときも、これと同じ戻り値の対応表を適用します。

条件付き選択演算子の戻り値の対応表

戻り値 オペランド A、B オペランド C、D
A0 使用できる演算子 B0
R0:= A0 == != > >= < <= B0 ? C0 : D0;
R1:= A0 == != > >= < <= B0 ? C1 : D1;
R2:= A0 == != > >= < <= B0 ? C2 : D2;
R3:= A0 == != > >= < <= B0 ? C3 : D3;
R4:= A0 == != > >= < <= B0 ? C4 : D4;
R5:= A0 == != > >= < <= B0 ? C5 : D5;
R6:= A0 == != > >= < <= B0 ? C6 : D6;
R7:= A0 == != > >= < <= B0 ? C7 : D7;