FCOM, FCOMP, FCOMPP

比较 浮点值

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
D8 /2FCOM m32fp有效有效比较ST(0)与m32fp.
DC /2FCOM m64fp有效有效比较ST(0)与m64fp.
D8 D0+iFCOM ST(i)有效有效比较ST(0)与ST(i).
D8 D1FCOM有效有效比较ST(0)与ST(1).
D8 /3FCOMP m32fp有效有效比较 ST( 0) 与 m32fp 和 pop 寄存器堆栈 。
DC /3FCOMP m64fp有效有效比较 ST( 0) 与 m64fp 和 流行寄存器堆栈 。
D8 D8+iFCOMP ST(i)有效有效比较 ST( 0) 与 ST( i) 和 pop 寄存器堆栈 。
D8 D9FCOMP有效有效比较ST(0)与ST(1)和流行寄存器堆栈.
DE D9FCOMPP有效有效将ST( 0) 与 ST(1) 和 Pop 寄存器堆栈比较两次.

实测开销

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

说明

比较寄存器ST(0)和源值的内容,并根据结果在FPU状态词中设置条件代码标记C0,C2和C3(见下表). 源操作数可以是数据寄存器或内存位置. 如果没有给出源操作数,则将ST(0)中的值与ST(1)中的值进行比较. 0的标志被忽略,因此0.0等于+0.0.

FCOM/FCOMP/FCOMPP 结果

条件C3C2C0
ST(0) > SRC000
ST(0) < SRC001
ST(0) = SRC100
无序*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 = NaN or unsupported format

    THEN

          #IA

        IF FPUControlWord.IM = 1

                THEN

                      C3, C2, C0 := 111;

          FI;

FI;

IF Instruction = FCOMP

    THEN

          PopRegisterStack;

FI;

IF Instruction = FCOMPP

    THEN
          PopRegisterStack;
          PopRegisterStack;

FI;

FPU Flags Affected

C1                  Set to 0.

C0, C2, C3          See table on previous page.

浮点 例外

#IS                 Stack underflow occurred.
#IA                 One or both operands are NaN values or have unsupported formats.

注册为空 。

#D                  One or both operands are denormal values.

异常

保护模式
#GP(0)如果 内存操作数 的有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,如果 DS,ES,FS,或 GS 注册簿中包含 NULL 段选择子.
#SS(0)如果 内存操作数 的有效地址在 SS 段限制之外。
#NMCR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。
实地址模式
#GP如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外.
#SS如果 内存操作数 的有效地址在 SS 段限制之外。
#NMCR0.EM[bit 2] 或 CR0.TS[bit 3] = 1.
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#GP(0)如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外.
#SS(0)如果 内存操作数 的有效地址在 SS 段限制之外。
#NMCR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误.
#AC(0)如果启用对齐检查, 并使用不对齐的内存引用 。
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非冠状的.
#NMCR0.EM[bit 2] 或 CR0.TS[bit 3] = 1.
#MF如果存在待决的x87 FPU例外. #PF(fault-code) 如果发生 页面错误.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。

来源