我以前用 FPU 做集成任务,现在我在 SSE 上苦苦挣扎。
我的主要问题是当我使用 FPU 堆栈时,有一个fsin
函数可以用于堆栈顶部的数字(st0)。
现在我想计算我所有四个数字的正弦XMM0
,或者在其他地方计算它并进入XMM0
。我正在使用 AT&T 语法。
我认为第二个想法实际上是可能的,但我不知道如何:)
有人知道怎么做吗?
三个选项:
sin
在 SSE 向量上计算的库。sin
使用 SSE编写您自己的向量函数。将向量存储到内存中,用于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
会起作用,但如果这很重要的话,它又丑又慢而且不是特别准确。