posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一个编译器优化问题

Posted on 2007-07-19 00:51 ZelluX 阅读(355) 评论(0)  编辑  收藏 所属分类: Courses
看到汇编中的基本运算这一节,想看看传说中的编译器把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的指令。

只有注册用户登录后才能发表评论。


网站导航: