_mm_extract_si64, _mm_extracti_si64
Блок, относящийся только к системам Майкрософт
extrq
Создает инструкцию для извлечения указанных битов из низких 64 битов первого аргумента.
Синтаксис
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
Параметры
Источник
[in] 128-разрядное поле с входными данными в более низких 64 битах.
Дескриптор
[in] 128-разрядное поле, описывающее извлекаемое битовое поле.
Длина
[in] Целое число, указывающее длину извлекаемого поля.
Указатель
[in] Целое число, указывающее индекс поля для извлечения
Возвращаемое значение
128-разрядное поле с извлеченным полем в его наименее значимых битах.
Требования
Intrinsic | Архитектура |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
Файл<заголовка intrin.h>
Замечания
Эти встроенные компоненты создают инструкцию extrq
для извлечения битов из источника. Существует две версии: _mm_extracti_si64
это немедленная версия, и _mm_extract_si64
она является неотложной. Каждая версия извлекается из исходного битового поля, определенного его длиной и индексом наименьшего значительного бита. Значения длины и индекса принимают мод 64, поэтому как -1, так и 127 интерпретируются как 63. Если сумма (сокращенная) длина индекса и (уменьшена) больше 64, результаты не определены. Значение нуля для длины поля интерпретируется как 64. Если длина поля и битовый индекс равны нулю, извлекаются биты 63:0 источника . Если длина поля равна нулю, но битовый индекс не равен нулю, результаты не определены.
В вызове _mm_extract_si64
дескриптор содержит индекс в битах 13:8 и длину поля, извлекаемого в битах 5:0.
При вызове _mm_extracti_si64
аргументов компилятор не может определить целочисленные константы, компилятор создает код для упаковки этих значений в регистр XMM (дескриптор) и вызова _mm_extract_si64
.
Чтобы определить поддержку оборудования для инструкции extrq
, вызовите __cpuid
встроенную функцию InfoType=0x80000001
и проверьте бит 6 CPUInfo[2] (ECX)
. Этот бит будет равен 1, если инструкция поддерживается, и 0 в противном случае. Если вы запускаете код, использующий это встроенное оборудование, которое не поддерживает инструкцию extrq
, результаты непредсказуемы.
Пример
// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;
union {
__m128i m;
unsigned __int64 ui64[2];
} source, descriptor, result1, result2, result3;
int
main()
{
source.ui64[0] = 0xfedcba9876543210ll;
descriptor.ui64[0] = 0x0000000000000b1bll;
result1.m = _mm_extract_si64 (source.m, descriptor.m);
result2.m = _mm_extracti_si64(source.m, 27, 11);
result3.ui64[0] = (source.ui64[0] >> 11) & 0x7ffffff;
cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
cout << "result2 = 0x" << result2.ui64[0] << endl;
cout << "result3 = 0x" << result3.ui64[0] << endl;
}
result1 = 0x30eca86
result2 = 0x30eca86
result3 = 0x30eca86
Завершение блока, относящегося только к системам Майкрософт
Части авторских прав 2007 от Advanced Micro Devices, Inc. Все права защищены. Воспроизводится с разрешением от Advanced Micro Devices, Inc.
См. также
_mm_insert_si64, _mm_inserti_si64
Встроенные компоненты компилятора