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

Posted

技术标签:

【中文标题】如何在某处计算正弦值,然后在 Assembly 中移动到 XMM0?【英文标题】:How to compute sine values somewhere, and then move then into XMM0 in Assembly? 【发布时间】:2012-05-13 10:16:22 【问题描述】:

我之前在用 FPU 做集成任务,现在我在用 SSE 挣扎。

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

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

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

有人知道怎么做吗?

【问题讨论】:

鼻窦?我不认为这意味着你认为它做了什么(而且它不是动词)。 fsin 没有 sinus 堆栈顶部的值? 英文叫'sine'。 这个答案是相关的:***.com/a/1845204/1256624(总而言之,SSE 似乎没有提供原生的sin 指令)。此外,此页面看起来可能会有所帮助:gruntthepeon.free.fr/ssemath @dbaupp 我知道 SSE 没有提供它,但也许您知道如何将 fpu 堆栈中的值插入 xmm0? 【参考方案1】:

三个选项:

    使用在 SSE 向量上计算 sin 的现有库。 使用 SSE 编写您自己的向量 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 会起作用,但如果这很重要的话,它又丑又慢而且不是特别准确。

【讨论】:

以上是关于如何在某处计算正弦值,然后在 Assembly 中移动到 XMM0?的主要内容,如果未能解决你的问题,请参考以下文章

计算器遵循啥样的算法来查找正弦值?

巧用ASIN函数计算反正弦值

如何测正弦信号的峰值?(测峰值的电路是啥?)

Quartus II 11.1中使用Signaltap ii分析采集正弦波幅值数据后如何呈现完整正弦波形?

逆正弦、余弦和正切的代码

三角函数中角度如何换算?