Dela via


_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_si64innehå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.

Se även

_mm_extract_si64, _mm_extracti_si64
Kompilatorn är inbyggd