【问题标题】:SSE division by integerSSE 除以整数
【发布时间】:2015-05-26 20:10:51
【问题描述】:

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

让我们在 C 中调用函数:

     float taylor(float fi, float n); 

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

  1. 我应该将返回值放在哪个寄存器的末尾? (作为浮动)
  2. 我计算 x^3、x^5、x^7 等的方法是简单地将 xmm 寄存器的值乘以自身,但如何除以整数阶乘? (x^3/3!等等)。有什么办法可以把 f.e. 3! = 6 到 xmm 寄存器使其浮动,所以它会被视为 6.0?我不知道如何划分这两个数字。我尝试了类似的方法:

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

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

【问题讨论】:

  • 对于返回寄存器分配,您必须查看调用约定。您使用的是什么操作系统/编译器?
  • 从标题我认为这将是一个更有趣的问题.. 实际的 SSE 整数除法很烦人,但这正是您不想要的。
  • @Dani: Linux 2.6.32-73-server x86_64,使用AS和GCC编译

标签: assembly floating-point x86-64 sse


【解决方案1】:

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

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

还请注意,您应该使用正确的标量/压缩和浮点/双精度版本。 divpd 是双包装的,而您需要标量单包装,所以您真的想要 divss

PS:您的问题与 FPU 或 MMX 无关。相反,它是关于 SSE。

【讨论】:

  • 对,我的错。另外,问题似乎是我如何输入参数 - 当我写“6.0 10”而不是“6 10”时,这个除法得到了 1.000 的正确结果。谢谢。
猜你喜欢
  • 2013-05-25
  • 2023-03-09
  • 2017-05-24
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多