【问题标题】:64-bit multiply/divide without 64-bit multiply or divide instructions64 位乘法/除法没有 64 位乘法或除法指令
【发布时间】:2020-04-15 04:01:34
【问题描述】:

我正在研究一个 Forth 实现,我遇到了对双单元算术(Forth 实现是 32 位)的需求,包括双单元乘法和除法/余数。但是,我正在为其开发的架构 ARM Cortex-M4 缺少 64x64 乘法或 64/64 除法/余数指令(它只有 32x32 乘法和 32/32 除法以及 32x32+64 乘法/累加指令)。

虽然我可以使用 32x64 乘法(因为 64x64 乘法可以用它来模拟无论如何都不会溢出的情况),并且对于某些事情 64/32 除法/余数就足够了,我希望至少有除了 32x64 乘法之外,还有一个完整的 64/64 除法/余数,所以我可以完全实现双单元算术。

【问题讨论】:

  • Fast bignum square computation Karatsuba 是你的朋友。无论如何,这里my ALU32 implementation 仅使用 32=16x16 操作进行 64=32x32 操作,因此您可以对两倍位宽执行相同操作...除法也存在,但我认为可以做得更好...
  • 就像您可以使用 32x32 创建任意大小的乘数一样(内存和闪存是您的限制),您也可以使用分隔符。就像您使用小学数学进行乘法运算一样,您可以进行除法运算,您从分子的 msnumber 开始,然后将分母从左到右遍历它。在这种情况下,除法应该比乘法更容易实现。或者您只需编写代码并让编译器/链接器插入自己优化的 64 位乘法或除法代码
  • 尝试一两行 C 来做更大的数学运算,然后看看编译器输出什么,然后如果你愿意的话直接调用那些。

标签: math arm 64-bit cortex-m forth


【解决方案1】:

您可以以 bigmath.f 库(或 another variant)为例 — Wil Baden 的双数运算。

定义了D*DU/MOD字。

关于许可证。我认为这段代码在公共领域。它作为参考实现发表在 Forth Dimensions1 中,作者在那里说:“要获得本文源代码的副本,请发送电子邮件请求 Stretching Forth #19: Double Number Arithmetic”。

对于DU/MOD 字,Wil Baden 还指出:“该算法基于 Knuth 在他的计算机编程艺术第 2 卷中的算法,简化为两格除数和两格除数”。

1 威尔巴登 (1998)。拉伸标准 Forth #19:双数算术。 第四维度 XIX.6 March-April 1998, pp. 33-34

page 4我们也可以阅读:

本期刊中包含的材料(但不是代码)的版权归文章的个人作者和 Forth Interest Group, Inc. 所有, [...] 但是,任何带有版权声明的代码都只能在版权所有者许可的情况下使用。

而且代码和文章似乎都没有任何版权声明。

【讨论】:

  • 谢谢。不幸的是,由于我打赌代码是在专有许可下,我不能直接使用或派生该代码。 (我的代码是 GPL3;我个人更喜欢 BSD3,但我从另一个 Forth 借用了 GPL3 的代码。)
  • 我认为,代码在公共领域。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多