_mm_insert_si64, _mm_inserti_si64
Microsoft-spezifisch
Generiert die insertq
Anweisung zum Einfügen von Bits aus dem zweiten Operanden in den ersten Operanden.
Syntax
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2
int Length,
int Index
);
Parameter
Quelle 1
[in] Ein 128-Bit-Feld mit Eingabedaten in seinen unteren 64 Bits, in das ein Feld eingefügt wird.
Quelle 2
[in] Ein 128-Bit-Feld, das die Daten enthält, die in die niedrigen Bits eingefügt werden sollen. Enthält _mm_insert_si64
außerdem einen Felddeskriptor in seinen hohen Bits.
Länge
[in] Eine ganze Zahl, die die Länge des einzufügenden Felds angibt.
Index
[in] Eine ganzzahlige Konstante, die den Index des am wenigsten signifikanten Bits des Felds angibt, in das Daten eingefügt werden.
Rückgabewert
Ein 128-Bit-Feld, dessen untere 64 Bit die ursprünglichen niedrigen 64 Bit von Source1 enthalten, wobei das angegebene Bitfeld durch die niedrigen Bits von Source2 ersetzt wird. Die oberen 64 Bit des Rückgabewerts sind nicht definiert.
Anforderungen
Intrinsic | Aufbau |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Headerdatei<intrin.h>
Hinweise
Diese systeminternen Elemente generieren die insertq
Anweisung zum Einfügen von Bits aus Source2 in Source1. Es gibt zwei Versionen: _mm_inserti_si64
, ist die sofortige Version und _mm_insert_si64
ist die nicht sofortige Version. Jede Version extrahiert ein Bitfeld einer bestimmten Länge aus Source2 und fügt es in Source1 ein. Die extrahierten Bits sind die am wenigsten signifikanten Bits von Source2. Das Feld Source1, in das diese Bits eingefügt werden, wird durch die Länge und den Index des am wenigsten signifikanten Bits definiert. Die Werte der Länge und des Indexes werden mod 64 verwendet, daher werden sowohl -1 als auch 127 als 63 interpretiert. Wenn die Summe des (reduzierten) Bitindex und der (reduzierten) Feldlänge größer als 64 ist, sind die Ergebnisse nicht definiert. Ein Wert von Null für die Feldlänge wird als 64 interpretiert. Wenn die Feldlänge und der Bitindex beide null sind, werden Bits 63:0 von Source2 in Source1 eingefügt. Wenn die Feldlänge null ist, der Bitindex jedoch ungleich Null ist, sind die Ergebnisse nicht definiert.
In einem Aufruf von _mm_insert_si64 ist die Feldlänge in Bits 77:72 von Source2 und dem Index in Bits 69:64 enthalten.
Wenn Sie mit Argumenten aufrufen _mm_inserti_si64
, die der Compiler nicht als ganzzahlige Konstanten ermitteln kann, generiert der Compiler Code, um diese Werte in ein XMM-Register zu packen und aufzurufen _mm_insert_si64
.
Um die Hardwareunterstützung für die insertq
Anweisung zu ermitteln, rufen Sie die __cpuid
systeminterne Verbindung auf InfoType=0x80000001
, und überprüfen Sie Bit 6 von CPUInfo[2] (ECX)
. Dieses Bit ist 1, wenn die Anweisung unterstützt wird, und 0 andernfalls. Wenn Sie Code ausführen, der die systeminterne Hardware verwendet, die die insertq
Anweisung nicht unterstützt, sind die Ergebnisse unvorhersehbar.
Beispiel
// 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
Ende Microsoft-spezifisch
Portions Copyright 2007 by Advanced Micro Devices, Inc. Alle Rechte vorbehalten. Vervielfältigt mit Erlaubnis von Advanced Micro Devices, Inc.