My processor,一个没有FPU和整数数学的小型16位微控制器只有16/16分频和32/16分频,都需要18个周期。目前我正在使用一个非常慢的软件程序(约7,500个周期)进行64/32分割。有没有办法使用这些分区引擎来计算64/32分区?类似于我已经使用16x16乘法器和加法器来计算32x32乘法?我正在使用C但可以使用任何关于如何完成的一般性解释......我希望能够以<200周期为目标(如果可能的话)。
答案 0 :(得分:11)
参见“Hacker's Delight”,多字部门(第140-145页)。
基本概念(回到Knuth)是以base-65536术语来思考你的问题。然后你有一个4位数2位数的除法问题,2/1数字除法作为基元。
答案 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位的术语)使用以下过程,类似于长除法:
你的32位商是对(QH,QL),32位余数是R3。
(这假设商不大于32位,您需要提前知道,并且可以提前轻松检查。)
答案 2 :(得分:1)
起点是: D. Knuth,计算机程序设计的第2卷,第4.3.1节,算法D
但我想你可能需要优化算法。
答案 3 :(得分:1)
您可能需要查看Booth's Algorithm
(http://www.scribd.com/doc/3132888/Booths-Algorithm-Multiplication-Division)。
你想要的部分大约是页面的1/2。
自从我的VLSI课以来,我没有看过这个,但是,这可能是你最好的选择,如果可能的话你可能想要在装配中这样做,尽可能地优化它,如果你经常这样做的话
基本上涉及转移,增加或减少。