Bagikan melalui


_mm_insert_si64, _mm_inserti_si64

Khusus Microsoft

insertq Menghasilkan instruksi untuk menyisipkan bit dari operand kedua ke dalam operand pertamanya.

Sintaks

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

Parameter

Sumber1
[di] Bidang 128-bit yang memiliki data input dalam 64 bit yang lebih rendah, tempat bidang akan disisipkan.

Sumber2
[di] Bidang 128-bit yang memiliki data untuk disisipkan dalam bit rendahnya. Untuk _mm_insert_si64, juga berisi deskriptor bidang dalam bit tingginya.

Panjang
[di] Konstanta bilangan bulat yang menentukan panjang bidang yang akan disisipkan.

Index
[di] Konstanta bilangan bulat yang menentukan indeks bit bidang yang paling tidak signifikan tempat data akan disisipkan.

Nilai hasil

Bidang 128-bit, yang 64 bit bawahnya berisi 64 bit rendah asli Source1, dengan bidang bit yang ditentukan digantikan oleh bit rendah Source2. 64 bit atas nilai pengembalian tidak ditentukan.

Persyaratan

Intrinsik Arsitektur
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

File header<intrin.h>

Keterangan

Intrinsik ini menghasilkan insertq instruksi untuk menyisipkan bit dari Source2 ke Source1. Ada dua versi: _mm_inserti_si64, adalah versi langsung, dan _mm_insert_si64 merupakan versi non-langsung. Setiap versi mengekstrak bidang bit dengan panjang tertentu dari Source2 dan menyisipkannya ke Sumber1. Bit yang diekstrak adalah bit Sumber2 yang paling tidak signifikan. Bidang Source1 tempat bit ini akan disisipkan didefinisikan oleh panjang dan indeks bit yang paling tidak signifikan. Nilai panjang dan indeks diambil mod 64, sehingga -1 dan 127 ditafsirkan sebagai 63. Jika jumlah indeks bit (berkurang) dan panjang bidang (berkurang) lebih besar dari 64, hasilnya tidak ditentukan. Nilai nol untuk panjang bidang ditafsirkan sebagai 64. Jika panjang bidang dan indeks bit keduanya nol, bit 63:0 dari Sumber2 dimasukkan ke dalam Sumber1. Jika panjang bidang adalah nol, tetapi indeks bit bukan nol, hasilnya tidak ditentukan.

Dalam panggilan ke _mm_insert_si64, panjang bidang terkandung dalam bit 77:72 dari Source2 dan indeks dalam bit 69:64.

Jika Anda memanggil _mm_inserti_si64 dengan argumen bahwa pengkompilasi tidak dapat menentukan untuk menjadi konstanta bilangan bulat, pengkompilasi menghasilkan kode untuk mengemas nilai tersebut ke dalam register XMM dan untuk memanggil _mm_insert_si64.

Untuk menentukan dukungan perangkat keras untuk insertq instruksi, panggil __cpuid intrinsik dengan InfoType=0x80000001 dan periksa bit 6 dari CPUInfo[2] (ECX). Bit ini adalah 1 jika instruksi didukung, dan 0 sebaliknya. Jika Anda menjalankan kode yang menggunakan intrinsik pada perangkat keras yang tidak mendukung insertq instruksi, hasilnya tidak dapat diprediksi.

Contoh

// 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 Khusus Microsoft

Bagian Hak Cipta 2007 oleh Perangkat Mikro Tingkat Lanjut, Inc. Hak cipta dilindungi undang-undang. Direproduksi dengan izin dari Advanced Micro Devices, Inc.

Baca juga

_mm_extract_si64, _mm_extracti_si64
Intrinsik pengkompilasi