_mm_insert_si64, _mm_inserti_si64
Microsoft-specifika
Genererar den insertq
instruktionen för att infoga bitar från sin andra operande i sin första operande.
Syntax
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2,
int Length,
int Index
);
Parametrar
Source1
[i] Ett 128-bitarsfält som har indata i sina lägre 64 bitar, där ett fält infogas.
Source2
[i] Ett 128-bitarsfält som har data att infoga i sina låga bitar. För _mm_insert_si64
innehåller även en fältbeskrivning i dess höga bitar.
längd
[i] En heltalskonstant som anger längden på fältet som ska infogas.
Index
[i] En heltalskonstant som anger indexet för den minst betydande biten av fältet som data ska infogas i.
Returvärde
Ett 128-bitars fält, vars nedre 64 bitar innehåller de ursprungliga låga 64 bitarna av Source1, med det angivna bitfältet ersatt av de låga bitarna i Source2. De övre 64 bitarna av returvärdet är odefinierade.
Krav
Inneboende | Arkitektur |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
rubrikfil<intrin.h>
Anmärkningar
Dessa inbyggda egenskaper genererar insertq
instruktionen för att infoga bitar från Source2- i Source1-. Det finns två versioner: _mm_inserti_si64
, är den omedelbara versionen och _mm_insert_si64
är den icke-omedelbara. Varje version extraherar ett bitfält med en viss längd från Source2 och infogar det i Source1. De extraherade bitarna är de minst betydande bitarna av Source2. Fältet Source1 som dessa bitar ska infogas i definieras av längden och indexet för dess minst betydande bit. Värdena för längden och indexet tas mod 64, så både -1 och 127 tolkas som 63. Om summan av (reducerat) bitindex och (reducerad) fältlängd är större än 64, är resultatet odefinierat. Värdet noll för fältlängd tolkas som 64. Om fältlängden och bitindexet båda är noll infogas bitar 63:0 av Source2 i Source1. Om fältlängden är noll, men bitindexet inte är noll, är resultatet odefinierat.
I ett anrop till _mm_insert_si64 finns fältlängden i bitar 77:72 av Source2 och indexet i bitar 69:64.
Om du anropar _mm_inserti_si64
med argument som kompilatorn inte kan fastställa som heltalskonstanter genererar kompilatorn kod för att packa dessa värden i ett XMM-register och anropa _mm_insert_si64
.
Om du vill fastställa maskinvarustöd för insertq
-instruktionen anropar du __cpuid
som är inbyggd i InfoType=0x80000001
och kontrollerar bit 6 i CPUInfo[2] (ECX)
. Den här biten är 1 om instruktionen stöds och 0 i annat fall. Om du kör kod som använder den inbyggda maskinvaran som inte stöder insertq
instruktionen är resultatet oförutsägbart.
Exempel
// 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 Specific
Delar Copyright 2007 av Advanced Micro Devices, Inc. Alla rättigheter reserverade. Reproducerad med behörighet från Advanced Micro Devices, Inc.