实施
的最有效方法是什么?d=u / v
r=u mod v
对于ARM V7M指令集,其中u是无符号64位,v是无符号32位?
我特别感兴趣的是v是“规范化”的特殊情况,以便设置其高位。
我在Knuth“计算机编程艺术(第2卷)”中看到了各种选项,但是很难看到使用可用的V7M指令UMULL等实现这一点的最佳方法。
答案 0 :(得分:2)
(这与其他答案类似,只是从另一个角度来看)
ARM 32位工具链需要一个名为__aeabi_uldivmod
的函数实现来卸载此操作,可能您可以找到各种实现,其中一个特定来自clang
udivmoddi4.c,指向{{ 3}}(第3.2.3.7节)
答案 1 :(得分:0)
由于您的编译器几乎肯定支持64位数据类型,让编译器生成合适的代码有什么问题?编译器包含大量目标特定知识,可能会产生最佳结果。
假设:
uint64_t u = x ;
uint32_t v = y ;
然后:
uint64_t d = u / v ;
uint32_t r = u % v ;