_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