mulx 指令的固有特性

intrinsic for the mulx instruction

从 Haswell 处理器开始,BMI2 指令集引入了 mulx 指令。

根据 Intel's documentation mulx

应该有一个内在函数
unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);

但是,我发现 Intel's intrinsic guide online 在 BMI2 下或一般情况下没有这样的内在特征。然而,我确实从 ADX 指令集中找到了 addcarry 内在函数。

根据 this link 的说法,内在的是 mulx_u64 但我也没有找到那个。

MSVC 在 MSVC 2005 中添加了一个 _umul128 intrinsic,但它只产生 mul 而不是 mulx(我不知道如何在 MSVC 中启用 BMI2)。

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

为什么存在 ADX 内在函数而不是 Intel's documentation 中定义的 mulx

为 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); 
    }

变量"c"将保存结果的高64位,变量"d"将保存结果的低64位。 Microsoft Visual Studio 编译器也支持此内在函数。我们正在努力使用正确的内在函数更新白皮书(新指令支持大整数运算)。感谢您提请我们注意此事。