CMPPS - 比較壓縮單精度浮點值

操作碼

指令

說明

0F C2 /r ib

CMPPS xmm1, xmm2/m128, imm8

imm8 用作比較謂詞,對 xmm2/mem 中的壓縮單精度浮點值與 xmm1 中的壓縮單精度浮點值執行比較。

說明

對源運算元(第二個運算元)與目標運算元(第一個運算元)中的四個壓縮單精度浮點值執行 SIMD 比較,並將比較結果返回給目標運算元。比較謂詞運算元(第三個運算元)指定要在每對壓縮值上執行的比較型別。比較結果是四個全 1(比較結果為真)或全 0(比較結果為假)雙字掩碼。源運算元可以是 XMM 暫存器或 128 位記憶體位置。目標運算元是 XMM 暫存器。比較謂詞運算元是一個 8 位立即數,其中頭 3 位定義要執行的比較型別(請參閱 CMPPD 與 CMPPS 指令的比較謂詞);立即數的位 4 到 7 保留。

由於全 0 掩碼對應浮點值 +0.0,全 1 掩碼對應浮點值 QNaN,因此如果隨後的計算型指令將目標運算元中的掩碼結果用作輸入運算元,並不會產生錯誤。

有些比較(如大於、大於或等於、不大於、不大於或等於關係)只能通過軟體模擬來實現。對於這些比較,程式設計師必須交換運算元,在必要時通過複製暫存器來保護正在目標暫存器中的數據,然後使用不同的謂詞執行比較。用於這些模擬的謂詞在標題“模擬”下列出。

編譯器與彙編器除實現三運算元 CMPPS 指令之外,還可能實現以下雙運算元偽操作:

偽操作

實現

CMPEQPS xmm1, xmm2

CMPPS xmm1, xmm2, 0

CMPLTPS xmm1, xmm2

CMPPS xmm1, xmm2, 1

CMPLEPS xmm1, xmm2

CMPPS xmm1, xmm2, 2

CMPUNORDPS xmm1, xmm2

CMPPS xmm1, xmm2, 3

CMPNEQPS xmm1, xmm2

CMPPS xmm1, xmm2, 4

CMPNLTPS xmm1, xmm2

CMPPS xmm1, xmm2, 5

CMPNLEPS xmm1, xmm2

CMPPS xmm1, xmm2, 6

CMPORDPS xmm1, xmm2

CMPPS xmm1, xmm2, 7

大於關係不在硬體中實現,在軟體中模擬這些關係時需要多條指令,因此應該作為偽操作來實現。(對於這些關係,程式設計師應該反向使用相應的小於關係的運算元,並使用移動指令確保將掩碼移到正確的目標暫存器,並確保源運算元保持不變)。

操作

CASE (COMPARISON PREDICATE) OF
0: OP EQ;
1: OP LT;
2: OP LE;
3: OP UNORD;
4: OP NE;
5: OP NLT;
6: OP NLE;
7: OP ORD;
EASC
CMP0 DEST[31-0] OP SRC[31-0];
CMP1 DEST[63-32] OP SRC[63-32];
CMP2 DEST [95-64] OP SRC[95-64];
CMP3 DEST[127-96] OP SRC[127-96];
IF CMP0 == TRUE
THEN DEST[31-0] FFFFFFFFH
ELSE DEST[31-0] 00000000H; FI;
IF CMP1 == TRUE
THEN DEST[63-32] FFFFFFFFH
ELSE DEST[63-32] 00000000H; FI;
IF CMP2 == TRUE
THEN DEST95-64] FFFFFFFFH
ELSE DEST[95-64] 00000000H; FI;
IF CMP3 == TRUE
THEN DEST[127-96] FFFFFFFFH
ELSE DEST[127-96] 00000000H; FI;

英特爾(R) C++ 編譯器等價內部函式

CMPPS for equality __m128 _mm_cmpeq_ps(__m128 a, __m128 b)

CMPPS for less-than __m128 _mm_cmplt_ps(__m128 a, __m128 b)

CMPPS for less-than-or-equal __m128 _mm_cmple_ps(__m128 a, __m128 b)

CMPPS for greater-than __m128 _mm_cmpgt_ps(__m128 a, __m128 b)

CMPPS for greater-than-or-equal __m128 _mm_cmpge_ps(__m128 a, __m128 b)

CMPPS for inequality __m128 _mm_cmpneq_ps(__m128 a, __m128 b)

CMPPS for not-less-than __m128 _mm_cmpnlt_ps(__m128 a, __m128 b)

CMPPS for not-greater-than __m128 _mm_cmpngt_ps(__m128 a, __m128 b)

CMPPS for not-greater-than-or-equal __m128 _mm_cmpnge_ps(__m128 a, __m128 b)

CMPPS for ordered __m128 _mm_cmpord_ps(__m128 a, __m128 b)

CMPPS for unordered __m128 _mm_cmpunord_ps(__m128 a, __m128 b)

CMPPS for not-less-than-or-equal __m128 _mm_cmpnle_ps(__m128 a, __m128 b)

SIMD 浮點異常

運算元為 SNaN 時無效、非規格化。

保護模式異常

#GP(0) - CS、DS、ES、FS 或 GS 段中的記憶體運算元有效地址非法。如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。

#SS(0) - SS 段中的地址非法。

#PF(錯誤程式碼) - 頁錯誤。

#NM - 如果 CR0 中的 TS 設定為 1。

#XM - 如果發生無掩碼 SIMD 浮點異常,且 CR4 中的 OSXMMEXCPT 是 1。

#UD - 如果發生無掩碼 SIMD 浮點異常,且 CR4 中的 OSXMMEXCPT 是 0。如果 CR0 中的 EM 設定為 1。如果 CR4 中的 OSFXSR 是 0。如果 CPUID 功能標誌 SSE 為 0。

實地址模式異常

#GP(0) - 如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。中斷 13 - 如果運算元的任何部分出現在從 0 到 0FFFFH 的有效地址空間之外。

#NM - 如果 CR0 中的 TS 設定為 1。

#XM - 如果發生無掩碼 SIMD 浮點異常,且 CR4 中的 OSXMMEXCPT 是 1。

#UD - 如果發生無掩碼 SIMD 浮點異常,且 CR4 中的 OSXMMEXCPT 是 0。如果 CR0 中的 EM 設定為 1。如果 CR4 中的 OSFXSR 是 0。如果 CPUID 功能標誌 SSE 為 0。

虛 8086 模式異常

與“實地址模式”中的異常相同。

#PF(錯誤程式碼) - 頁錯誤。