【发布时间】: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