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