Partilhar via


_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.

Consulte também

Referência

_mm_extract_si64, _mm_extracti_si64

Intrínsecos do compilador