_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 | Sistem |
---|---|
_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.