Sdílet prostřednictvím


_mm_insert_si64, _mm_inserti_si64

Specifické pro Microsoft

Vygeneruje insertq instrukce pro vložení bitů z druhého operandu do prvního operandu.

Syntaxe

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

Parametry

Zdroj 1
[v] 128bitové pole se vstupními daty v dolních 64 bitech, do kterého se vloží pole.

Zdroj2
[v] 128bitové pole s daty, která se mají vložit do svých nízkých bitů. Pro _mm_insert_si64, obsahuje také popisovač pole v jeho vysokých bitech.

Délka
[v] Celočíselná konstanta, která určuje délku pole, které se má vložit.

Index
[v] Celočíselná konstanta, která určuje index nejméně významného bitu pole, do kterého se budou data vkládat.

Vrácená hodnota

128bitové pole, jehož nižší 64 bitů obsahuje původní nízké 64bitové bity Source1, se zadaným bitovým polem nahrazeno nízkými bity Source2. Horních 64 bitů návratové hodnoty není definováno.

Požadavky

Vnitřní Architektura
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

Hlavičkový soubor<intrin.h>

Poznámky

Tyto vnitřní objekty generují insertq instrukce pro vložení bitů ze zdroje 2 do source1. Existují dvě verze: _mm_inserti_si64, je okamžitá verze a _mm_insert_si64 je ne okamžitá. Každá verze extrahuje bitové pole s danou délkou ze zdroje Source2 a vloží ho do Zdroje1. Extrahované bity jsou nejméně významné bity source2. Pole Zdroj1, do kterého budou tyto bity vloženy, je definována délkou a indexem jeho nejméně významného bitu. Hodnoty délky a indexu jsou převzaty mod 64, takže oba -1 a 127 jsou interpretovány jako 63. Pokud je součet (sníženého) indexu bitu a (zmenšené) délky pole větší než 64, výsledky nebudou definovány. Hodnota nuly pro délku pole se interpretuje jako 64. Pokud je délka pole i bitový index nula, vloží se do Zdroje1 bity 63:0 zdroje 2. Pokud je délka pole nula, ale bitový index není nula, výsledky se nedefinují.

Při volání _mm_insert_si64 je délka pole obsažena v bitech 77:72 Source2 a index v bitech 69:64.

Pokud voláte _mm_inserti_si64 argumenty, které kompilátor nedokáže určit, aby byly celočíselné konstanty, kompilátor vygeneruje kód, který tyto hodnoty zabalí do registru XMM a zavolá _mm_insert_si64.

Chcete-li určit podporu hardwaru insertq pro instrukce, zavolejte __cpuid vnitřní s InfoType=0x80000001 a zkontrolujte bit 6 z CPUInfo[2] (ECX). Tento bit je 1, pokud je instrukce podporovaná, a 0 jinak. Pokud spustíte kód, který používá vnitřní objekt na hardwaru, který nepodporuje insertq instrukce, budou výsledky nepředvídatelné.

Příklad

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

Parts Copyright 2007 by Advanced Micro Devices, Inc. Všechna práva vyhrazena. Reprodukováno s oprávněním společnosti Advanced Micro Devices, Inc.

Viz také

_mm_extract_si64, _mm_extracti_si64
Vnitřní funkce kompilátoru