3

このmulx命令は、Haswell プロセッサから始まる BMI2 命令セットで導入されました。

Intelのドキュメントによると、組み込みのmulx

unsigned __int64 umul128(unsigned __int64 a, unsigned __int64 b, unsigned __int64 * hi);

ただし、BMI2または一般に、 Intelの組み込みガイドオンラインからそのような組み込みは見つかりません。ただし、ADX 命令セットから addcarry 組み込み関数が見つかります。

このリンクによると、本質的なものはmulx_u64ありますが、それも見つかりません。

MSVC は MSVC 2005 に_umul128 組み込み関数を追加しましたが、それは生成するだけで生成mulしませんmulx(MSVC で BMI2 を有効にする方法がわかりません)。

(または) を使用して GCC でmulx間接的に命令を生成できますが、組み込みを使用してより直接的に行うことをお勧めします。__int128-mbmi2-march=haswell

ADX 組み込み関数が存在するのに、 Intel のドキュメントmulxで定義されているものがないのはなぜですか?

4

1 に答える 1

4

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 コンパイラでもサポートされています。ホワイト ペーパー (New Instructions Support Large Integer Arithmetic) を適切な組み込み関数で更新する作業を行っています。ご報告いただきありがとうございます。

于 2015-04-09T21:19:29.227 に答える