Почему Clang не выделяет константу в регистр? - PullRequest
0 голосов
/ 16 октября 2018

Я смотрю на вывод clang , чтобы увидеть, что код C:

(mask==0xffff ? one : zero)

Это дает, где one установлено так:

const __m128i one = _mm_set_epi64x(0, 1);

И вывод сборки:

 4e0:   66 0f d7 c0     pmovmskb    eax, xmm0
 4e4:   3d ff ff 00 00  cmp eax, 65535
 4e9:   66 0f ef c0     pxor    xmm0, xmm0
 4ed:   74 06   je  6 <_vm_run+0x465>
 4ef:   66 0f ef c9     pxor    xmm1, xmm1
 4f3:   eb 0a   jmp 10 <_vm_run+0x46F>
 4f5:   b8 01 00 00 00  mov eax, 1
 4fa:   66 48 0f 6e c8  movq    xmm1, rax

Мой вопрос: почему clang не продвигает one в регистр?(есть некоторые неиспользованные).Это вопрос соглашения о вызове?Это позволило бы сохранить немало байтов (перемещение между регистрами xmm составляет всего 4 или 5 байтов).

РЕДАКТИРОВАТЬ:

Вот воспроизводимый пример: https://godbolt.org/z/qfTZqY

...