操作碼 |
指令 |
說明 |
F2 0F C2 /r ib |
CMPSD xmm1, xmm2/m64, imm8 |
將 imm8 用作比較謂詞,比較 xmm2/m64 中的低位雙精度浮點值與 xmm1 中的低位雙精度浮點值。 |
比較源運算元(第二個運算元)與目標運算元(第一個運算元)中的低位雙精度浮點值,並將比較結果返回給目標運算元。比較謂詞運算元(第三個運算元)指定要在每對壓縮值上執行的比較型別。比較結果是一個全 1(比較結果為真)或全 0(比較結果為假)的四字掩碼。源運算元可以是 XMM 暫存器或 64 位記憶體位置。目標運算元是 XMM 暫存器。結果儲存到目標運算元的低位四字;高位四字保持不變。比較謂詞運算元是一個 8 位立即數,其中頭 3 位定義要執行的比較型別(請參閱 CMPPD 與 CMPPS 指令的比較謂詞);立即數的位 4 到 7 保留。
請注意,由於全 0 掩碼對應浮點值 +0.0,全 1 掩碼對應浮點值 -QNaN,因此如果隨後的計算型指令將目標運算元中的掩碼結果用作輸入運算元,並不會產生錯誤。
有些比較只能通過軟體模擬來實現。對於這些比較,程式設計師必須交換運算元,在必要時通過複製暫存器來保護正在目標暫存器中的數據,然後使用不同的謂詞執行比較。用於這些模擬的謂詞在標題“模擬”下列出。
請注意,大於、大於或等於、不大於,以及不大於或等於關係不是在硬體中直接實現。
除三運算元 CMPSD 指令之外,編譯器與彙編器還可能會實現以下雙運算元偽操作。
偽操作 |
實現 |
CMPEQSD xmm1, xmm2 |
CMPSD xmm1,xmm2, 0 |
CMPLTSD xmm1, xmm2 |
CMPSD xmm1,xmm2, 1 |
CMPLESD xmm1, xmm2 |
CMPSD xmm1,xmm2, 2 |
CMPUNORDSD xmm1, xmm2 |
CMPSD xmm1,xmm2, 3 |
CMPNEQSD xmm1, xmm2 |
CMPSD xmm1,xmm2, 4 |
CMPNLTSD xmm1, xmm2 |
CMPSD xmm1,xmm2, 5 |
CMPNLESD xmm1, xmm2 |
CMPSD xmm1,xmm2, 6 |
CMPORDSD xmm1, xmm2 |
CMPSD 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];
IF CMP0 == TRUE
THEN DEST[63-0] FFFFFFFFFFFFFFFFH
ELSE DEST[63-0] 0000000000000000H; FI;
* DEST[127-64] remains unchanged *;
CMPSD for equality __m128d _mm_cmpeq_sd(__m128d a, __m128d b)
CMPSD for less-than __m128d _mm_cmplt_sd(__m128d a, __m128d b)
CMPSD for less-than-or-equal __m128d _mm_cmple_sd(__m128d a, __m128d b)
CMPSD for greater-than __m128d _mm_cmpgt_sd(__m128d a, __m128d b)
CMPSD for greater-than-or-equal __m128d _mm_cmpge_sd(__m128d a, __m128d b)
CMPSD for inequality __m128d _mm_cmpneq_sd(__m128d a, __m128d b)
CMPSD for not-less-than __m128d _mm_cmpnlt_sd(__m128d a, __m128d b)
CMPSD for not-greater-than __m128d _mm_cmpngt_sd(__m128d a, __m128d b)
CMPSD for not-greater-than-or-equal __m128d _mm_cmpnge_sd(__m128d a, __m128d b)
CMPSD for ordered __m128d _mm_cmpord_sd(__m128d a, __m128d b)
CMPSD for unordered __m128d _mm_cmpunord_sd(__m128d a, __m128d b)
CMPSD for not-less-than-or-equal __m128d _mm_cmpnle_sd(__m128d a, __m128d b)
運算元為 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。
與“實地址模式”中的異常相同。
#PF(錯誤程式碼) - 頁錯誤。
#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。