int test1(int a, int b) {
if (__builtin_expect(a < b, 0))
return a / b;
return b;
}
был скомпилирован clang с -O3 -march=native
в
test1(int, int): # @test1(int, int)
cmp edi, esi
jl .LBB0_1
mov eax, esi
ret
.LBB0_1:
mov eax, edi
cdq
idiv esi
mov esi, eax
mov eax, esi # moving eax back and forth
ret
, почему eax
перемещается вперед и назад после того, как idiv
?
gcc имеет аналогичныйповедение, так что это, кажется, предназначено.
GCC с -O3 -march=native
соответствует код для
test1(int, int):
mov r8d, esi
cmp edi, esi
jl .L4
mov eax, r8d
ret
.L4:
mov eax, edi
cdq
idiv esi
mov r8d, eax
mov eax, r8d #back and forth mov
ret
Godbolt