具有 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 位除法的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#CCNA学习记录6

具有浮点运算的一致整数除法

将ip转换为二进制

导致除法溢出错误 (x86)

android驱动开发第五章心得笔记

LED相关