CMPPD - 比較壓縮雙精度浮點值

操作碼

指令

說明

66 0F C2 /r ib

CMPPD xmm1, xmm2/m128,imm8

將 imm8 用作比較謂詞,比較 xmm2/m128 中的壓縮雙精度浮點值與 xmm1 中的壓縮雙精度浮點值。

說明

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

CMPPD 與 CMPPS 指令的比較謂詞

謂詞

imm8 編碼

說明

關係

模擬

運算元為 NaN 時的結果

QNaN 運算元發出無效訊號

eq

000B

等於

xmm1 == xmm2

 

lt

001B

小於

xmm1 < xmm2

 

le

010B

小於或等於

xmm1 <= xmm2

 

 

 

大於

xmm1 > xmm2

swap, protect, lt

 

 

大於或等於

xmm1 >= xmm2

swap protect, le

unord

011B

無序

xmm1 ? xmm2

 

neq

100B

不等於

!(xmm1 == xmm2)

 

nlt

101B

不小於

!(xmm1 < xmm2)

 

nle

110B

不小於或等於

!(xmm1 <= xmm2)

 

 

 

不大於

!(xmm1 > xmm2)

swap, protect, nlt

 

 

不大於或等於

!(xmm1 >= xmm2)

swap, protect, nle

ord

111B

有序

!(xmm1 ? xmm2)

 

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

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

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

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

 

偽操作

CMPPD 實現

CMPEQPD xmm1, xmm2

CMPPD xmm1, xmm2, 0

CMPLTPD xmm1, xmm2

CMPPD xmm1, xmm2, 1

CMPLEPD xmm1, xmm2

CMPPD xmm1, xmm2, 2

CMPUNORDPD xmm1, xmm2

CMPPD xmm1, xmm2, 3

CMPNEQPD xmm1, xmm2

CMPPD xmm1, xmm2, 4

CMPNLTPD xmm1, xmm2

CMPPD xmm1, xmm2, 5

CMPNLEPD xmm1, xmm2

CMPPD xmm1, xmm2, 6

CMPORDPD xmm1, xmm2

CMPPD 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[63-0] OP SRC[63-0];
CMP1 DEST[127-64] OP SRC[127-64];
IF CMP0 == TRUE
THEN DEST[63-0] FFFFFFFFFFFFFFFFH
ELSE DEST[63-0] 0000000000000000H; FI;
IF CMP1 == TRUE
THEN DEST[127-64] FFFFFFFFFFFFFFFFH
ELSE DEST[127-64] 0000000000000000H; FI;

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

CMPPD for equality __m128d _mm_cmpeq_pd(__m128d a, __m128d b)

CMPPD for less-than __m128d _mm_cmplt_pd(__m128d a, __m128d b)

CMPPD for less-than-or-equal __m128d _mm_cmple_pd(__m128d a, __m128d b)

CMPPD for greater-than __m128d _mm_cmpgt_pd(__m128d a, __m128d b)

CMPPD for greater-than-or-equal __m128d _mm_cmpge_pd(__m128d a, __m128d b)

CMPPD for inequality __m128d _mm_cmpneq_pd(__m128d a, __m128d b)

CMPPD for not-less-than __m128d _mm_cmpnlt_pd(__m128d a, __m128d b)

CMPPD for not-greater-than __m128d _mm_cmpngt_pd(__m128d a, __m128d b)

CMPPD for not-greater-than-or-equal __m128d _mm_cmpnge_pd(__m128d a, __m128d b)

CMPPD for ordered __m128d _mm_cmpord_pd(__m128d a, __m128d b)

CMPPD for unordered __m128d _mm_cmpunord_pd(__m128d a, __m128d b)

CMPPD for not-less-than-or-equal __m128d _mm_cmpnle_pd(__m128d a, __m128d b)

SIMD 浮點異常

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

保護模式異常

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

虛 8086 模式異常

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

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