x86_64: IMUL é mais rápido que 2x SHL + 2x AD

Ao ver a montagem produzida pelo Visual Studio (2015U2) em/O2odo @ (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?

questionAnswers(1)

yourAnswerToTheQuestion