3

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

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

unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);

但是,我在 BMI2 下或一般情况下的英特尔内在指南中没有找到这样的内在指南。但是,我确实从 ADX 指令集中找到了 addcarry 内在函数。

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

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

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

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

4

1 回答 1

4

为 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 编译器也支持此内在函数。我们正在努力使用正确的内在函数更新白皮书(支持大整数运算的新指令)。谢谢让我们注意到这个。

于 2015-04-09T21:19:29.227 回答