Учитывая следующую программу:порядка байт в сборе XMM лязга комментарии
#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, но я не могу найти никакой полезной информации об этом в Интернете.
== Edit:
Подал bug звенеть.
Да, это тоже мое понимание. Однако комментарий '# xmm0 = zero ...', похоже, не согласен. –
@AlbertNetymk Этот комментарий относится к предварительному состоянию 'xmm0', которое перед выполнением сдвига действительно содержит 1 в нижней позиции. – fuz
Это было бы очень противно интуитивно. 'xmm0 = ноль, ноль, ноль, ноль, ноль, ноль, ноль, ноль, xmm0 [0,1,2,3,4,5,6,7]' читается как назначение. 'volatile __m128i y = _mm_set1_epi32 (1);' => 'movaps .LCPI0_0 (% rip),% xmm0 # xmm0 = [4294967297,4294967297]' показывает, что комментарий отражает состояние регистра впоследствии, а не состояние предыдущего, IMO , –