_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 | Architecture |
---|---|
_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. の許可を得て再現