为什么clangfabs(double)
变成vandps
而不是vandpd
(像GCC一样)?
来自编译器资源管理器的示例:
#include <math.h>
double float_abs(double x) {
return fabs(x);
}
铿锵声12.0.1-std=gnu++11 -Wall -O3 -march=znver3
.LCPI0_0:
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
float_abs(double): # @float_abs(double)
vandps xmm0, xmm0, xmmword ptr [rip + .LCPI0_0]
ret
海合会 11.2-std=gnu++11 -Wall -O3 -march=znver3
float_abs(double):
vandpd xmm0, xmm0, XMMWORD PTR .LC0[rip]
ret
.LC0:
.long -1
.long 2147483647
.long 0
.long 0
(具有讽刺意味的是,GCC 使用vandpd
but 将常量定义为 32 位.long
块(有趣的是上半部分为零),而 clang 使用vandps
but 将常量定义为两.quad
半。