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?