x86_64: IMUL быстрее, чем 2x SHL + 2x ADD?

Когда вы смотрите на сборку, созданную Visual Studio (2015U2) в/O2 режиме @ (релиз) я увидел, что этот «оптимизированный вручную» фрагмент кода C переводится обратно в умножение:

int64_t calc(int64_t a) {
  return (a << 6) + (a << 16) - a;
}

Assembly:

  imul        rdx,qword ptr [a],1003Fh  

Так что мне было интересно, если это действительно быстрее, чем делать так, как написано, что-то вроде:

  mov         rbx,qword ptr [a]  
  mov         rax,rbx  
  shl         rax,6  
  mov         rcx,rbx  
  shl         rcx,10h  
  add         rax,rcx  
  sub         rax,rbx  

У меня всегда было впечатление, что умножение всегда медленнее, чем несколько смен / добавлений? Разве это больше не относится к современным процессорам Intel x86_64?

Ответы на вопрос(1)

Ваш ответ на вопрос