看到匯編中的基本運算這一節,想看看傳說中的編譯器把a*2優化為a<<1是不是真的呢,寫了個函數試了下:
int func(int x)
{
return x * 2;
}
用gcc -O2 -S test.c 編譯,發現優化后是用了加法,而不是位移
func:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
addl %eax, %eax
ret
BBS上問了,老大說一般加法不會慢。
又試了一下把*2改成*3,仍然是使用leal (%eax,%eax,2), %eax進行加法操作完成的,而改成*4就使用位移了。
其他回答:
SecretVan@smth.org: CISC指令集上更傾向于選擇功能一樣而長度較短的指令,帶了立即數之后指令就長了,如果使用寄存器那更得不償失
Nineveh@smth.org: 因為 add 的長度短于或等于 sal,速度快于或等于 sal,吞吐量大于或等于 sal。
lib@rygh: 在P4里面我記得一條加法指令是0.5個cycle.移位指令撐死了也要0.5個cycle吧,沒聽說過有0.25cycle的指令。
int func(int x)
{
return x * 2;
}
用gcc -O2 -S test.c 編譯,發現優化后是用了加法,而不是位移
func:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
addl %eax, %eax
ret
BBS上問了,老大說一般加法不會慢。
又試了一下把*2改成*3,仍然是使用leal (%eax,%eax,2), %eax進行加法操作完成的,而改成*4就使用位移了。
其他回答:
SecretVan@smth.org: CISC指令集上更傾向于選擇功能一樣而長度較短的指令,帶了立即數之后指令就長了,如果使用寄存器那更得不償失
Nineveh@smth.org: 因為 add 的長度短于或等于 sal,速度快于或等于 sal,吞吐量大于或等于 sal。
lib@rygh: 在P4里面我記得一條加法指令是0.5個cycle.移位指令撐死了也要0.5個cycle吧,沒聽說過有0.25cycle的指令。