有吗?类似于 gcc 的 _udiv128?

问题描述 投票:0回答:1

有什么吗?类似于 gcc 的 MSVC _udiv128() 吗?如果我使用 __int128 变量作为被除数并使用普通的“/”除法,编译器不知道结果是否适合 unsigned long long 并调用手动执行减法和移位除法的外部函数。所以如果能拥有某物就好了。就像_udiv128()。

gcc g++
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.