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


_mm_shl_epi32

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

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

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

__m128i _mm_shl_epi32 (
   __m128i src,
   __m128i counts
);

Параметры

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

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

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

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

r[i] := (counts[4*i] >= 0) ? src[i] << counts[4*i] :
                             src[i] >> -counts[4*i]);

Требования

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

Архитектура

_mm_shl_epi32

XOP

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

Заметки

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

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

Пример

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m128i a, b, d;
    int i, j;
    unsigned int temp;
    for (i = 0; i < 4; i++) {
        temp = 0;
        for (j = 0; j < 8; j++) {
            temp = temp << 4 | (8*i + j + 7) % 16;
        }
        a.m128i_u32[i] = temp;
        b.m128i_i8[4*i] = 11*i - 21;
    }
    d = _mm_shl_epi32(a, b);
    printf_s("data:       ");
    for (i = 0; i < 4; i++) printf_s(" %08x", a.m128i_u32[i]);
    printf_s("\nshifted by  ");
    for (i = 0; i < 4; i++) printf_s(" %8d", b.m128i_i8[4*i]);
    printf_s("\ngives       ");
    for (i = 0; i < 4; i++) printf_s(" %08x", d.m128i_u32[i]);
    printf_s("\n");
}
  

См. также

Ссылки

__cpuid, __cpuidex

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

_mm_shl_epi8

_mm_shl_epi16

_mm_shl_epi64

_mm_sha_epi32

_mm_rot_epi32

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

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

Дата

Журнал

Причина

Март 2011

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

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