Внутренняя для инструкции мулькса

Инструкция 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) с правильным внутренним. Спасибо, что привлекли наше внимание.