从Haswell处理器开始,BMI2指令集引入了mulx
指令。
根据Intel's documentation,mulx
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}}不存在?
答案 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编译器也支持此内在函数。我们正在努力使用正确的内在更新白皮书(新指令支持大整数算术)。感谢您引起我们的注意。