_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