鉴于以下计划:
#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铿锵声。
答案 0 :(得分:1)
clang代码分两步加载值。首先,将值1加载到寄存器的低64位。然后整个事物被移位8个二进制位置,因此值1以高64位结束,正如您的代码所指定的那样。
答案 1 :(得分:1)
评论似乎是根据pslldq
的先前内容描述xmm0
的操作(即使这些内容在编译时已知)。
它似乎与[ 3 2 1 0 ]
使用的通常的高元素优先(_mm_set
)的顺序相反,并且使得#34;离开"转变是有道理的。
如果存储了矢量,它就是你在内存中的字节顺序。
我忘记了,如果这是典型的铿锵声,我现在没有时间去检查另一个例子。