xmm 寄存器 sse x64 里面的值

Posted

技术标签:

【中文标题】xmm 寄存器 sse x64 里面的值【英文标题】:xmm register sse x64 value inside 【发布时间】:2012-12-30 20:36:56 【问题描述】:

我正在编写项目以使用 x64 程序集进行学习。我正在使用 nasm 编译器。我知道 xmm 寄存器可以存储 4 x 32 位或 2x64 位。例如,我想知道如何将 4 个浮点值(32 位)放入 xmm1 中。我的函数有标题curve(float * x, float * y, int a, int b),x 是指向 5 元素数组的指针。我正在寻找一些信息,但我仍然不知道如何正确地做到这一点。 提前感谢您的帮助! (ps.如果您有任何教程,包括有关 sse 的信息,那将非常有帮助)

【问题讨论】:

software.intel.com/sites/products/documentation/studio/composer/… 这个项目是全汇编的——我的意思是我只需要在汇编中定义这个函数。 那么你最好的办法是从 C 代码编译,然后看看编译器是怎么做的。简而言之,它不是微不足道的——至少要高效,它不是微不足道的。 (虽然我警告说 VC++ 可以为这些集合内在函数生成非常愚蠢的代码。) 我知道这不是微不足道的,这就是我问的原因。而且我也知道它非常有效,这就是我想了解它的原因......也许是一些教程或类似的东西......? 一般来说,如果你发现(解)打包数据是一个瓶颈,那么你可能应该改变内存布局,使向量操作更加“垂直”。 【参考方案1】:

您可以使用 movdqa、movdqu、movaps、movups、movapd、movupd 指令之一将值从内存加载到 128 位 SSE 寄存器 (xmm)。 movdqa、movaps、movapd 需要 16 字节对齐的内存访问(并且速度更快)。

顺便说一句,使用 SIMD 一次只做一点需要大量代码更改。更好的选择是一次做 4 个(因为 SIMD 有 4 个单精度浮点通道)。然后你可以(或多或少)用相同的向量指令替换每个常规指令。

【讨论】:

以上是关于xmm 寄存器 sse x64 里面的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 x64 SSE / AVX 寄存器进行字符串反转

XMM 寄存器中的取消引用指针(收集)

SSE XMM 点积说明

什么是 SSE 相当于 fstp?

内在函数和寄存器(SSE)

X86 操作码将 xmm 寄存器移动到通用寄存器