条件付き選択演算子

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

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

/* Return the nearest common ancestor data type if third and fourth operands are of the same size, but different signs */

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

/* Conditional Select for Equality */

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

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

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

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

/* Conditional Select for Inequality */

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

 

より大きい
or Equal To
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

 


or Equal To
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 I[s|u]16vec4
I8vec8 R

 

I[s|u]8vec8 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 Is16vec4
I8vec8 R

 

Is8vec8 Is8vec8 Is8vec8

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

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

戻り値 オペランド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;