之前我正在与FPU进行集成任务,现在我正在与SSE斗争。
我的主要问题是当我使用FPU堆栈时,有fsin
函数,可以在数字上使用,它位于堆栈顶部(st0)。
现在我想在XMM0
中计算我所有四个数字的正弦值,或者在其他地方计算它并进入XMM0
。我正在使用AT& T语法。
我认为第二个想法实际上是可行的,但我不知道如何:)
有人知道怎么做吗?
答案 0 :(得分:4)
三个选项:
sin
。sin
函数。将向量存储到内存中,使用fsin
计算每个元素的正弦值,然后加载结果。假设您的堆栈是16字节对齐并且具有16字节的空间,如下所示:
movaps %xmm0, (%rsp)
mov $3, %rcx
0: flds (%rsp,%rcx,4)
fsin
fstps (%rsp,%rcx,4)
sub $1, %rcx
jns 0b
(1)几乎可以肯定是性能最好的选择,也是最简单的选择。如果您在编写矢量代码方面有丰富的经验并且知道先验参数属于某个范围,那么您可以通过(2)获得更好的性能。使用fsin
会起作用,但如果重要的话,它会很难看,也不会特别准确。