有什么事吗?类似于MSVC的_udiv128()用于gcc?如果我使用__int128变量作为被除数,并有一个普通的“/"-divide,编译器不知道结果适合无符号long long,并调用一个外部函数,手动执行减法和移位除法。所以如果有东西就好了。如_udiv128()。
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单独为函数做了很多不必要的寄存器移动,但是如果函数是内联的,这些通常应该被优化掉。
1条答案
按热度按时间muk1a3rh1#
对于仅限x86_64的解决方案,您可以提供内联汇编函数:
从你的评论,我认为这是确定的,如果代码崩溃时,结果不适合64位。Godbolt演示:https://gcc.godbolt.org/z/qTbxx7vhT
内联汇编的另一个缺点是,如果结果可以在编译时计算,它就不会被优化掉。
gcc单独为函数做了很多不必要的寄存器移动,但是如果函数是内联的,这些通常应该被优化掉。