• 正文
    • 14.2  除法運算
  • 相關推薦
申請入駐 產業(yè)圖譜

高效的C編程之:除法運算

2013/09/30
1
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

 

14.2  除法運算

因為ARM體系結構本身并不包含除法運算硬件,所以在ARM上實現(xiàn)除法是十分耗時的。ARM指令集中沒有直接提供除法匯編指令,當代碼中出現(xiàn)除法運算時,ARM編譯器會調用C庫函數(shù)(有符合除法調用_rt_sdiv,無符合除法調用_rt_udiv),來實現(xiàn)除法操作。根據除數(shù)和被除數(shù)的不同,32bit的除法運算一般要占有20-140個指令周期。除法運算占用的指令周期,由下面公式計算。

Time(除數(shù)n / 被除數(shù)d)

= C0 + C1 * log2(除數(shù)n / 被除數(shù)d) =

= C0 + C1 * (log2(除數(shù)) -log2(被除數(shù))).

為了避免在程序中出現(xiàn)除法操作,編程時盡量使用其他運算來代替除法操作。如,使用x>(z×y)來代替(x/y)>z。

另外,在無法避免的除法運算中,盡量使用無符合除法代替有符號除法。這是因為在ARM庫函數(shù)中,無符合除法的運算速度要快于有符合除法。

下面章節(jié)將詳細討論如何在代碼中提高除法運算的執(zhí)行效率。

14.2.1  合并除法和求余運算

ARM的除法運算庫函數(shù)能同時返回運算的商和余數(shù)。

在一些同時需要商和余數(shù)的情況下,編譯器將調用一次除法運算函數(shù)同時存儲運算的商和余數(shù)。

下面是一個編譯器調用除法庫,同時存儲運算的商和余數(shù)的例子。

源程序如下。

int combined_div_mod (int a, int b)

return (a / b) + (a % b);

}

下面是編譯器編譯出的匯編代碼。

combined_div_mod

     STMDB sp!,{lr}

     MOV a3,a2

     MOV a2,a1

     MOV a1,a3

     BL __rt_sdiv

     ADD a1,a1,a2

     LDMIA sp!,{pc}

從上面的例子可以看出,調用一次除法運算,同時返回了商和余數(shù)。

14.2.2  使用2的整數(shù)次冪做除數(shù)

當2的整數(shù)次冪做除數(shù)時,編譯器會自動將除法運算轉換成移位運算。所以在編寫程序算法時,盡量使用2的整數(shù)次冪做除數(shù)。

下面的例子顯示了編譯器對除法運算的自動優(yōu)化。

源程序如下。

typedef unsigned int uint;

uint div16u (uint a)

{ return a / 16;

}

int div16s (int a)

{ return a / 16;

}

編譯器的編譯結果如下。

div16u

     MOV a1,a1,LSR #4

     MOV pc,lr

div16s

     CMP a1,#0

     ADDLT a1,a1,#&f

     MOV a1,a1,ASR #4

     MOV pc,lr

從上面的例子可以看出,無符號除法的運算速度快于有符號除法。

 

14.2.3  求余運算

為了避免在程序中使用除法運算,可以將一些典型的求余運算進行轉換。下面的例子提供一種轉換方法。

uint counter1 (uint count)

{ return (++count % 60);

}

轉換成,

uint counter2 (uint count)

{ if (++count >= 60)

count = 0;

return (count);

}

下面是兩個功能函數(shù)編譯后的匯編代碼。

counter1

     STMDB sp!,{lr}

     ADD a2,a1,#1

     MOV a1,#&3c

     BL __rt_udiv

     MOV a1,a2

     LDMIA sp!,{pc}

counter2

     ADD a1,a1,#1

     CMP a1,#&3c

     MOVCS a1,#0

     MOV pc,lr

上面的例子清晰的顯示了使用if語句代替除法運算后,代碼的執(zhí)行效率有很大提高。

14.2.4  除數(shù)是常數(shù)的除法

因為除法和模運算執(zhí)行起來比較慢,所以應該盡可能地避免使用。但是除數(shù)是常數(shù)的除法運算和用同一個除數(shù)的重復除法,執(zhí)行效率會比較高。在ARM的除法庫中,存在除數(shù)為10的除法運算庫,其中包括有符號除法和無符號除法。如果除數(shù)是10以外的其他常數(shù),用戶可以編寫自己的功能函數(shù)。ARM的開發(fā)工具集中,提供了關于除數(shù)是常數(shù)的示例程序和算法分析,以供用戶編寫自己的代碼時參考。

Arm

Arm

ARM公司是一家知識產權(IP)供應商,主要為國際上其他的電子公司提供高性能RISC處理器、外設和系統(tǒng)芯片技術授權。目前,ARM公司的處理器內核已經成為便攜通訊、手持計算設備、多媒體數(shù)字消費品等方案的RISC標準。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知識產權(IP)供應商,主要為國際上其他的電子公司提供高性能RISC處理器、外設和系統(tǒng)芯片技術授權。目前,ARM公司的處理器內核已經成為便攜通訊、手持計算設備、多媒體數(shù)字消費品等方案的RISC標準。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

華清遠見(www.farsight.com.cn)是國內領先嵌入師培訓機構,2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關的長期就業(yè)培訓、短期高端培訓、師資培訓及企業(yè)員工內訓等業(yè)務外,其下屬研發(fā)中心還負責嵌入式、Android及物聯(lián)網方向的教學實驗平臺的研發(fā)及培訓教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網相關圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。