gcc提供了许多内置例程。 在哪里可以找到内置例程的源代码?我知道有时它们可能是直接的操作码。例如显示在Implementation of __builtin_clz中。
我尝试了以下四个功能
int leading_zeroes(int x){ return __builtin_ctz(x); }
double cpsgn(double x, double y){ return __builtin_copysign(x,y); }
int exponent(double x) { return __builtin_ilogb(x); }
double loadexp(double x, int y){ return __builtin_ldexp(x,y); }
最后,我对汇编代码感兴趣。使用https://godbolt.org/,我得到了此汇编代码
leading_zeroes:
xor eax, eax
rep bsf eax, edi
ret
cpsgn:
andpd xmm0, XMMWORD PTR .LC0[rip]
movapd xmm2, xmm1
andpd xmm2, XMMWORD PTR .LC1[rip]
orpd xmm0, xmm2
ret
exponent:
jmp ilogb
loadexp:
jmp ldexp
.LC0:
.long 4294967295
.long 2147483647
.long 0
.long 0
.LC1:
.long 0
.long -2147483648
.long 0
.long 0
因此__builtin_ctz
变成bsf
。 copysign
也已解决。但是,通常很慢的ilogb
和ldexp
会产生一条jmp
指令。如何解决jmp
(或call
)?