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


_mm_roti_epi16

Требуется Visual Studio 2010 с пакетом обновления 1 (SP1).

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

Формирует инструкцию XOP vprotw для циклического сдвига каждого из слов в своем первом источнике на величину, заданную во втором источнике.

__m128i _mm_roti_epi16 (
   __m128i src,
   int count
);

Параметры

  • [входящий] src
    128-битный параметр, содержащий восемь 16-битных целых чисел без знака.

  • [входящий] count
    Целочисленный счетчик циклического сдвига, предпочтительно константный.

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

128-битный результат r, содержащий восемь 16-битных целых чисел без знака.

r[i] := (count > 0) ? rotate_left(src[i], count) : 
                      rotate_right(src[i], -count);

Требования

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

Архитектура

_mm_roti_epi16

XOP

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

Заметки

Каждое 16-битное целочисленное значение без знака в параметре src циклически сдвигается на количество битов, заданное в параметре count, после чего 16-битный целочисленный результат без знака сохраняется в виде соответствующего значения в целевом объекте. Если значение в параметре count положительно, выполняется циклический сдвиг влево (к наиболее значимому биту); в противном случае выполняется циклический сдвиг вправо.

Инструкция vprotw имеет одну форму для константных аргументов и другую для неконстантных. Если значение параметра count не может быть определено как постоянное во время компиляции, компилятор сформирует дополнительный код для настройки и использования неконстантной версии vprotw. Константная версия vprotw быстрее.

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

Пример

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m128i a, d;
    int i;
    for (i = 0; i < 8; i++) {
        a.m128i_u16[i] = (2*(i+1)) << 12 | (15 - 2*(i+1)) << 8 |
                          2*i << 4 | (15 - 2*i);
    }
    d = _mm_roti_epi16(a, 12);
    printf_s("data:              ");
    for (i = 0; i < 8; i++) printf_s(" %04x", a.m128i_u16[i]);
    printf_s("\nrotated by 12 gives");
    for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
    printf_s("\n");
}
  

См. также

Ссылки

__cpuid, __cpuidex

Другие ресурсы

_mm_roti_epi8

_mm_roti_epi32

_mm_roti_epi64

_mm_rot_epi16

_mm_shl_epi16

Встроенные объекты XOP, добавленные в Visual Studio 2010 с пакетом обновления 1 (SP1)

Журнал изменений

Дата

Журнал

Причина

Март 2011

Добавлено это содержимое.

Изменение функции SP1.