x86_64: IMUL é mais rápido que 2x SHL + 2x AD
Ao ver a montagem produzida pelo Visual Studio (2015U2) em/O2
odo @ (release) Vi que esse trecho de código C 'otimizado à mão' é convertido novamente em uma multiplicação:
int64_t calc(int64_t a) {
return (a << 6) + (a << 16) - a;
}
Montagem
imul rdx,qword ptr [a],1003Fh
Então eu queria saber se isso é realmente mais rápido do que fazê-lo da maneira como está escrito, algo como:
mov rbx,qword ptr [a]
mov rax,rbx
shl rax,6
mov rcx,rbx
shl rcx,10h
add rax,rcx
sub rax,rbx
Eu sempre tive a impressão de que a multiplicação é sempre mais lenta do que alguns turnos / adições? Esse não é mais o caso dos modernos processadores Intel x86_64?