Assembly 如何在某处计算正弦值,然后在汇编中移动到XMM0?
我以前在做FPU的集成任务,现在我在和SSE做斗争 我的主要问题是,当我使用FPU堆栈时,有一个Assembly 如何在某处计算正弦值,然后在汇编中移动到XMM0?,assembly,sse,Assembly,Sse,我以前在做FPU的集成任务,现在我在和SSE做斗争 我的主要问题是,当我使用FPU堆栈时,有一个fsin函数,它可以用于堆栈顶部的数字(st0) 现在我想计算XMM0中所有四个数字的正弦,或者在其他地方计算,然后进入XMM0。我使用的是AT&T语法 我认为第二个想法实际上是可能的,但我不知道如何实现:) 有人知道怎么做吗 三个选项: 使用和现有的库,计算SSE向量上的sin 使用SSE编写自己的向量sin函数 将向量存储到内存中,使用fsin计算每个元素的正弦,并加载结果。假设堆栈是16字节对齐
fsin
函数,它可以用于堆栈顶部的数字(st0)
现在我想计算XMM0
中所有四个数字的正弦,或者在其他地方计算,然后进入XMM0
。我使用的是AT&T语法
我认为第二个想法实际上是可能的,但我不知道如何实现:)
有人知道怎么做吗 三个选项:
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
会起作用,但如果有必要的话,它又丑又慢,而且不是特别准确。?我不认为这意味着你认为它会做什么(它不是动词)。fsin不会将值放在堆栈顶部?它在英语中被称为“正弦”。这个答案是相关的:(总结,SSE似乎没有提供本机sin
指令)。另外,这个页面看起来可能会有所帮助:@dbaupp我知道SSE不提供它,但也许您知道如何将fpu堆栈中的值插入xmm0?