FADD, FADDP, FIADD

添加

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
D8 /0FADD m32fp有效有效将m32fp添加到ST(0)中,存储结果为ST(0).
DC /0FADD m64fp有效有效将m64fp添加到ST(0)中,存储结果为ST(0).
D8 C0+iFADD ST(0), ST(i)有效有效在ST(i)中添加ST(0),存储结果为ST(0).
DC C0+iFADD ST(i), ST(0)有效有效在ST(0)中加入ST(i),存储结果为ST(i).
DE C0+iFADDP ST(i), ST(0)有效有效在ST(i)中添加ST(0),存储结果为ST(i),并弹出寄存器堆栈.
DE C1FADDP有效有效在ST(1)中添加ST(0),存储结果为ST(1),并弹出寄存器堆栈.
DA /0FIADD m32int有效有效将m32int添加到ST(0)中,存储结果为ST(0).
DE /0FIADD m16int有效有效在 ST( 0) 中添加 m16int 并存储结果为 ST( 0) 。

实测开销

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

说明

添加目的地和 源操作数,并将总和存储在目的地位置. 目标操作数始终是一个FPU的登记册;源操作数可以是一个登记册或内存位置. 内存中的源操作数可以是单精度或双精度浮点格式,也可以是单词或双词整数格式.

无操作数版本的指令将ST(0)注册的内容添加到ST(1)注册中. Oneoperand版本将内存位置(或浮点或整数)的内容添加到ST(0)寄存器的内容中. 双操作数版本,将ST(0)注册的内容加入ST(i)注册或反之. ST( 0) 中的值可以通过编码加倍:

FADD ST(0), ST(0);

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

FIADD指令将整数源操作数转换成双倍扩展精度浮点格式后再执行添加.

下页的表格显示在增加各类数字时获得的结果,假设既不溢出也不流出。

当两个反向标志的操作数的总和为0时,结果为+0,但向-模式方向的回合除外,在这种情况下,结果为-0. 源操作数为整数0时,作为+0处理.

当两个操作数都是同一标志的无限时,结果就是预期的标志. 如果两个操作数都是无限的反向标志,则生成无效操作例外. 见表3-20。

FADD/FADDP/FIADD 结果

- F or - I--FSRCSRC+/- F or+/-0+纳恩
-0-DEST-0+/-0DEST+NaN

行动

IF Instruction = FIADD

    THEN
          DEST := DEST + ConvertToDoubleExtendedPrecisionFP(SRC);

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

FI;

IF Instruction = FADDP

    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.

操作数是无穷无尽的不同于符号.

#D                      Source operand is a denormal value.
#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 前缀 。

来源