Compartilhar via


_mm_extract_si64, _mm_extracti_si64

Seção específica da Microsoft

Gera a instrução extrq para extrair bits especificados dos 64 bits inferiores do primeiro argumento dela.

Sintaxe

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

Parâmetros

Origem
[in] Um campo de 128 bits com dados de entrada em seus 64 bits inferiores.

Descritor
[in] Um campo de 128 bits que descreve o campo de bits a ser extraído.

Comprimento
[in] Um inteiro que especifica o comprimento do campo a ser extraído.

Index
[in] Um inteiro que especifica o índice do campo a ser extraído

Retornar valor

Um campo de 128 bits com o campo extraído nos bits menos significativos dele.

Requisitos

Intrinsic Arquitetura
_mm_extract_si64 SSE4a
_mm_extracti_si64 SSE4a

Arquivo de cabeçalho<intrin.h>

Comentários

Esses intrínsecos geram a instrução extrq para extrair bits de Source. Há duas versões: _mm_extracti_si64 é a versão imediata e _mm_extract_si64 é a não imediata. Cada versão extrai de Source um campo de bits definido pelo comprimento dele e o índice do bit menos significativo dele. Os valores de comprimento e índice são submetidos a mod 64, portanto, tanto -1 quanto 127 são interpretados como 63. Se a soma do índice (reduzido) e do comprimento do campo (reduzido) for maior que 64, os resultados serão indefinidos. Um valor zero para o comprimento do campo é interpretado como 64. Se o índice de comprimento e bit do campo for zero, os bits 63:0 de Source serão extraídos. Se o comprimento do campo for zero, mas o índice de bits não for zero, os resultados serão indefinidos.

Em uma chamada a _mm_extract_si64, o Descriptor contém o índice nos bits 13:8 e o comprimento do campo dos dados a serem extraídos nos bits 5:0.

Se você chamar _mm_extracti_si64 com argumentos que o compilador não pode determinar como constantes inteiras, o compilador gerará código para empacotar esses valores em um registro XMM (Descriptor) e chamará _mm_extract_si64.

Para determinar o suporte de hardware para a instrução extrq, chame o intrínseco __cpuid com InfoType=0x80000001 e verifique o bit 6 de CPUInfo[2] (ECX). Se a instrução tiver suporte, esse bit será 1, caso contrário, 0. Se você executar o código que usa esse hardware intrínseco que não dá suporte à instrução extrq, os resultados serão imprevisíveis.

Exemplo

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

Fim da seção específica da Microsoft

Partes com Copyright 2007 da Advanced Micro Devices, Inc. Todos os direitos reservados. Reproduzido com permissão da Advanced Micro Devices, Inc.

Confira também

_mm_insert_si64, _mm_inserti_si64
Compilador intrínsecos