具有32/16位除法的处理器上的64/32位除法

时间:2011-01-23 01:52:29

标签: algorithm optimization division

My processor,一个没有FPU和整数数学的小型16位微控制器只有16/16分频和32/16分频,都需要18个周期。目前我正在使用一个非常慢的软件程序(约7,500个周期)进行64/32分割。有没有办法使用这些分区引擎来计算64/32分区?类似于我已经使用16x16乘法器和加法器来计算32x32乘法?我正在使用C但可以使用任何关于如何完成的一般性解释......我希望能够以<200周期为目标(如果可能的话)。

4 个答案:

答案 0 :(得分:11)

参见“Hacker's Delight”,多字部门(第140-145页)。

基本概念(回到Knuth)是以base-65536术语来思考你的问题。然后你有一个4位数2位数的除法问题,2/1数字除法作为基元。

C代码在这里:http://www.hackersdelight.org/hdcodetxt/divmnu.c.txt

答案 1 :(得分:4)

我的Knuth(计算机程序设计艺术)的副本正在运作,所以直到星期一才能检查它,但这将是我的第一个来源。它有关于算术的整个部分。


编辑:关于“16/16师和32/16师这两个周期都需要18个周期”的帖子。 - dsPIC在汇编中具有条件减法运算。考虑使用它作为计算原语。

另请注意,如果X = XH * 2 32 + XL且D = DH * 2 16 + DL,那么如果您正在寻找

(Q,R)= X / D,其中X = Q * D + R

其中Q = QH * 2 16 + QL,R = RH * 2 16 + RL,那么

XH * 2 32 + XL = DH * QH * 2 32 +(DL * QH + DH * QL)* 2 16 +(DL * QL)+ RH * 2 16 + RL

这表明(通过查看高32位的术语)使用以下过程,类似于长除法:

  1. (QH,R0)= XH /(DH + 1) - > XH = QH *(DH + 1)+ R0 [32/16分割]
  2. R1 = X - (QH * 2 16 )* D [需要16 * 32乘法,左移16,减去64位]
  3. 计算R1'= R1-D * 2 16
  4. 当R1'> = 0时,将QH向上调整1,设置R1 = R1',并转到步骤3
  5. (QL,R2)=(R1>&gt; 16)/(DH + 1) - > R1 = QL *(DH + 1)+ R2 [32/16分割]
  6. R3 = R1 - (QL * D)[需要16 * 32乘法和48位减法]
  7. 计算R3'= R3-D
  8. 当R3'> = 0时,将QL向上调整1,设置R3 = R3',并转到步骤7
  9. 你的32位商是对(QH,QL),32位余数是R3。

    (这假设商不大于32位,您需要提前知道,并且可以提前轻松检查。)

答案 2 :(得分:1)

起点是: D. Knuth,计算机程序设计的第2卷,第4.3.1节,算法D

但我想你可能需要优化算法。

答案 3 :(得分:1)

您可能需要查看Booth's Algorithmhttp://www.scribd.com/doc/3132888/Booths-Algorithm-Multiplication-Division)。

你想要的部分大约是页面的1/2。

自从我的VLSI课以来,我没有看过这个,但是,这可能是你最好的选择,如果可能的话你可能想要在装配中这样做,尽可能地优化它,如果你经常这样做的话

基本上涉及转移,增加或减少。