_mm_insert_si64, _mm_inserti_si64
Блок, относящийся только к системам Майкрософт
Создает инструкцию insertq
для вставки битов из второго операнда в первый операнд.
Синтаксис
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2,
int Length,
int Index
);
Параметры
Источник1
[in] 128-разрядное поле с входными данными в более низких 64 битах, в которое будет вставлено поле.
Источник2
[in] 128-разрядное поле с данными для вставки в низкие биты. Для _mm_insert_si64
этого также содержит дескриптор поля в его высоких битах.
Длина
[in] Целочисленная константа, указывающая длину поля для вставки.
Указатель
[in] Целочисленная константа, указывающая индекс наименьшего значительного бита поля, в которое будут вставляться данные.
Возвращаемое значение
128-разрядное поле, 64-разрядное поле которого содержит исходный низкий 64 бит Source1 с указанным битом, замененным низкими битами Source2. Верхние 64 бита возвращаемого значения не определены.
Требования
Intrinsic | Архитектура |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Файл<заголовка intrin.h>
Замечания
Эти встроенные компоненты создают инструкцию insertq
для вставки битов из Source2 в Source1. Существует две версии: _mm_inserti_si64
является немедленной версией и _mm_insert_si64
является неотложной. Каждая версия извлекает битовое поле заданной длины из Source2 и вставляет его в Source1. Извлеченные биты являются наименьшими значительными битами Source2. Поле Source1, в которое будут вставлены эти биты, определяется длиной и индексом его наименьшего значительного бита. Значения длины и индекса принимают мод 64, поэтому как -1, так и 127 интерпретируются как 63. Если сумма (сокращенный) битовый индекс и (сокращенная) длина поля превышает 64, результаты не определены. Значение нуля для длины поля интерпретируется как 64. Если длина поля и битовый индекс равны нулю, биты 63:0 source2 вставляются в Source1. Если длина поля равна нулю, но битовый индекс не равен нулю, результаты не определены.
При вызове _mm_insert_si64 длина поля содержится в битах 77:72 Source2 и индекс в битах 69:64.
При вызове _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;
}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff
Завершение блока, относящегося только к системам Майкрософт
Части авторских прав 2007 от Advanced Micro Devices, Inc. Все права защищены. Воспроизводится с разрешением от Advanced Micro Devices, Inc.
См. также
_mm_extract_si64, _mm_extracti_si64
Встроенные компоненты компилятора