[英]64 bit division on linux kernel
我正在寻找64位除法算法,但不依赖于GPL许可证。
我在Hacker Delight书中找到了以下代码(图9-5):
unsigned long long udivdi3(unsigned long long u,
unsigned long long v)
if (v >> 32 == 0) {
if (u >> 32 < v)
return DIVU(u, v) & 0xFFFFFFFF;
else {
.....
}
}
问题是“ return DIVU”计算的是64/32的除法,所以这不是我想要的。 该怎么办?
在Linux内核代码中执行64位分割似乎很棘手。 我不确定您是否遇到了同样的问题,但这就是我所知道的。
看来指令集不能完全处理64位算术运算。 看起来gcc发出了对辅助函数的调用。 例如,在ARM上,如果我写
t /= 86400;
其中t
是64位变量,我的内核构建失败,带有“ undefined reference to '__aeabi_ldivmod'
”。 显然,内核没有链接到存在诸如__aeabi_ldivmod
函数的完整C库。
解决方案似乎是改为调用do_div
。 do_div
实际上不是一个函数; 它是在特定于体系结构的头文件中声明的宏。 (对于ARM,它在arch/arm/include/asm/div64.h
有一个类似的文件。)
解决方案是将t /= 86400
替换为
(void)do_div(t, 86400);
do_div
将其第一个参数除以第二个参数就位,然后返回余数(在此示例中我将忽略)。
div64.h
有一个很大的注释, div64.h
告诉您有关do_div
以及如何使用它的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.