FDIVR, FDIVRP, FIDIVR

反向分割

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
D8 /7FDIVR m32fp有效有效将m32fp除以ST(0),存储结果为ST(0).
DC /7FDIVR m64fp有效有效以 ST( 0) 除以 m64fp, 存储结果为 ST( 0) 。
D8 F8+iFDIVR ST(0), ST(i)有效有效以 ST( 0) 除以 ST( i), 存储结果为 ST( 0) 。
DC F0+iFDIVR ST(i), ST(0)有效有效由ST(i)除以ST(0),存储结果为ST(i).
DE F0+iFDIVRP ST(i), ST(0)有效有效以 ST( i) 除法 ST( 0) , 存储结果为 ST( i), 并弹出寄存器堆栈 。
DE F1FDIVRP有效有效由ST(1)除以ST(0),存储结果为ST(1),并弹出寄存器堆栈.
DA /7FIDIVR m32int有效有效由ST( 0) 除以m32int,存储结果为ST( 0) 。
DE /7FIDIVR m16int有效有效以 ST( 0) 除以 m16int, 存储结果为 ST( 0) 。

实测开销

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

说明

将 源操作数 除以 目标操作数 并将结果存储在目的地位置. 目标操作数(divisor)总是在FPU的登记册中;源操作数(dividend)可以是注册或内存位置. 内存中的源操作数可以是单精度或双精度浮点格式,单词或双词整数格式.

这些指令执行FDIV,FDIVP,和FIDIV指令的反向操作. 提供这些服务是为了支持更有效的编码。

无操作数版本的指令将ST(0)注册的内容除以ST(1)注册的内容. One-操作数版本将内存位置(或浮点或整数)的内容除以ST(0)寄存器的内容. 双操作数版本,将ST(i)注册的内容除以ST(0)注册的内容或反之.

FDIVRP指令在存储结果后执行附加操作,将FPU寄存堆栈弹出. 要弹出寄存器堆栈,处理器将ST(0)寄存器标记为空,并将 栈指针 (TOP) 递增为 1 。 无操作数版本的浮点分割指令总是导致寄存器堆栈被弹出. 在一些组装器中,这个指令的元音是FDIVR,而不是FDIVRP.

FIDIVR指令在进行分割前将整数源操作数转换成双倍扩展精度浮点格式.

如果生成一个未显示的除零例外(#Z),则不存储结果;如果该例外被掩盖,则将一个合适的符号存储在目标操作数中.

下表显示在划分各类数字时获得的结果,假设既不出现溢出,也不出现流量不足。

FDIVR/FDIVRP/FIDIVR 结果

SRC-F+0+F****-F-0纳恩
-I+0+F****-F-0纳恩
-0+0+0**-0-0纳恩
+0-0-0**+0+0纳恩
+I-0-F****+F+0纳恩
+F-0-F****+F+0纳恩
+*--++*纳恩
纳恩纳恩纳恩纳恩纳恩纳恩纳恩纳恩

行动

IF DEST = 0

    THEN
          #Z;

    ELSE

        IF Instruction = FIDIVR

                THEN
                      DEST := ConvertToDoubleExtendedPrecisionFP(SRC) / DEST;

                ELSE (* Source operand is floating-point value *)
                      DEST := SRC / DEST;

          FI;
FI;

IF Instruction = FDIVRP

    THEN
          PopRegisterStack;

FI;

FPU Flags Affected

C1                  Set to 0 if stack underflow occurred.

                    Set if result was rounded up; cleared otherwise.

C0, C2, C3          Undefined.

浮点 例外

#IS     Stack underflow occurred.
#IA     Operand is an SNaN value or unsupported format.

+/- / +/-; +/-0 / +/-0

#D      Source is a denormal value.
#Z      SRC / +/-0, where SRC is not equal to +/-0.
#U      Result is too small for destination format.
#O      Result is too large for destination format.
#P      Value cannot be represented exactly in destination format.

异常

保护模式
#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 前缀 。

来源