Fvec クラスの条件付き選択演算子

各条件付き関数は、単精度浮動小数点値である A と B を比較します。パラメータ C、D は戻り値に使用されます。Fvec クラスのオブジェクト同士を比較したときの戻り値のデータ型は、比較したオブジェクトと同じデータ型になります。

Fvec クラスの条件付き選択演算子

条件付き選択の条件 演算子 構文
等しい select_eq R = select_eq(A, B)
等しくない select_neq R = select_neq(A, B)
より大きい select_gt R = select_gt(A, B)
以上 select_ge R = select_ge(A, B)
より大きくない select_gt R = select_gt(A, B)
以上でない select_ge R = select_ge(A, B)
より小さい select_lt R = select_lt(A, B)
以下 select_le R = select_le(A, B)
より小さくない select_nlt R = select_nlt(A, B)
以下でない select_nle R = select_nle(A, B)

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

条件付き選択演算子では、比較結果が真の場合は戻り値が C に格納され、偽の場合は D に格納されます。次の表は、条件付き選択演算子のクラスごとに戻り値を列挙したものです。「戻り値の表記法」の前半に述べた構文が使われます。

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

R A0 演算子 B C D F32vec4 F64vec2 F32vec1
R0:= (A1
!(A1
select_[eq | lt | le | gt | ge]
select_[ne | nlt | nle | ngt | nge]
B0)
B0)
C0
C0
D0
D0
X X X
R1:= (A2
!(A2
select_[eq | lt | le | gt | ge]
select_[ne | nlt | nle | ngt | nge]
B1)
B1)
C1
C1
D1
D1
X X N/A
R2:= (A2
!(A2
select_[eq | lt | le | gt | ge]
select_[ne | nlt | nle | ngt | nge]
B2)
B2)
C2
C2
D2
D2
X N/A N/A
R3:= (A3
!(A3
select_[eq | lt | le | gt | ge]
select_[ne | nlt | nle | ngt | nge]
B3)
B3)
C3
C3
D3
D3
X N/A N/A

次の表に、条件付き選択演算および対応する組込み関数の例をいくつか示します。

Fvec クラスの条件付き選択演算

戻り値 構文の使用例 組込み関数
等しいかどうかの比較
4 float F32vec4 R = select_eq(F32vec4 A); _mm_cmpeq_ps
2 double F64vec2 R = select_eq(F64vec2 A); _mm_cmpeq_pd
1 float F32vec1 R = select_eq(F32vec1 A); _mm_cmpeq_ss
等しくないかどうかの比較
4 float F32vec4 R = select_neq(F32vec4 A); _mm_cmpneq_ps
2 double F64vec2 R = select_neq(F64vec2 A); _mm_cmpneq_pd
1 float F32vec1 R = select_neq(F32vec1 A); _mm_cmpneq_ss
より小さいかどうかの比較
4 float F32vec4 R = select_lt(F32vec4 A); _mm_cmplt_ps
2 double F64vec2 R = select_lt(F64vec2 A); _mm_cmplt_pd
1 float F32vec1 R = select_lt(F32vec1 A); _mm_cmplt_ss
以下かどうかの比較
4 float F32vec4 R = select_le(F32vec4 A); _mm_cmple_ps
2 double F64vec2 R = select_le(F64vec2 A); _mm_cmple_pd
1 float F32vec1 R = select_le(F32vec1 A); _mm_cmple_ps
より大きいかどうかの比較
4 float F32vec4 R = select_gt(F32vec4 A); _mm_cmpgt_ps
2 double F64vec2 R = select_gt(F64vec2 A); _mm_cmpgt_pd
1 float F32vec1 R = select_gt(F32vec1 A); _mm_cmpgt_ss
以上かどうかの比較
4 float F32vec1 R = select_ge(F32vec4 A); _mm_cmpge_ps
2 double F64vec2 R = select_ge(F64vec2 A); _mm_cmpge_pd
1 float F32vec1 R = select_ge(F32vec1 A); _mm_cmpge_ss
より小さくないかどうかの比較
4 float F32vec1 R = select_nlt(F32vec4 A); _mm_cmpnlt_ps
2 double F64vec2 R = select_nlt(F64vec2 A); _mm_cmpnlt_pd
1 float F32vec1 R = select_nlt(F32vec1 A); _mm_cmpnlt_ss
以下でないかどうかの比較
4 float F32vec1 R = select_nle(F32vec4 A); _mm_cmpnle_ps
2 double F64vec2 R = select_nle(F64vec2 A); _mm_cmpnle_pd
1 float F32vec1 R = select_nle(F32vec1 A); _mm_cmpnle_ss
より大きくないかどうかの比較
4 float F32vec1 R = select_ngt(F32vec4 A); _mm_cmpngt_ps
2 double F64vec2 R = select_ngt(F64vec2 A); _mm_cmpngt_pd
1 float F32vec1 R = select_ngt(F32vec1 A); _mm_cmpngt_ss
以上でないかどうかの比較
4 float F32vec1 R = select_nge(F32vec4 A); _mm_cmpnge_ps
2 double F64vec2 R = select_nge(F64vec2 A); _mm_cmpnge_pd
1 float F32vec1 R = select_nge(F32vec1 A); _mm_cmpnge_ss