给定以下程序:
#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 assembly comment使用的符号有关,但我在网上找不到任何有用的信息。
==编辑:
向克朗提交了一份bug文件。
最佳答案
clang代码分两步加载该值。首先,值1被加载到寄存器的低位64位。然后整件事被左移8个二进制位,所以值1最终会变成高64位,正如您的代码所指定的那样。
关于c - xmm lang汇编注释中的字节顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37773274/