有什么事吗?类似于GCC的_udiv128?

hrirmatl  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(99)

有什么事吗?类似于MSVC的_udiv128()用于gcc?如果我使用__int128变量作为被除数,并有一个普通的“/"-divide,编译器不知道结果适合无符号long long,并调用一个外部函数,手动执行减法和移位除法。所以如果有东西就好了。如_udiv128()。

muk1a3rh

muk1a3rh1#

对于仅限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单独为函数做了很多不必要的寄存器移动,但是如果函数是内联的,这些通常应该被优化掉。

相关问题