英特尔x86_64程序集,如何在x87和SSE2之间移动?(计算二重反正切)



我试图计算双精度浮点值的反正切,它保存在xmm寄存器中。使用普通浮点定点,可以使用旧的x87指令FPATAN,但如何使用double?

仍然可以将数据从xmm复制到x87以使用fpatan等指令,但通常应该调用数学库函数。(fpatan太慢了,用许多简单的指令替换它仍然很好。)维基百科建议考虑Netlib,以获得一个可自由重新分发的C实现。(显然,最简单的方法是在您使用的任何系统上调用libm中的函数。)


如果你要这样做,不要使用静态存储来存储你弹过的内存;在堆栈上使用临时。

还要注意,fpatan采用2个输入,因为它实现了atan2库函数,根据两个输入的符号在适当的象限中给出结果。

; assuming you did  sub  rsp, 24   or something earlier in your function
movsd   [rsp], xmm1
fld     qword [rsp]   ; st0 = xmm1
movsd   [rsp], xmm0
fld     qword [rsp]   ; st0 = xmm0,  st1 = xmm1
fpatan                ; st0 = arctan(xmm1/xmm0)
fstp    qword [rsp]     ; x87 stack is empty again
movsd   xmm0, [rsp]   ; xmm0 = arctan(xmm1/xmm0)
; and then   add rsp, 24   at some point before returning

最新更新