如何在某处计算正弦值,然后在Assembly中移动到XMM0?

时间:2012-05-13 10:16:22

标签: assembly sse

之前我正在与FPU进行集成任务,现在我正在与SSE斗争。

我的主要问题是当我使用FPU堆栈时,有fsin函数,可以在数字上使用,它位于堆栈顶部(st0)。

现在我想在XMM0中计算我所有四个数字的正弦值,或者在其他地方计算它并进入XMM0。我正在使用AT& T语法。

我认为第二个想法实际上是可行的,但我不知道如何:)

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:4)

三个选项:

  1. 使用和现有的库在SSE向量上计算sin
  2. 使用SSE编写您自己的向量sin函数。
  3. 将向量存储到内存中,使用fsin计算每个元素的正弦值,然后加载结果。假设您的堆栈是16字节对齐并且具有16字节的空间,如下所示:

       movaps  %xmm0, (%rsp)
       mov     $3,     %rcx
    0: flds   (%rsp,%rcx,4)
       fsin
       fstps  (%rsp,%rcx,4)
       sub     $1,     %rcx
       jns     0b
    
  4. (1)几乎可以肯定是性能最好的选择,也是最简单的选择。如果您在编写矢量代码方面有丰富的经验并且知道先验参数属于某个范围,那么您可以通过(2)获得更好的性能。使用fsin会起作用,但如果重要的话,它会很难看,也不会特别准确。