mulx指令的内在特征

时间:2015-03-23 09:38:06

标签: gcc x86 intrinsics icc bmi

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

根据Intel's documentationmulx

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

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

根据this link,内在因素是mulx_u64,但我也找不到。

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

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

为什么ADX内在函数存在但mulx中定义的{{1}}不存在?

1 个答案:

答案 0 :(得分:3)

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

变量&#34; c&#34;将保持结果的高64位和变量&#34; d&#34;将保留结果的低64位。 Microsoft Visual Studio编译器也支持此内在函数。我们正在努力使用正确的内在更新白皮书(新指令支持大整数算术)。感谢您引起我们的注意。