Compartir a través de


_mm_extract_si64, _mm_extracti_si64

Específicos de Microsoft

Genera la instrucción extrq para extraer bits especificados de los 64 bits inferiores de su primer argumento.

Sintaxis

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

Parámetros

Origen
[in] Campo de 128 bits con datos de entrada en sus 64 bits inferiores.

Descriptor
[in] Campo de 128 bits que describe el campo de bits que se va a extraer.

Duración
[in] Entero que especifica la longitud del campo que se va a extraer.

Índice
[in] Entero que especifica el índice del campo que se va a extraer.

Valor devuelto

Campo de 128 bits con el campo extraído en sus bits menos significativos.

Requisitos

Intrinsic Arquitectura
_mm_extract_si64 SSE4a
_mm_extracti_si64 SSE4a

Archivo de encabezado<intrin.h>

Comentarios

Estos intrínsecos generan la instrucción extrq para extraer bits de Source. Hay dos versiones: _mm_extracti_si64 es la versión inmediata y _mm_extract_si64 la que no es inmediata. Cada una de ellas extrae de Source un campo de bits definido por su longitud y el índice de su bit menos significativo. Los valores de la longitud y el índice son mod 64, por lo que tanto -1 como 127 se interpretan como 63. Si la suma del índice (reducido) y la longitud del campo (reducida) es mayor que 64, los resultados no son definidos. Un valor de cero para la longitud del campo se interpreta como 64. Si la longitud del campo y el índice de bits son cero, se extraen los bits 63:0 de Source. Si la longitud del campo es cero, pero el índice de bits es distinto de cero, los resultados son indefinidos.

En una llamada a _mm_extract_si64, Descriptor contiene el índice en bits 13:8 y la longitud del campo de los datos que se van a extraer en bits 5:0.

Si llama a _mm_extracti_si64 con argumentos que el compilador no puede determinar que son constantes de tipo entero, el compilador genera código para empaquetar esos valores en un registro XMM (Descriptor) y llamar a _mm_extract_si64.

Para determinar la compatibilidad de hardware con la instrucción extrq, llame al intrínseco __cpuid con InfoType=0x80000001 y compruebe el bit 6 de CPUInfo[2] (ECX). Este bit será 1 si se admite la instrucción y 0 de lo contrario. Si ejecuta código que usa este hardware intrínseco que no admite la instrucción extrq, los resultados son impredecibles.

Ejemplo

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

FIN de Específicos de Microsoft

Copyright 2007 de Advanced Micro Devices, Inc en determinadas secciones. Todos los derechos reservados. Reproducido con el permiso de Advanced Micro Devices, Inc.

Consulte también

_mm_insert_si64, _mm_inserti_si64
Intrínsecos del compilador