Compartilhar via


_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