FUCOM, FUCOMP, FUCOMPP

无序比较 浮点值

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
DD E0+iFUCOM ST(i)有效有效比较ST(0)与ST(i).
DD E1FUCOM有效有效比较ST(0)与ST(1).
DD E8+iFUCOMP ST(i)有效有效比较 ST( 0) 与 ST( i) 和 pop 寄存器堆栈 。
DD E9FUCOMP有效有效比较ST(0)与ST(1)和流行寄存器堆栈.
DA E9FUCOMPP有效有效将ST( 0) 与 ST(1) 和 Pop 寄存器堆栈比较两次.

实测开销

正在从 arch-data 加载实测数据...

说明

对寄存器ST(0)和ST(i)的内容进行无序比较,并根据结果在FPU状态单词中设置条件代号C0,C2和C3(见下表). 如果未指定操作数,则比较ST(0)和ST(1)登记册的内容。 0的标志被忽略,因此0.0等于+0.0.

FUCOM/FUCOMP/FUCOMPP 结果

比较结果*C3C2C0
ST0 > ST(i)000
ST0 < ST(i)001
ST0 = ST(i)100
无序111

行动

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;

FI;

FPU Flags Affected

C1                  Set to 0 if stack underflow occurred.

C0, C2, C3          See Table 3-43.

浮点 例外

#IS                 Stack underflow occurred.
#IA                 One or both operands are SNaN values or have unsupported formats. Detection of a QNaN

值本身不会提出无效的- 操作数 例外。

#D                  One or both operands are denormal values.

异常

保护模式
#NMCR0.EM[bit 2] 或 CR0.TS[bit 3] = 1.
#MF如果存在待决的x87 FPU例外.
#UD如果使用 LOCK 前缀 。
实地址模式
与保护模式中的例外相同.
虚拟 8086 模式
与保护模式中的例外相同.
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源