我试图计算双精度浮点值的反正切,它保存在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