_mm_insert_si64, _mm_inserti_si64
Específicos de Microsoft
Genera la instrucción insertq
para insertar bits de su segundo operando en su primer operando.
Sintaxis
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2
int Length,
int Index
);
Parámetros
Source1
[in] Campo de 128 bits que tiene datos de entrada en sus 64 bits menos significativos, donde se insertará un campo.
Source2
[in] Campo de 128 bits que tiene los datos que se van a insertar en sus bits menos significativos. Para _mm_insert_si64
, también contiene un descriptor de campo en sus bits más significativos.
Duración
[in] Constante de tipo entero que especifica la longitud del campo que se va a insertar.
Índice
[in] Constante de tipo entero que especifica el índice del bit menos significativo del campo en el que se insertarán los datos.
Valor devuelto
Un campo de 128 bits, cuyos 64 bits menos significativos contienen los 64 bits menos significativos originales de Source1, con el campo de bits especificado reemplazado por los bits menos significativos de Source2. Los 64 bits más significativos del valor devuelto no están definidos.
Requisitos
Intrinsic | Arquitectura |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Archivo de encabezado<intrin.h>
Comentarios
Estos intrínsecos generan la instrucción insertq
para insertar bits de Source2 en Source1. Hay dos versiones: _mm_inserti_si64
es la versión inmediata y _mm_insert_si64
, la que no es inmediata. Cada versión extrae un campo de bits de una longitud determinada de Source2 y lo inserta en Source1. Los bits extraídos son los bits menos significativos de Source2. El campo Source1 en el que se insertarán estos bits se define mediante la 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 de bits (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, los bits 63:0 de Source2 se insertan en Source1. Si la longitud del campo es cero, pero el índice de bits es distinto de cero, los resultados no son definidos.
En una llamada a _mm_insert_si64, la longitud del campo se encuentra en los bits 77:72 de Source2 y el índice, en los bits 69:64.
Si llama a _mm_inserti_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 y llamar a _mm_insert_si64
.
Para determinar la compatibilidad de hardware con la instrucción insertq
, llame al intrínseco __cpuid
con InfoType=0x80000001
y compruebe el bit 6 de CPUInfo[2] (ECX)
. Este bit es 1 si se admite la instrucción y 0 en caso contrario. Si ejecuta código que usa el intrínseco en hardware que no admite la instrucción insertq
, 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];
} 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
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_extract_si64, _mm_extracti_si64
Intrínsecos del compilador