FCOMI, FCOMIP, FUCOMI, FUCOMIP
比较 浮点值 和 设置 EFLAGS
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
DB F0+i | FCOMI ST, ST(i) | 有效 | 有效 | 比较ST(0)与ST(i),并相应设置状态标志. | |
DF F0+i | FCOMIP ST, ST(i) | 有效 | 有效 | 将 ST( 0) 与 ST( i) 相比较, 将 状态标志 设置为相应的, 并设置流行寄存器堆栈 。 | |
DB E8+i | FUCOMI ST, ST(i) | 有效 | 有效 | 比较 ST( 0) 和 ST( i), 检查命令值, 并相应设置 状态标志 。 | |
DF E8+i | FUCOMIP 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 结果
| 比较结果* | ZF | PF | CF |
|---|---|---|---|
| ST0 > ST(i) | 0 | 0 | 0 |
| ST0 < ST(i) | 0 | 0 | 1 |
| ST0 = ST(i) | 1 | 0 | 0 |
| 无序** | 1 | 1 | 1 |
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 unsupportedformats.
(FUCOMI或FUCOMIP指令)一个或两个操作数都是SNaN值(但不是QNaNs)或者有未定义的格式. 检测 QNaN 值不会引起无效的- 操作数 例外 。
FCOMI/FCOMIP/FUCOMI/FUCOMIP-Compare 浮点值和设置EFLAGS.
异常
保护模式
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#MF | 如果存在待决的x87 FPU例外. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
| 与保护模式中的例外相同. |
虚拟 8086 模式
| 与保护模式中的例外相同. |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
| 与保护模式中的例外相同. |