math - 如何使用 32 位除法指令执行 64 位除法?

标签 math assembly cpu-architecture fixed-point integer-division

这是(AFAIK)this general topic 中的一个具体问题.

这是情况:

我有一个基于 32 位 RISC 微 Controller (NEC V810 的变体)的嵌入式系统(一个视频游戏控制台)。我想写一个定点数学库。我读了 this article ,但随附的源代码是用 386 汇编编写的,因此既不能直接使用也不能轻易修改。

V810内置了整数乘除法,但是我想用上面文章中提到的18.14格式。这需要将 64 位 int 除以 32 位 int,而 V810 仅执行(有符号或无符号)32 位/32 位除法(产生 32 位商和 32 位余数)。

所以,我的问题是:如何用 32 位/32 位除法模拟 64 位/32 位除法(以允许对被除数进行预移位)?或者,从另一种角度来看问题,使用标准 32 位算术/逻辑运算将 18.14 定点除以另一个定点的最佳方法是什么? (“最佳”表示最快、最小或两者兼有)。

代数、(V810)汇编和伪代码都很好。我将从 C 调用代码。

提前致谢!

编辑:不知何故我错过了 this question ...然而,它仍然需要一些修改才能变得 super 高效(它必须比 v810 提供的浮点 div 更快,尽管它可能已经......),所以请随意做我的工作为我换取声望点 ;) (当然还有我的图书馆文档中的功劳)。

最佳答案

GCC 对很多处理器都有这样的例程,名为 _divdi3(通常使用常见的 divmod 调用来实现)。 Here's one .一些 Unix 内核也有一个实现,例如FreeBSD .

关于math - 如何使用 32 位除法指令执行 64 位除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3572409/

相关文章:

wpf - 在 XAML 中从菱形的偏斜因子创建偏斜 AngleY

ios - 如何使用 dx 和 dy(导数)创建 Swift CGVector?

java - 尝试计算斜率时得到 0

cpu-architecture - 像 x86 这样的指令集会更新吗?如果是这样,如何保证向后兼容性?

hardware - 字节如何映射到小端系统上的 AXI4 总线

javascript - 指定 Math.atan2 的来源

c - 汇编语言到 C 问题与寄存器

c++ - 内联汇编语言

assembly - 在不使用C库的情况下以0xb8000显示文本视频存储器

linux - 内核如何知道物理内存基址?