FUCOM/FUCOMP/FUCOMPP - 無序比較實數

操作碼

指令

說明

DD E0+i

FUCOM ST(i)

比較 ST(0) 與 ST(i)

DD E1

FUCOM

比較 ST(0) 與 ST(1)

DD E8+i

FUCOMP ST(i)

比較 ST(0) 與 ST(i),並彈出暫存器堆疊

DD E9

FUCOMP

比較 ST(0) 與 ST(1),並彈出暫存器堆疊

DA E9

FUCOMPP

比較 ST(0) 與 ST(1),並彈出暫存器堆疊兩次。

說明

執行暫存器 ST(0) 與 ST(i) 內容的無序比較,根據結果設定 FPU 狀態字中的條件程式碼標誌 C0、C2、C3(請參閱下表)。如果未指定運算元,則比較暫存器 ST(0) 與 ST(1) 的內容。忽略 0 的符號,因此 -0.0 +0.0。

比較結果

C3

C2

C0

ST0 > ST(i)

0

0

0

ST0 < ST(i)

0

0

1

ST0 ST(i)

1

0

0

無序

1

1

1

備註

如果產生無掩碼算術操作無效 (#IA) 異常,則不設定標誌。

無序比較檢查要比較的數值的類別(請參閱 FXAM - 檢查)。FUCOM 指令執行的操作與 FCOM 指令的相同。唯一的差異在於,FUCOM 指令僅在一個或兩個運算元是 SNaN 或是不支援的格式時,才觸發算術運算元無效異常 (#IA);QNaN 導致將條件程式碼標誌設定為無序,但不導致產生異常。兩個運算元中至少有一個是任何種類的 NaN 值,或是不支援的格式時,FCOM 指令觸發操作無效異常。

跟 FCOM 指令一樣,如果操作導致觸發算術運算元無效異常,則僅當設定了該異常的掩碼時,才設定條件程式碼標誌。

執行比較操作之後,FUCOMP 指令彈出暫存器堆疊;執行比較操作之後,FUCOMPP 指令彈出暫存器堆疊兩次。爲了彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。

操作

CASE (relation of operands) OF
ST > SRC: C3, C2, C0 000;
ST < SRC: C3, C2, C0 001;
ST SRC: C3, C2, C0 100;
ESAC;
IF ST(0) or SRC QNaN, but not SNaN or unsupported format
THEN
C3, C2, C0 111;
ELSE (* ST(0) or SRC is SNaN or unsupported format *)
#IA;
IF FPUControlWord.IM 1
THEN
C3, C2, C0 111;
FI;
FI;
IF instruction FUCOMP
THEN
PopRegisterStack;
FI;
IF instruction FUCOMPP
THEN
PopRegisterStack;
PopRegisterStack;
FI;

影響的 FPU 標誌

C1 - 如果發生堆疊下溢,則設定為 0。

C0、C2、C3 - 請參閱上表。

浮點異常

#IS - 發生堆疊下溢。

#IA - 一個或兩個運算元是 SNaN 值,或是不支援的格式。在自己內部或檢測自己的 QNaN 值不觸發運算元無效異常。

#D - 一個運算元是,或兩個運算元都是非規格化值。

保護模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

實地址模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

虛 8086 模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。