_mm_insert_si64, _mm_inserti_si64
Específicos do Microsoft
Gera o insertq instruções para inserir os bits de seu segundo operando em seu primeiro operando.
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2
int Length,
int Index
);
Parâmetros
[in]Source1
Um campo de 128 bits com dados de entrada de 64 bits inferiores, no qual um campo será inserido.[in]Source2
Um campo de 128 bits com os dados para inserir em seus bits baixas. Para _mm_insert_si64, também contém um descritor de campo de bits altas.[in]Length
Uma constante de inteiro que especifica o comprimento do campo para inserir.[in]Index
Uma constante de inteiro que especifica o índice do bit menos significativo do campo no qual os dados serão inseridos.
Valor de retorno
Um campo de 128 bits cujos 64 bits inferiores contêm os 64 bits do baixos originais Source1 com o campo de bits especificada substituído por bits baixos de Source2. 64 Bits superiores de valor de retorno é indefinidos.
Requisitos
Intrínseca |
Arquitetura |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Arquivo de cabeçalho <intrin.h>
Comentários
Nesse intrínsecas gera o insertq instrução inserir bits de Source2 em Source1. Há duas versões intrínsecas: _mm_inserti_si64, é a versão imediata e _mm_insert_si64 é o não-imediatos. Cada versão extrai um campo de bits de um determinado período de origem2 e insere origem1. Os bits extraídos são os bits menos significativos de origem2. Origem1 o campo no qual esses bits serão inseridos é definido o comprimento e o índice do bit menos significativo. Os valores de comprimento e índice são tirados mod 64, portanto, -1 e 127 são interpretados como 63. Se o índice de bit (reduzido) e o comprimento do campo (menor) a soma é maior que 64, os resultados são indefinidos. Um valor de zero para o comprimento do campo é interpretado como 64. Se o índice de bit e de comprimento de campo forem ambos zero, 63:0 de bits de Source2 inserido em Source1. Se o comprimento do campo é zero, mas o índice de bit é diferente de zero, os resultados são indefinidos.
Em uma chamada para _mm_insert_si64, o comprimento do campo está contido em 77:72 bits de origem2 e o índice de bits 69:64.
Se você chamar _mm_inserti_si64com argumentos que o compilador não pode determinar constantes de inteiro, o compilador gera código pack esses valores em um registro XMM e chamar _mm_insert_si64.
Para determinar o suporte de hardware para o insertq chamada de instrução do __cpuid intrínseca com InfoType=0x80000001 e verificar o bit 6 do CPUInfo[2] (ECX). Esse bit será 1 se a instrução for aceito e 0 caso contrário. Se você executa código que usa intrínseca neste hardware não oferece suporte a insertq as instruções, os resultados sã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;
}
END Microsoft específicos
Copyright 2007 pela Advanced Micro dispositivos, Inc. todos os direitos reservados. Reproduzido com permissão do Advanced Micro dispositivos, Inc.