Я смотрю на вывод 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