操作碼 |
指令 |
說明 |
DB F0+i |
FCOMI ST, ST(i) |
比較 ST(0) 與 ST(i),並相應設定狀態標誌。 |
DF F0+i |
FCOMIP ST, ST(i) |
比較 ST(0) 與 ST(i),相應設定狀態標誌,並彈出暫存器堆疊 |
DB E8+i |
FUCOMI ST, ST(i) |
比較 ST(0) 與 ST(i),檢查有序值,並相應設定狀態標誌。 |
DF E8+i |
FUCOMIP ST, ST(i) |
比較 ST(0) 與 ST(i),檢查有序值,相應設定狀態標誌,並彈出暫存器堆疊。 |
比較暫存器 ST(0) 與 ST(i) 的內容,根據結果設定 EFLAGS 暫存器中的狀態標誌 ZF、PF 及 CF(請參閱下表)。比較時忽略 0 的符號,因此 -0.0 +0.0。
比較結果 |
ZF |
PF |
CF |
ST0 > ST(i) |
0 |
0 |
0 |
ST0 < ST(i) |
0 |
0 |
1 |
ST0 ST(i) |
1 |
0 |
0 |
無序* |
1 |
1 |
1 |
備註:*如果產生無掩碼算術運算元無效 (#IA) 異常,則不設定標誌。
FCOMI/FCOMIP 指令執行的操作與 FUCOMI/FUCOMIP 指令相同。唯一的區別在於處理 QNaN 運算元的方式。有一個運算元是,或兩個運算元都是 NaN 值(SNaN 或 QNaN),或是不支援的格式時,FCOMI/FCOMIP 指令將狀態標誌設定為“無序”,並產生算術運算元無效異常 (#IA)。
FUCOMI/FUCOMIP 指令執行的操作與 FCOMI/FCOMIP 指令相同,只是它們不會針對 QNaN 產生算術運算元無效異常。如需有關無序比較的詳細資訊,請參閱本章中的 FXAM - 檢查。
如果未遮蔽操作無效異常,則產生算術運算元無效異常時不設定狀態標誌。
在執行比較操作之後,FCOMIP 與 FUCOMIP 指令也會彈出暫存器堆疊。要彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。
FCOMI/FCOMIP 與 FUCOMI/FUCOMIP 指令清除 EFLAGS 暫存器中的 OF 標誌(不論是否檢測到操作無效異常)。
FCOMI/FCOMIP/FUCOMI/FUCOMIP 指令在“英特爾(R) 體系結構”的奔騰(R) Pro 處理器系列中引入,早期的“英特爾(R) 體系結構”處理器不提供這些指令。
CASE (relation of operands) OF
ST(0) > ST(i): ZF, PF, CF 000;
ST(0) < ST(i): ZF, PF, CF 001;
ST(0) ST(i): ZF, PF, CF 100;
ESAC;
IF instruction is FCOMI or FCOMIP
THEN
IF ST(0) or ST(i) NaN or unsupported format
THEN
#IA
IF FPUControlWord.IM 1
THEN
ZF, PF, CF 111;
FI;
FI;
FI;
IF instruction is FUCOMI or FUCOMIP
THEN
IF ST(0) or ST(i) QNaN, but not SNaN or unsupported format
THEN
ZF, PF, CF 111;
ELSE (* ST(0) or ST(i) is SNaN or unsupported format *)
#IA;
IF FPUControlWord.IM 1
THEN
ZF, PF, CF 111;
FI;
FI;
FI;
IF instruction is FCOMIP or FUCOMIP
THEN
PopRegisterStack;
FI;
C1 - 如果發生堆疊下溢,則設定為 0;否則清除為 0。
C0、C2、C3 - 不受影響。
#IS - 發生堆疊下溢。
#IA(FCOMI 或 FCOMIP 指令) - 一個運算元是 NaN 值、兩個運算元都是 NaN 值、或是不支援的格式。(FUCOMI 或 FUCOMIP 指令)- 一個運算元是,或兩個運算元都是 SNaN 值(但不是 QNaN),或是未定義的格式。檢測到 QNaN 值時不觸發運算元無效異常。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。