为什么clang不分配常量给寄存器?

时间:2018-10-15 21:56:12

标签: c performance clang code-generation sse2

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

0 个答案:

没有答案