_mm_extract_si64、_mm_extracti_si64

Microsoft 固有の仕様

第 1 引数の下位 64 ビットから指定したビットを抽出する extrq 命令を生成します。

構文

__m128i _mm_extract_si64(
   __m128i Source,
   __m128i Descriptor
);
__m128i _mm_extracti_si64(
   __m128i Source,
   int Length,
   int Index
);

パラメーター

ソース
[in] 下位 64 ビットの入力データを含む 128 ビット フィールド。

ディスクリプタ
[in] 抽出するビット フィールドを記述する 128 ビット フィールド。

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

インデックス
[in] 抽出するフィールドの長さを指定する整数

戻り値

抽出されたフィールドを最下位ビットに持つ 128 ビットのフィールド。

要件

Intrinsic Architecture
_mm_extract_si64 SSE4a
_mm_extracti_si64 SSE4a

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

解説

これらの組込み関数は、ソース からビットを抽出する extrq 命令を生成します。 2 つのバージョンがあります。_mm_extracti_si64 はイミディエイト バージョンであり、_mm_extract_si64 はイミディエイトではないバージョンです。 各バージョンはSource から、その長さと最下位ビットのインデックスで定義されるビットフィールドを抽出します。 長さとインデックスの値は mod 64 であるため、-1 と 127 の両方が 63 として解釈されます。 (縮小) インデックスと (縮小) フィールドの長さの合計が 64 を超える場合、結果は未定義になります。 フィールド長の値が 0 の場合は、64 と解釈されます。 フィールド長とビット インデックスの両方が 0 の場合は、Source のビット 63:0 が抽出されます。 フィールドの長さが 0 で、ビット インデックスが 0 以外の場合、結果は未定義になります。

_mm_extract_si64 の呼び出しでは、Descriptor にはビット 13:8 にインデックス、ビット 5:0 に抽出されるデータのフィールド長を含んでいます。

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

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

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

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source, descriptor, result1, result2, result3;

int
main()
{
    source.ui64[0] =     0xfedcba9876543210ll;
    descriptor.ui64[0] = 0x0000000000000b1bll;

    result1.m = _mm_extract_si64 (source.m, descriptor.m);
    result2.m = _mm_extracti_si64(source.m, 27, 11);
    result3.ui64[0] = (source.ui64[0] >> 11) & 0x7ffffff;

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

Microsoft 固有の仕様はここまで

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

関連項目

_mm_insert_si64、_mm_inserti_si64
コンパイラの組み込み