编译器是否优化数学表达式?
Does the compiler optimize math expressions?
rustc 是否优化了这样的表达式?
- 2*x -> x<<1
- x/2 -> x>>1
- x % 8 -> x&7
- 等等
这种微不足道的优化属于 LLVM optimization passes,实际上生成的程序集更好更正确。
2*x
被编译为单指令 lea rax, [rdi + rdi]
,在所有现代 x86 处理器上都是单 uop(相关 )
x/2
用于带符号的数字被编译为最快和正确的方式,在 -1
的情况下给出正确答案(相关 question
mov rax, rdi
shr rax, 63
add rax, rdi
sar rax
但编译为无符号数右移
mov rax, rdi
shr rax
同样的故事 x % 8
它编译为带符号数的长汇编(对于负数)
mov rax, rdi
lea rcx, [rdi + 7]
test rdi, rdi
cmovns rcx, rdi
and rcx, -8
sub rax, rcx
ret
和and
无符号数指令(相关question)
mov rax, rdi
and eax, 7
ret
rustc 是否优化了这样的表达式?
- 2*x -> x<<1
- x/2 -> x>>1
- x % 8 -> x&7
- 等等
这种微不足道的优化属于 LLVM optimization passes,实际上生成的程序集更好更正确。
2*x
被编译为单指令 lea rax, [rdi + rdi]
,在所有现代 x86 处理器上都是单 uop(相关
x/2
用于带符号的数字被编译为最快和正确的方式,在 -1
的情况下给出正确答案(相关 question
mov rax, rdi
shr rax, 63
add rax, rdi
sar rax
但编译为无符号数右移
mov rax, rdi
shr rax
同样的故事 x % 8
它编译为带符号数的长汇编(对于负数)
mov rax, rdi
lea rcx, [rdi + 7]
test rdi, rdi
cmovns rcx, rdi
and rcx, -8
sub rax, rcx
ret
和and
无符号数指令(相关question)
mov rax, rdi
and eax, 7
ret