xmm clang程序集注释

时间:2016-06-12 10:37:58

标签: c assembly clang sse endianness

鉴于以下计划:

#include "emmintrin.h"

int main(int argc, char *argv[])
{
    volatile __m128i x = _mm_set_epi64x(1, 0);
    return 0;
}

我可以使用clang -O -S test.c获取程序集(仅列出有趣的部分):

...
movl    $1, %eax
movd    %rax, %xmm0
pslldq  $8, %xmm0               # xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
...

根据_mm_set_epi64x的手册,%xmm0应为[0, 1, 0, 0],每个元素为整数(32位)。

但是,根据评论,%xmm0持有[0, 0, 0, 1]。我不认为字节序在这里是相关的,因为我只看一个寄存器。

我怀疑它与clang程序集评论使用的符号有关,但我在互联网上找不到任何有用的信息。

==编辑:

提起bug铿锵声。

2 个答案:

答案 0 :(得分:1)

clang代码分两步加载值。首先,将值1加载到寄存器的低64位。然后整个事物被移位8个二进制位置,因此值1以高64位结束,正如您的代码所指定的那样。

答案 1 :(得分:1)

评论似乎是根据pslldq的先前内容描述xmm0的操作(即使这些内容在编译时已知)。

它似乎与[ 3 2 1 0 ]使用的通常的高元素优先(_mm_set)的顺序相反,并且使得#34;离开"转变是有道理的。

如果存储了矢量,它就是你在内存中的字节顺序。

我忘记了,如果这是典型的铿锵声,我现在没有时间去检查另一个例子。