Z b*_*son 3 x86 gcc icc intrinsics bmi
该mulx指令是从 Haswell 处理器开始随 BMI2 指令集引入的。
根据英特尔的文档,应该有一个内在的mulx
unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);
Run Code Online (Sandbox Code Playgroud)
然而,我在BMI2 或一般情况下的英特尔在线内在指南中没有发现这样的内在。不过,我确实从 ADX 指令集中找到了 addcarry 内在函数。
根据此链接,内在是mulx_u64,但我也没有找到那个。
MSVC 在 MSVC 2005 中添加了_umul128 内在函数,但这只产生mul而不产生mulx(我不知道如何在 MSVC 中启用 BMI2)。
我可以在 GCC 中mulx使用(或) 间接生成指令,但我更喜欢使用内在函数更直接地执行此操作。__int128-mbmi2-march=haswell
为什么 ADX 内在函数存在,但不存在英特尔文档mulx中定义的for ?
为 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);
}
Run Code Online (Sandbox Code Playgroud)
变量“c”将保存结果的高 64 位,变量“d”将保存结果的低 64 位。Microsoft Visual Studio 编译器也支持此内在函数。我们正在努力使用正确的内在更新白皮书(新指令支持大整数算术)。谢谢让我们注意到这个。
| 归档时间: |
|
| 查看次数: |
3334 次 |
| 最近记录: |