FCOMI, FCOMIP, FUCOMI, FUCOMIP

比较 浮点值 和 设置 EFLAGS

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
DB F0+iFCOMI ST, ST(i)有效有效比较ST(0)与ST(i),并相应设置状态标志.
DF F0+iFCOMIP ST, ST(i)有效有效将 ST( 0) 与 ST( i) 相比较, 将 状态标志 设置为相应的, 并设置流行寄存器堆栈 。
DB E8+iFUCOMI ST, ST(i)有效有效比较 ST( 0) 和 ST( i), 检查命令值, 并相应设置 状态标志 。
DF E8+iFUCOMIP ST, ST(i)有效有效比较 ST( 0) 和 ST( i), 检查命令值, 相应设置 状态标志, 并设置流行寄存器堆栈 。

实测开销

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

说明

对ST(0)和ST(i)登记册的内容进行无序比较,并根据结果将状态标志 ZF,PF和CF设置在EFLAGS登记册中(见下表)。 比较时忽略了0的标志,因此0.0等于+0.0.

FCOMI/FCOMIP/FUCOMI/FUCOMIP 结果

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

IA-32 架构兼容性

FCOMI/FCOMIP/FUCOMI/FUCOMIP指令被引入到P6家族处理器的IA-32架构中,在早期的IA-32处理器中并不存在.

FCOMI/FCOMIP/FUCOMI/FUCOMIP-Compare 浮点值和设置EFLAGS.

行动

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;

FPU Flags Affected

C1                  Set to 0.

C0, C2, C3          Not affected.

浮点 例外

#IS                 Stack underflow occurred.
#IA                 (FCOMI or FCOMIP instruction) One or both operands are NaN values or have unsupported

formats.

(FUCOMI或FUCOMIP指令)一个或两个操作数都是SNaN值(但不是QNaNs)或者有未定义的格式. 检测 QNaN 值不会引起无效的- 操作数 例外 。

FCOMI/FCOMIP/FUCOMI/FUCOMIP-Compare 浮点值和设置EFLAGS.

异常

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

来源