给定以下程序:

#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/

10-11 11:04