CMPSS - 比較標量單精度浮點值

操作碼

指令

說明

F3 0F C2 /r ib

CMPSS xmm1, xmm2/m32, imm8

imm8 用作比較謂詞,比較 xmm2/m32 中的低位單精度浮點值與 xmm1 中的低位單精度浮點值。

說明

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

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

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

請注意,大於、大於或等於、不大於,以及不大於或等於關係不是在硬體中直接實現。

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

偽操作

CMPSS 實現

CMPEQSS xmm1, xmm2

CMPSS xmm1, xmm2, 0

CMPLTSS xmm1, xmm2

CMPSS xmm1, xmm2, 1

CMPLESS xmm1, xmm2

CMPSS xmm1, xmm2, 2

CMPUNORDSS xmm1, xmm2

CMPSS xmm1, xmm2, 3

CMPNEQSS xmm1, xmm2

CMPSS xmm1, xmm2, 4

CMPNLTSS xmm1, xmm2

CMPSS xmm1, xmm2, 5

CMPNLESS xmm1, xmm2

CMPSS xmm1, xmm2, 6

CMPORDSS xmm1, xmm2

CMPSS xmm1, xmm2, 7

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

操作

CASE (COMPARISON PREDICATE) OF
0: OP EQ;
1: OP LT;
2: OP LE;
3: OP UNORD;
4: OP NEQ;
5: OP NLT;
6: OP NLE;
7: OP ORD;
DEFAULT: Reserved;
CMP0 DEST[31-0] OP SRC[31-0];
IF CMP0 == TRUE
THEN DEST[31-0] FFFFFFFFH
ELSE DEST[31-0] 00000000H; FI;
* DEST[127-32] remains unchanged *;

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

CMPSS for equality __m128 _mm_cmpeq_ss(__m128 a, __m128 b)

CMPSS for less-than __m128 _mm_cmplt_ss(__m128 a, __m128 b)

CMPSS for less-than-or-equal __m128 _mm_cmple_ss(__m128 a, __m128 b)

CMPSS for greater-than __m128 _mm_cmpgt_ss(__m128 a, __m128 b)

CMPSS for greater-than-or-equal __m128 _mm_cmpge_ss(__m128 a, __m128 b)

CMPSS for inequality __m128 _mm_cmpneq_ss(__m128 a, __m128 b)

CMPSS for not-less-than __m128 _mm_cmpnlt_ss(__m128 a, __m128 b)

CMPSS for not-greater-than __m128 _mm_cmpngt_ss(__m128 a, __m128 b)

CMPSS for not-greater-than-or-equal __m128 _mm_cmpnge_ss(__m128 a, __m128 b)

CMPSS for ordered __m128 _mm_cmpord_ss(__m128 a, __m128 b)

CMPSS for unordered __m128 _mm_cmpunord_ss(__m128 a, __m128 b)

CMPSS for not-less-than-or-equal __m128 _mm_cmpnle_ss(__m128 a, __m128 b)

SIMD 浮點異常

運算元為 SNaN 時無效、按上表所示使用 QNaN 與謂詞時無效、非規格化。

保護模式異常

#GP(0) - CS、DS、ES、FS 或 GS 段中的記憶體運算元有效地址非法。

#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 功能標誌 SSE2 是 0。

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#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 功能標誌 SSE2 是 0。

虛 8086 模式異常

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

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

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。