不,我看不到让gcc使用SHRD指令的方法.
您可以通过更改
-mtune and -march选项来操纵gcc生成的输出.
Or are there any gcc -mtune or other options that would encourage gcc to tune better for modern Intel CPUs?
是的,你可以让gcc生成BMI2 code:
例如:X86-64 GCC6.2 -O3 -march = znver1 // AMD Zen
生成:( Haswell时间).
code critical path latency reciprocal throughput
---------------------------------------------------------------
mov eax, 32 * 0.25
sub eax, edx 1 0.25
shlx eax, esi, eax 1 0.5
shrx esi, edi, edx * 0.5
or eax, esi 1 0.25
ret
TOTAL: 3 1.75
与clang 3.8.1相比:
mov cl, dl 1 0.25
shrd edi, esi, cl 4 2
mov eax, edi * 0.25
ret
TOTAL 5 2.25
鉴于这里的依赖关系链:Haswell上的SHRD较慢,与Sandybridge相关,在Skylake上较慢.
shrx序列的倒数吞吐量更快.
所以这取决于,在后BMI处理器gcc产生更好的代码,前BMI clang胜利.
SHRD在不同的处理器上有不同的时序,我可以看出为什么gcc并不过分喜欢它.
即使使用-Os(针对大小进行优化),gcc仍然不会选择SHRD.
*)不是时序的一部分,因为要么不在关键路径上,要么变成零延迟寄存器重命名.