我正在查看 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