比較演算子

このセクションでは、AB の単精度浮動小数点値を比較する演算子について説明します。Fvec クラスのオブジェクト同士を比較した場合は、比較されたオブジェクトと同じクラスで戻り値が返ってきます。

次の表は、Fvec クラスの比較演算子を示したものです。

比較演算子と対応する組み込み関数

比較の条件 演算子 構文
等しい cmpeq R = cmpeq(A, B)
等しくない cmpneq R = cmpneq(A, B)
より大きい cmpgt R = cmpgt(A, B)
以上 cmpge R = cmpge(A, B)
より大きくない cmpngt R = cmpngt(A, B)
以上でない cmpnge R = cmpnge(A, B)
より小さい cmplt R = cmplt(A, B)
以下 cmple R = cmple(A, B)
より小さくない cmpnlt R = cmpnlt(A, B)
以下でない cmpnle R = cmpnle(A, B)

比較演算子

比較した結果が真の場合、そのマスクは浮動小数点値ごとに 0xffffffff にセットされます。同様に、偽の場合は 0x00000000 にセットされます。次の表は、比較演算子のクラスごとに戻り値を列挙したものです。「戻り値の表記法」の前半に述べた構文が使われます。

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

R A0 任意の演算子 B 真の場合 偽の場合 F32vec4 F64vec2 F32vec1
R0:= (A1
!(A1
cmp[eq | lt | le | gt | ge]
cmp[ne | nlt | nle | ngt | nge]
B1)
B1)
0xffffffff 0x0000000 X X X
R1:= (A1
!(A1
cmp[eq | lt | le | gt | ge]
cmp[ne | nlt | nle | ngt | nge]
B2)
B2)
0xffffffff 0x0000000
 
X X N/A
R2:= (A1
!(A1
cmp[eq | lt | le | gt | ge]
cmp[ne | nlt | nle | ngt | nge]
B3)
B3)
0xffffffff 0x0000000
 
X N/A N/A
R3:= A3 cmp[eq | lt | le | gt | ge]
cmp[ne | nlt | nle | ngt | nge]
B3)
B3)
0xffffffff 0x0000000
 
X N/A N/A

次の表に、比較演算と組み込み関数の例をいくつか示します。

Fvec クラスの比較演算

戻り値 構文の使用例 組み込み関数
等しいかどうかの比較
4 float F32vec4 R = cmpeq(F32vec4 A); _mm_cmpeq_ps
2 double F64vec2 R = cmpeq(F64vec2 A); _mm_cmpeq_pd
1 float F32vec1 R = cmpeq(F32vec1 A); _mm_cmpeq_ss
等しくないかどうかの比較
4 float F32vec4 R = cmpneq(F32vec4 A); _mm_cmpneq_ps
2 double F64vec2 R = cmpneq(F64vec2 A); _mm_cmpneq_pd
1 float F32vec1 R = cmpneq(F32vec1 A); _mm_cmpneq_ss
より小さいかどうかの比較
4 float F32vec4 R = cmplt(F32vec4 A); _mm_cmplt_ps
2 double F64vec2 R = cmplt(F64vec2 A); _mm_cmplt_pd
1 float F32vec1 R = cmplt(F32vec1 A); _mm_cmplt_ss
以下かどうかの比較
4 float F32vec4 R = cmple(F32vec4 A); _mm_cmple_ps
2 double F64vec2 R = cmple(F64vec2 A); _mm_cmple_pd
1 float F32vec1 R = cmple(F32vec1 A); _mm_cmple_pd
より大きいかどうかの比較
4 float F32vec4 R = cmpgt(F32vec4 A); _mm_cmpgt_ps
2 double F64vec2 R = cmpgt(F32vec42 A); _mm_cmpgt_pd
1 float F32vec1 R = cmpgt(F32vec1 A); _mm_cmpgt_ss
以上かどうかの比較
4 float F32vec4 R = cmpge(F32vec4 A); _mm_cmpge_ps
2 double F64vec2 R = cmpge(F64vec2 A); _mm_cmpge_pd
1 float F32vec1 R = cmpge(F32vec1 A); _mm_cmpge_ss
より小さくないかどうかの比較
4 float F32vec4 R = cmpnlt(F32vec4 A); _mm_cmpnlt_ps
2 double F64vec2 R = cmpnlt(F64vec2 A); _mm_cmpnlt_pd
1 float F32vec1 R = cmpnlt(F32vec1 A); _mm_cmpnlt_ss
以下でないかどうかの比較
4 float F32vec4 R = cmpnle(F32vec4 A); _mm_cmpnle_ps
2 double F64vec2 R = cmpnle(F64vec2 A); _mm_cmpnle_pd
1 float F32vec1 R = cmpnle(F32vec1 A); _mm_cmpnle_ss
より大きくないかどうかの比較
4 float F32vec4 R = cmpngt(F32vec4 A); _mm_cmpngt_ps
2 double F64vec2 R = cmpngt(F64vec2 A); _mm_cmpngt_pd
1 float F32vec1 R = cmpngt(F32vec1 A); _mm_cmpngt_ss
以上でないかどうかの比較
4 float F32vec4 R = cmpnge(F32vec4 A); _mm_cmpnge_ps
2 double F64vec2 R = cmpnge(F64vec2 A); _mm_cmpnge_pd
1 float F32vec1 R = cmpnge(F32vec1 A); _mm_cmpnge_ss