分享方式:


_mm_insert_si64、_mm_inserti_si64

Microsoft 特定的

產生指令, insertq 以將第二個操作數中的位插入第一個操作數。

語法

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

參數

Source1
[in]128 位欄位欄位,其輸入數據位於其較低的 64 位,其中會插入欄位。

Source2
[in]具有數據要插入其低位的128位欄位欄位。 針對 _mm_insert_si64,也會在其高位中包含欄位描述元。

長度
[in]整數常數,指定要插入的欄位長度。

Index
[in]整數常數,指定要插入數據之字段之最小有效位的索引。

傳回值

128 位欄位,其較低的 64 位包含 Source1 的原始低 64 位,而指定的位字段則由 Source2低位取代。 傳回值的上層 64 位未定義。

需求

內建 架構
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

頭檔<intrin.h>

備註

這些內部函數會產生insertq指令,以將Source2中的位插入Source1。 有兩個版本: _mm_inserti_si64、是立即版本,而且 _mm_insert_si64 是非立即版本。 每個版本都會從Source2擷取指定長度的位欄位,並將其插入Source1。 擷取的位是Source2最小有效位。 要插入這些位的 Field1 字段是由長度和其最小有效位的索引所定義。 長度和索引的值會採用 mod 64,因此 -1 和 127 都會解譯為 63。 如果 (縮減) 位索引和 (縮減) 字段長度的總和大於 64,則結果為未定義。 欄位長度的零值會解譯為 64。 如果欄位長度和位索引都是零,則會將Source263:0位插入Source1。 如果欄位長度為零,但位索引為非零,則結果為未定義。

在呼叫 _mm_insert_si64 時,字段長度會包含在Source2的位77:72和位69:64中的索引中。

如果您使用編譯程式無法判斷為整數常數的自變數進行呼叫 _mm_inserti_si64 ,編譯程式會產生程式代碼,以將這些值封裝到 XMM 快取器中,並呼叫 _mm_insert_si64

若要判斷指令的硬體支援 insertq ,請使用呼叫 __cpuid 內部函數, InfoType=0x80000001 並檢查的 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

END Microsoft 特定的

部分著作權 2007 由 Advanced Micro Devices, Inc.保留所有權利。 由 Advanced Micro Devices, Inc. 的許可權重現。

另請參閱

_mm_extract_si64、_mm_extracti_si64
編譯程式內部函數