COMISS - 比較標量有序單精度浮點值並設定 EFLAGS

操作碼

指令

說明

0F 2F /r

COMISS xmm1, xmm2/m32

比較 xmm1xmm2/mem32 中的低位單精度浮點值,並相應設定 EFLAGS 標誌。

說明

比較源運算元 1(第一個運算元)與源運算元 2(第二個運算元)低位雙字中的單精度浮點值,並根據結果(無序、大於、小於或等於)設定 EFLAGS 暫存器中的 ZF、PF 及 CF 標誌。EFLAGS 暫存器中的 OF、SF 及 AF 標誌設定為 0。如果任何一個單精度浮點值是 NaN(QNaN 或 SNaN),則返回無序謂詞。

源運算元 1 是 XMM 暫存器;源運算元 2 可以是 XMM 暫存器或 32 位記憶體位置。

COMISS 指令與 UCOMISS 指令的不同在於,當源運算元是 QNaN 或 SNaN 時,COMISS 指令發出數值無效異常訊號。UCOMISS 指令僅當源運算元是 SNaN 時才發出無效訊號。

發生無掩碼 SIMD 浮點異常時,EFLAGS 暫存器不更新。

操作

RESULT OrderedCompare(SRC1[31-0] <> SRC2[31-0]) {
* Set EFLAGS *CASE (RESULT) OF
UNORDERED: ZF,PF,CF 111;
GREATER_THAN: ZF,PF,CF 000;
LESS_THAN: ZF,PF,CF 001;
EQUAL: ZF,PF,CF 100;
ESAC;
OF,AF,SF 0;

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

int_mm_comieq_ss(__m128 a, __m128 b) int_mm_comilt_ss(__m128 a, __m128 b)

int_mm_comile_ss(__m128 a, __m128 b) int_mm_comigt_ss(__m128 a, __m128 b)

int_mm_comige_ss(__m128 a, __m128 b) int_mm_comineq_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 功能標誌 SSE 為 0。

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

實地址模式異常

中斷 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(錯誤程式碼) - 頁錯誤。

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