mulx 指令的内在特征

Z b*_*son 3 x86 gcc icc intrinsics bmi

mulx指令是从 Haswell 处理器开始随 BMI2 指令集引入的。

根据英特尔的文档,应该有一个内在的mulx

unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);
Run Code Online (Sandbox Code Playgroud)

然而,我在BMI2 或一般情况下的英特尔在线内在指南中没有发现这样的内在。不过,我确实从 ADX 指令集中找到了 addcarry 内在函数。

根据此链接,内在是mulx_u64,但我也没有找到那个。

MSVC 在 MSVC 2005 中添加了_umul128 内在函数,但这只产生mul而不产生mulx(我不知道如何在 MSVC 中启用 BMI2)。

我可以在 GCC 中mulx使用(或) 间接生成指令,但我更喜欢使用内在函数更直接地执行此操作。__int128-mbmi2-march=haswell

为什么 ADX 内在函数存在,但不存在英特尔文档mulx中定义的for ?

Ano*_*tel 5

为 64 位整数乘法生成 mulx 指令的内在函数是 _mulx_u64()。下面是一个相同的例子:

    #include <stdio.h> 
    int main() 
    { 
        unsigned __int64 a = 0x0fffffffffffffff; 
        unsigned __int64 b = 0xf0000000; 
        unsigned __int64 c, d; 
        d = _mulx_u64(a, b, &c); 
        printf_s("%#I64x * %#I64x = %#I64x%I64x\n", a, b, c, d); 
    }
Run Code Online (Sandbox Code Playgroud)

变量“c”将保存结果的高 64 位,变量“d”将保存结果的低 64 位。Microsoft Visual Studio 编译器也支持此内在函数。我们正在努力使用正确的内在更新白皮书(新指令支持大整数算术)。谢谢让我们注意到这个。