Внутренняя для инструкции мулькса
Инструкция mulx
была введена с набором команд BMI2, начиная с процессора Haswell.
Согласно документации Intel, для mulx
unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);
Тем не менее, я не нахожу такого встроенного в встроенного онлайн-руководства Intel под BMI2 или вообще. Тем не менее, я обнаружил, что intrinsics addcarry из набора инструкций ADX.
Согласно эта ссылка, intrinsic is mulx_u64
, но я тоже не нахожу его.
MSVC добавила _ umul128 intrinsic в MSVC 2005, но только производит mul
, а не mulx
(и я понятия не имею, как включить BMI2 в MSVC).
Я могу сделать инструкцию mulx
косвенно используя __int128
в GCC с помощью -mbmi2
(или -march=haswell
), но я бы предпочел сделать это более непосредственно с помощью встроенного.
Почему существуют встроенные функции ADX, но не для mulx
, как определено в документации Intel?
Ответы
Ответ 1
Внутренний, который генерирует инструкцию mulx для 64-битного умножения целых чисел - _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 Compiler. Мы работаем над обновлением белой бумаги (New Instructions Support Large Integer Arithmetic) с правильным внутренним. Спасибо, что привлекли наше внимание.