SSE除以整数

时间:2015-05-26 20:10:52

标签: assembly floating-point x86-64 sse

我目前正在研究函数,它使用C& C来计算sin(x)函数的泰勒近似。 64位汇编组合(C使用asm函数)。 我对组装起来不太新。低级编程,我仍然没有得到一些东西。

让我们在C中调用函数:

     float taylor(float fi, float n); 

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

  1. 我应该在哪个寄存器中添加返回值? (作为浮动)
  2. 我通过简单地将xmm寄存器保持值乘以它来计算x ^ 3,x ^ 5,x ^ 7等,但是如何将它除以整数阶乘? (x ^ 3/3!等等)。有没有办法把f.e. 3! = 6进入xmm寄存器使其浮动,所以它将被视为6.0?我不知道如何划分这两个数字。我尝试过类似的东西:

    movq $6, %rbx
    movq %rbx, %xmm1
    divpd %xmm0, %xmm1
    

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

1 个答案:

答案 0 :(得分:1)

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

那说,你的第一个问题的答案是浮点返回值应该在xmm0中传回,你可以使用CVTSI2SS(或CVTSI2SD进行双精度转换为整数浮点数)。

另请注意,您应该使用正确的标量/打包和浮点/双版本。 divpd包含两倍,而你需要标量单,所以你真的想要divss

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