FCOM, FCOMP, FCOMPP
比较 浮点值
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
D8 /2 | FCOM m32fp | 有效 | 有效 | 比较ST(0)与m32fp. | |
DC /2 | FCOM m64fp | 有效 | 有效 | 比较ST(0)与m64fp. | |
D8 D0+i | FCOM ST(i) | 有效 | 有效 | 比较ST(0)与ST(i). | |
D8 D1 | FCOM | 有效 | 有效 | 比较ST(0)与ST(1). | |
D8 /3 | FCOMP m32fp | 有效 | 有效 | 比较 ST( 0) 与 m32fp 和 pop 寄存器堆栈 。 | |
DC /3 | FCOMP m64fp | 有效 | 有效 | 比较 ST( 0) 与 m64fp 和 流行寄存器堆栈 。 | |
D8 D8+i | FCOMP ST(i) | 有效 | 有效 | 比较 ST( 0) 与 ST( i) 和 pop 寄存器堆栈 。 | |
D8 D9 | FCOMP | 有效 | 有效 | 比较ST(0)与ST(1)和流行寄存器堆栈. | |
DE D9 | FCOMPP | 有效 | 有效 | 将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 结果
| 条件 | C3 | C2 | C0 |
|---|---|---|---|
| ST(0) > SRC | 0 | 0 | 0 |
| ST(0) < SRC | 0 | 0 | 1 |
| ST(0) = SRC | 1 | 0 | 0 |
| 无序* | 1 | 1 | 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 = 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 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#MF | 如果存在待决的x87 FPU例外. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |