assembly FADDP ST(0),ST(1)有意义吗?

dhxwm5r4  于 2023-05-13  发布在  其他
关注(0)|答案(1)|浏览(131)

我有个问题FADDP ST(0), ST(1)指令在汇编语言中有意义吗?
据我所知,在这条指令中,我们将ST(0)和ST(1)相加,并将结果写入ST(0),之后ST(0)被删除。

nhaq1z21

nhaq1z211#

faddp st(0), st(1)甚至不能编码成机器码。
你是对的,它没有用(除了引发FP异常),这就是为什么8087的架构师没有包括faddp st(0), st(i)操作码。3 forms of fadd的操作码有一个寄存器源:

  • D8 C0+iFADD ST(0), ST(i)
  • DC C0+iFADD ST(i), ST(0)
  • DE C0+iFADDP ST(i), ST(0)
  • 但没有faddp st(0), st(i)的操作码

所以faddp st(0), st(0)是可编码的,但没有用,使用faddp st(i), st(0)操作码,其中 destination 可以是任何寄存器,包括st(0)的无用情况,但源被固定为st(0)
将堆栈弹出1而不做其他任何事情的最便宜的方法是fstp st(0)。http://www.ray.masmcode.com/tutorial/fpuchap4.htm#fstp
(And有关指令成本,请参阅https://agner.org/optimize/https://uops.info/没有测试遗留x87指令,尽管它确实有一些IACA数据。
如果你真的想添加一个数字并丢弃结果,例如。要在从使用整数位操作的数学库函数返回之前引发FP异常,可以使用

; Emulate faddp st(0), st(1), e.g. for raising FP exceptions
   fadd st(0), st(1)
   fstp st(0)

相关问题