具有 32/16 位除法的处理器上的 64/32 位除法
Posted
技术标签:
【中文标题】具有 32/16 位除法的处理器上的 64/32 位除法【英文标题】:64/32-bit division on a processor with 32/16-bit division 【发布时间】:2011-01-23 01:52:29 【问题描述】:My processor,一个没有 FPU 和整数数学的小型 16 位微控制器,只有 16/16 除法和 32/16 除法,都需要 18 个周期。目前我正在使用一个非常慢的软件程序(约 7,500 个周期)来进行 64/32 除法。有没有办法使用这些除法引擎来计算 64/32 除法?类似于我已经使用 16x16 乘法器和加法器来计算 32x32 乘法?我正在使用 C,但可以使用任何关于如何完成的一般解释......我希望目标是
【问题讨论】:
那是什么语言?在大多数(如果不是全部)语言中,双/单与 FPU 一起工作,而且速度非常快......除非我在这里遗漏了一些东西 我认为他说的是整数除法,而不是浮点除法 你试过用谷歌搜索计算机除法算法吗?有很多。 64/32 除法的商并不总是适合 32 位。 @Thomas O:你确定结果是 64 位的吗?刚刚阅读了reference manual,它说结果中大于 16 位的 32/16 div 会导致意外结果。我假设使用该指令的 64/32 div 的任何简单实现都会遇到类似的问题,结果 >32 位。 【参考方案1】:参见“Hacker's Delight”,多词分割(第 140-145 页)。
基本概念(回到 Knuth)是用 base-65536 术语来考虑您的问题。那么你有一个 4 位乘 2 位除法问题,以 2/1 位除法作为基元。
C 代码在这里:https://github.com/hcs0/Hackers-Delight/blob/master/divmnu.c.txt
【讨论】:
链接腐烂:-(【参考方案2】:我的 Knuth(计算机编程艺术)的副本正在工作,所以我要到星期一才能查看它,但那将是我的第一个来源。它有一整节是关于算术的。
编辑:您关于“16/16 除法和 32/16 除法都需要 18 个周期”的帖子。 -- dsPIC 在汇编中有条件减法运算。考虑将其用作您的计算原语。
还要注意,如果 X = XH * 232 + XL 和 D = DH * 216 + DL,那么如果您正在寻找
(Q,R) = X/D 其中 X = Q * D + R
其中 Q = QH * 216 + QL,R = RH * 216 + RL,然后
XH * 232 + XL = DH * QH * 232 + (DL * QH + DH * QL) * 216 + (DL * QL) + RH * 216 + RL
这建议(通过查看高 32 位的术语)使用以下过程,类似于长除法:
-
(QH, R0) = XH / (DH+1) -> XH = QH * (DH+1) + R0 [32/16 除数]
R1 = X - (QH * 216) * D [需要 16*32 乘法、左移 16 和 64 位减法]
计算 R1' = R1 - D * 216
当 R1' >= 0 时,将 QH 向上调整 1,设置 R1 = R1',然后转到第 3 步
(QL, R2) = (R1 >> 16) / (DH+1) -> R1 = QL * (DH+1) + R2 [32/16 除数]
R3 = R1 - (QL * D) [需要 16*32 乘法和 48 位减法]
计算 R3' = R3 - D
当 R3' >= 0 时,将 QL 向上调整 1,设置 R3 = R3',然后转到第 7 步
您的 32 位商是对 (QH,QL),32 位余数是 R3。
(这里假设商不大于 32 位,需要提前知道,并且可以方便地提前检查。)
【讨论】:
感谢这个算法。我将不得不考虑如何在 C 中实现它。 这行得通,但有一些注意事项。首先,它是 64/32=32 位除法,而不是 64/32=64,因此XH>=D
的情况应该被拒绝为溢出(它也捕获除以零)。其次,DH=0xFFFF
的情况在DH+1
上产生溢出(步骤 1 和 5),它不再是 16 位长并且不能使用内置除法(但如果将其视为可以使用移位代替特殊情况)。第三,循环的迭代次数有时可以达到数千,这是不切实际的。我相信后者可以通过 Knuth 算法中的标准化步骤来解决。【参考方案3】:
起点是: D. Knuth,计算机编程艺术第 2 卷,第 4.3.1 节,算法 D
但我想你可能需要优化算法。
【讨论】:
【参考方案4】:你可能想看看Booth's Algorithm
(http://www.scribd.com/doc/3132888/Booths-Algorithm-Multiplication-Division)。
您想要的部分大约在页面下方的 1/2 处。
自从我上 VLSI 课程以来,我就没有看过这个,但是,这可能是你最好的选择,如果可能的话,你可能想在汇编中这样做,尽可能优化它,如果你会经常调用它.
基本上涉及移位和加减。
【讨论】:
@Jason S - 如果你看文章,也可以用于除法。以上是关于具有 32/16 位除法的处理器上的 64/32 位除法的主要内容,如果未能解决你的问题,请参考以下文章