_mm_insert_si64、_mm_inserti_si64

Microsoft 固有の仕様

2 番目のオペランドのビットを最初のオペランドに挿入する insertq 命令を生成します。

構文

__m128i _mm_insert_si64(
   __m128i Source1,
   __m128i Source2
);
__m128i _mm_inserti_si64(
   __m128i Source1,
   __m128i Source2
   int Length,
   int Index
);

パラメーター

Source1
[in] フィールドが挿入される下位 64 ビットに入力データを含む 128 ビット フィールド。

Source2
[in] 挿入するデータを下位ビットに含む 128 ビット フィールド。 _mm_insert_si64 の場合、上位ビットにフィールド記述子も含まれます。

Length
[in] 挿入するフィールドの長さを指定する整数定数。

インデックス
[in] データが挿入されるフィールドの最下位ビットのインデックスを指定する整数定数。

戻り値

下位 64 ビットに Source1 の元の下位 64 ビットが含まれ、指定されたビット フィールドが Source2 の下位ビットで置き換えられた 128 ビット フィールド。 戻り値の上位 64 ビットは未定義です。

必要条件

Intrinsic アーキテクチャ
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

ヘッダー ファイル<intrin.h>

解説

これらの組み込みは、Source2 から Source1 にビットを挿入する insertq 命令を生成します。 2 つのバージョンがあります。_mm_inserti_si64 は即時バージョンであり、_mm_insert_si64 は非即時バージョンです。 各バージョンは、指定された長さのビット フィールドを Source2 から抽出して Source1 に挿入します。 抽出されるビットは、Source2 の最下位ビットです。 これらのビットが挿入されるフィールドである Source1 は、長さと最下位ビットのインデックスによって定義されます。 長さとインデックスの値は mod 64 であるため、-1 と 127 の両方が 63 として解釈されます。 (縮小) ビット インデックスと (縮小) フィールドの長さの合計が 64 を超える場合、結果は未定義になります。 フィールド長の値が 0 の場合は、64 と解釈されます。 フィールド長とビット インデックスが両方とも 0 の場合、Source2 のビット 63:0 が Source1 に挿入されます。 フィールドの長さが 0 で、ビット インデックスが 0 以外の場合、結果は未定義になります。

_mm_insert_si64 の呼び出しでは、フィールド長は Source2 のビット 77:72 に含まれ、インデックスはビット 69:64 に含まれます。

コンパイラが整数定数と判断できない引数を指定して _mm_inserti_si64 を呼び出した場合、コンパイラは、それらの値を XMM レジスタにパックして _mm_insert_si64 を呼び出すコードを生成します。

insertq 命令のハードウェア サポートを判断するには、InfoType=0x80000001__cpuid 組込み関数を呼び出し、CPUInfo[2] (ECX) のビット 6 を確認します。 命令がサポートされている場合、このビットは 1 になり、それ以外の場合は 0 になります。 組み込みが使用されているコードを insertq 命令がサポートされないハードウェアで実行すると、結果は予測できません。

// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source1, source2, source3, result1, result2, result3;

int
main()
{

    __int64 mask;

    source1.ui64[0] = 0xffffffffffffffffll;
    source2.ui64[0] = 0xfedcba9876543210ll;
    source2.ui64[1] = 0xc10;
    source3.ui64[0] = source2.ui64[0];

    result1.m = _mm_insert_si64 (source1.m, source2.m);
    result2.m = _mm_inserti_si64(source1.m, source3.m, 16, 12);
    mask = 0xffff << 12;
    mask = ~mask;
    result3.ui64[0] = (source1.ui64[0] & mask) |
                      ((source2.ui64[0] & 0xffff) << 12);

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;

}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff

Microsoft 固有の仕様はここまで

部分的著作権 2007 年、Advanced Micro Devices, Inc.、無断転載を禁じます。 Advanced Micro Devices, Inc. の許可を得て再現

関連項目

_mm_extract_si64、_mm_extracti_si64
コンパイラの組み込み