SSE除以整数
SSE division by integer
我目前正在研究函数,它使用 C 和 64 位汇编组合(C 使用 asm 函数)计算 sin(x) 函数的泰勒近似值。
我对汇编和低级编程还比较陌生,但我仍然没有得到一些东西。
让我们在 C:
中调用函数
float taylor(float fi, float n);
其中 fi 是角度,n 是步数。我明白了,在汇编部分 fi 存储在 xmm0 寄存器中,而 n 存储在 rax 寄存器中。
- 我应该把 return 值放在哪个寄存器的末尾? (作为浮点数)
我计算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 的。
我目前正在研究函数,它使用 C 和 64 位汇编组合(C 使用 asm 函数)计算 sin(x) 函数的泰勒近似值。 我对汇编和低级编程还比较陌生,但我仍然没有得到一些东西。
让我们在 C:
中调用函数 float taylor(float fi, float n);
其中 fi 是角度,n 是步数。我明白了,在汇编部分 fi 存储在 xmm0 寄存器中,而 n 存储在 rax 寄存器中。
- 我应该把 return 值放在哪个寄存器的末尾? (作为浮点数)
我计算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 的。