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

时间:2016-06-01 11:18:16

标签: assembly x86-64 intel precision

我尝试计算双精度浮点值的反正切值,我在xmm寄存器中保存。使用正常浮点指示可以使用旧的x87指令FPATAN,但是如何使用double执行此操作?

1 个答案:

答案 0 :(得分:2)

可以仍然将数据从xmm复制到x87以使用fpatan之类的指令,但通常你应该调用数学库函数。 (fpatan非常慢,用许多简单的指令替换它仍然很好。)维基百科建议查看Netlib的可自由再分发的C实现。 (显然最简单的方法是在你正在使用的任何系统上调用libm中的函数。)

如果您要这样做,请不要使用静态存储空间来存储您的内存;在堆栈上使用临时文件。

另请注意fpatan takes 2 inputs,因为它实现了atan2 library function,根据两个输入的符号在适当的象限中给出结果。

; 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