SSE除以整数

SSE division by integer

我目前正在研究函数,它使用 C 和 64 位汇编组合(C 使用 asm 函数)计算 sin(x) 函数的泰勒近似值。 我对汇编和低级编程还比较陌生,但我仍然没有得到一些东西。

让我们在 C:

中调用函数
     float taylor(float fi, float n); 

其中 fi 是角度,n 是步数。我明白了,在汇编部分 fi 存储在 xmm0 寄存器中,而 n 存储在 rax 寄存器中。

  1. 我应该把 return 值放在哪个寄存器的末尾? (作为浮点数)
  2. 我计算x^3,x^5,x^7等简单的xmm寄存器保持值乘以它自己,但是如何除以整数阶乘呢? (x^3/3!等等)。有没有办法把f.e. 3! = 6 到 xmm 寄存器使其浮动,所以它会被视为 6.0?我不知道如何划分这两个数字。我试过类似的东西:

    movq , %rbx
    movq %rbx, %xmm1
    divpd %xmm0, %xmm1
    

    但它给出了 NaN 的结果(给出的示例参数:6 10)- 我不知道如何让它工作...

你应该花点时间研究一下指令集参考,这样你至少能大致了解你有什么样的可能性。此外,您应该阅读适用于调用约定的 ABI 文档。

也就是说,你第一个问题的答案是浮点数 return 值应该在 xmm0 中传回,你可以使用 CVTSI2SS(或 CVTSI2SD 双精度)。

另请注意,您应该使用正确的 scalar/packed 和 float/double 版本。 divpd 是双倍的,而你需要标量单倍,所以你真的想要 divss.

PS:您的问题具体不是关于 FPU 或 MMX。相反,它是关于 SSE 的。