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