您仍然可以将数据从 xmm 复制到 x87 以使用类似 的指令fpatan,但通常您应该调用数学库函数。(fpatan速度太慢,用许多简单的指令替换它仍然很好。) Wikipedia 建议查看 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
Run Code Online (Sandbox Code Playgroud)