Поделиться через


_mm_insert_si64, _mm_inserti_si64

Только для систем Microsoft

Создает инструкцию insertq ввод биты относительно второго операнда в свой первый операнд.

__m128i _mm_insert_si64(
   __m128i Source1,
   __m128i Source2
);
__m128i _mm_inserti_si64(
   __m128i Source1,
   __m128i Source2
   int Length,
   int Index
);

Параметры

  • [in]Source1
    Поле 128 бит с входными данными в его более низких 64 битов, в которые будет вставлено поле.

  • [входящий] Source2
    Поле 128 бит с данными, вставляемый в его установлены биты. Для _mm_insert_si64 также содержит дескриптор поля в его старших битов.

  • [входящий] Length
    Константа целое число, задающее длину поля для вставки.

  • [входящий] Index
    Константа целое число, указывающее индекс, значительно наименьшего битового поля, в которое будут вставлены данные.

Возвращаемое значение

Поле 128 бита, меньшие 64 содержат исходные младшие 64 бита Source1 с указанным полем заменило низкими битами Source2. Старшие 64 бита возвращаемого значения не определены.

Требования

Встроенный объект

Архитектура

_mm_insert_si64

SSE4a

_mm_inserti_si64

SSE4a

Файл заголовка <intrin.h>

Заметки

Этот встроенный создает инструкцию insertq вставить из Source2 биты в Source1. 2 Версии данного внутреннего элемента: _mm_inserti_si64, немедленная версия и _mm_insert_si64 non-немедленное одно. Каждая версия извлекает битового поля заданной длины из Source2 и вставляет ее в Source1. Извлеченные биты наименее значащие биты Source2. В поле Source1, эти биты будут вставлены соответствии с длиной и индексом его наименьшего значительно бит. Принимают значения длины и индексов mod 64, тем самым и -1 и 127 интерпретируются как 63. Если сумма (уменьшенное) сдержала индекс (уменьшенную) и длину поля превышает 64, то результаты не определены. Нулевое значение длины поля, интерпретируется как 64. Если индекс длины поля и оба бита равно нулю, 63:0 бит Source2 вставляется в Source1. Если длина поля равна нулю, но индекс бита отличен от нуля, результаты не определены.

Вызову _mm_insert_si64 длина поля содержится в 77:72 и в 69:64 бит Source2 индексу.

При вызове _mm_inserti_si64 с аргументами, компилятор не может определить, чтобы быть константами целого числа, компилятор создает код для упаковки этих значений в регистр XMM и вызвать _mm_insert_si64.

Чтобы определить аппаратную поддержку для инструкции insertq вызов внутренним __cpuid с InfoType=0x80000001 и контрольный двоичный разряд 6 CPUInfo[2] (ECX). Этот бит будет 1, если инструкция поддерживается, и 0 - в противном случае. Если запустить код, который использует этот встроенный на оборудовании, не поддерживает инструкцию insertq результаты становятся непредсказуемыми.

Пример

// 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;

}
  

ЭЛЕМЕНТ, относящийся Майкрософт

Авторские права 2007 предварительными микро- Устройствами, Inc все права защищены. Воспроизведено с разрешением от предварительных микро- Устройств, Inc

См. также

Ссылки

_mm_extract_si64, _mm_extracti_si64

Встроенные объекты компилятора