_mm_insert_si64, _mm_inserti_si64
Seção específica da Microsoft
Gera a instrução insertq
para inserir bits do segundo operando no primeiro operando.
Sintaxe
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2
int Length,
int Index
);
Parâmetros
Source1
[in] Um campo de 128 bits que tem dados de entrada nos 64 bits inferiores, nos quais um campo será inserido.
Source2
[in] Um campo de 128 bits que tem os dados a serem inseridos em seus bits baixos. Para _mm_insert_si64
, também contém um descritor de campo nos bits superiores.
Comprimento
[in] Uma constante de inteiro que especifica o comprimento do campo a ser inserido.
Index
[in] Uma constante de inteiro que especifica o índice do bit menos significativo do campo no qual os dados serão inseridos.
Valor retornado
Um campo de 128 bits, cujos 64 bits inferiores contêm os 64 bits baixos originais de Source1, com o campo de bits especificado substituído pelos bits baixos de Source2. Os 64 bits superiores do valor retornado são indefinidos.
Requisitos
Intrinsic | Arquitetura |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Arquivo de cabeçalho<intrin.h>
Comentários
Esses intrínsecos geram a instrução insertq
para inserir bits de Source2 em Source1. Há duas versões: _mm_inserti_si64
é a versão imediata, e _mm_insert_si64
é a não imediata. Cada versão extrai um campo de bits de um determinado comprimento de Source2 e insere-o em Source1. Os bits extraídos são os bits menos significativos de Source2. O campo Source1 no qual esses bits serão inseridos é definido pelo comprimento e pelo índice de seu bit menos significativo. 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 de bits (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 comprimento do campo e o índice de bits forem zero, os bits 63:0 de Source2 serão inseridos em Source1. Se o comprimento do campo for zero, mas o índice de bits não for zero, os resultados serão indefinidos.
Em uma chamada para _mm_insert_si64, o comprimento do campo está contido nos bits 77:72 de Source2 e o índice, nos bits 69:64.
Se você chamar _mm_inserti_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 e chamar _mm_insert_si64
.
Para determinar o suporte de hardware para a instrução insertq
, chame o intrínseco __cpuid
com InfoType=0x80000001
e verifique o bit 6 de CPUInfo[2] (ECX)
. Esse bit será 1 se a instrução for compatível e, caso contrário, 0. Se você executar código que usa o intrínseco em hardware que não dá suporte à instrução insertq
, 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];
} 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
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_extract_si64, _mm_extracti_si64
Intrínsecos do compilador