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


_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
Встроенные компоненты компилятора