posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          一個編譯器優化問題

          Posted on 2007-07-19 00:51 ZelluX 閱讀(372) 評論(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的指令。
          主站蜘蛛池模板: 磴口县| 霸州市| 精河县| 西吉县| 芜湖县| 高邮市| 开江县| 新竹县| 宁蒗| 盐池县| 丁青县| 洪洞县| 图们市| 贡觉县| 兴山县| 陈巴尔虎旗| 双牌县| 潜江市| 韶关市| 望谟县| 金坛市| 依兰县| 瑞安市| 广汉市| 武汉市| 明星| 怀集县| 肥乡县| 水富县| 阿瓦提县| 柳林县| 朝阳县| 龙山县| 遂溪县| 南木林县| 昭觉县| 武宣县| 博白县| 京山县| 林周县| 自贡市|