为什么64位除法要用do_div?

leslielg 2017-07-14 03:32:01
为什么? 直接用 / 不行么?
...全文
1510 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloudblaze 2017-07-17
  • 打赏
  • 举报
回复
我也只是猜测,不是很确定,或许是我的编译参数用错了。 我在我的代码中尝试了一下,64位除法虽然是用/操作符,但底层实际调用了“__divdi3”这个函数,而在ffreestanding的独立编译环境下这个函数是不存在的。32位除法不存在这个问题。
leslielg 2017-07-17
  • 打赏
  • 举报
回复
引用 3 楼 leslielg 的回复:
[quote=引用 1 楼 cloudblaze 的回复:] 我也只是猜测,不是很确定,或许是我的编译参数用错了。 我在我的代码中尝试了一下,64位除法虽然是用/操作符,但底层实际调用了“__divdi3”这个函数,而在ffreestanding的独立编译环境下这个函数是不存在的。32位除法不存在这个问题。
唯一一个可见的好处是do_div可以做一次除法就同时返回商和余数[/quote] 然而如果在很近的位置同时用到了/ 和 %, gcc编译器会优化为只调用一次udiv指令而为这两句C语句分别提供商和余数。 arm gcc 6.3, 参数-O1和-O2都会做这样的优化
leslielg 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 cloudblaze 的回复:
我也只是猜测,不是很确定,或许是我的编译参数用错了。 我在我的代码中尝试了一下,64位除法虽然是用/操作符,但底层实际调用了“__divdi3”这个函数,而在ffreestanding的独立编译环境下这个函数是不存在的。32位除法不存在这个问题。
唯一一个可见的好处是do_div可以做一次除法就同时返回商和余数
leslielg 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 cloudblaze 的回复:
我也只是猜测,不是很确定,或许是我的编译参数用错了。 我在我的代码中尝试了一下,64位除法虽然是用/操作符,但底层实际调用了“__divdi3”这个函数,而在ffreestanding的独立编译环境下这个函数是不存在的。32位除法不存在这个问题。
我在arm64环境下,链接参数有-nostdlib,直接用 / 是可以编译链接的。生成的汇编代码用的 udiv 指令做64位的除法。 是不是现在的64位CPU上,包括x86和arm,都不再需要用do_div了?

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧