有什么吗?类似于 gcc 的 MSVC _udiv128() 吗?如果我使用 __int128 变量作为被除数并使用普通的“/”除法,编译器不知道结果是否适合 unsigned long long 并调用手动执行减法和移位除法的外部函数。所以如果能拥有某物就好了。就像_udiv128()。
对于仅限 x86_64 的解决方案,您可以提供内联汇编函数:
#include <stdint.h>
uint64_t udiv128_64(__uint128_t a, uint64_t b)
{
asm inline("divq %1\n\t"
: "+A"(a)
: "r"(b)
: "cc");
return a;
}
从你的评论来看,如果结果不适合 64 位时代码崩溃,我认为这对你来说没问题。 Godbolt 演示:https://gcc.godbolt.org/z/qTbxx7vhT
内联汇编的另一个缺点是,如果可以在编译时计算结果,则它不会被优化。
gcc 仅针对该函数执行了许多不必要的寄存器移动,但如果函数是内联的,这些通常应该被优化掉。