Sdílet prostřednictvím


_mm_extract_si64, _mm_extracti_si64

Specifické pro Microsoft

Vygeneruje extrq instrukce pro extrakci zadaných bitů z nízkého počtu 64 bitů prvního argumentu.

Syntaxe

__m128i _mm_extract_si64(
   __m128i Source,
   __m128i Descriptor
);
__m128i _mm_extracti_si64(
   __m128i Source,
   int Length,
   int Index
);

Parametry

Source
[v] 128bitové pole se vstupními daty v nižších 64 bitech.

Popisovač
[v] 128bitové pole, které popisuje bitové pole k extrakci.

Délka
[v] Celé číslo, které určuje délku pole, které se má extrahovat.

Index
[v] Celé číslo, které určuje index pole k extrakci.

Vrácená hodnota

128bitové pole s extrahovaným polem v nejméně významných bitech.

Požadavky

Vnitřní Architektura
_mm_extract_si64 SSE4a
_mm_extracti_si64 SSE4a

Hlavičkový soubor<intrin.h>

Poznámky

Tyto vnitřní objekty generují extrq instrukce pro extrakci bitů ze zdroje. Existují dvě verze: _mm_extracti_si64 jedná se o okamžitou verzi, která _mm_extract_si64 není okamžitá. Každá verze extrahuje z bitového pole Source bitové pole definované jeho 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 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, extrahují se bity 63:0 zdroje . Pokud je délka pole nula, ale bitový index není nula, výsledky se nedefinují.

Při volání _mm_extract_si64obsahuje popisovač index v bitech 13:8 a délku pole dat, která se mají extrahovat v bitech 5:0.

Pokud voláte _mm_extracti_si64 argumenty, které kompilátor nemůže určit, aby byly celočíselné konstanty, kompilátor generuje kód, který tyto hodnoty zabalí do registru XMM (popisovač) a zavolá _mm_extract_si64.

Chcete-li určit podporu hardwaru extrq pro instrukce, zavolejte __cpuid vnitřní s InfoType=0x80000001 a zkontrolujte bit 6 z CPUInfo[2] (ECX). Tento bit bude 1, pokud je instrukce podporovaná, a v opačném případě 0. Pokud spustíte kód, který používá tento vnitřní hardware, který nepodporuje extrq 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];
} source, descriptor, result1, result2, result3;

int
main()
{
    source.ui64[0] =     0xfedcba9876543210ll;
    descriptor.ui64[0] = 0x0000000000000b1bll;

    result1.m = _mm_extract_si64 (source.m, descriptor.m);
    result2.m = _mm_extracti_si64(source.m, 27, 11);
    result3.ui64[0] = (source.ui64[0] >> 11) & 0x7ffffff;

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;
}
result1 = 0x30eca86
result2 = 0x30eca86
result3 = 0x30eca86

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_insert_si64, _mm_inserti_si64
Vnitřní funkce kompilátoru