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


_mm_com_epi16

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

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

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

__m128i _mm_com_epi16 (
   __m128i src1,
   __m128i src2,
   int condition
);

Параметры

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

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

  • [входящий] condition
    32-битное целочисленное условие, используемое в сравнении. Допустимые значения — от 0 до 7.

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

Упакованный 128-битный массив r из восьми 16-битных целых чисел без знака, каждое из которых равно 0x0000 или 0xFFFF. Если параметр cond — логический оператор, подразумеваемый значением параметра condition, то

r[i] := src1[i] cond src2[i] ? 0xFFFF : 0x0000;

Требования

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

Архитектура

_mm_com_epi16

XOP

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

Заметки

Эта инструкция сравнивает каждый байт параметра src1 с соответствующим байтом параметра src2, используя оператор сравнения, описанный параметром condition. (Для каждой пары байтов используется тот же оператор сравнения.) Допустимые значения параметра condition — от 0 до 7. Включение заголовка <intrin.h> позволяет использовать следующие имена вместо числовых значений для параметра condition:

Целочисленное значение

Символическое имя

Значение

0

_MM_PCOMCTRL_LT

r[i] = (src1[i] < src2[i]) ? 0xFFFF : 0x0000

1

_MM_PCOMCTRL_LE

r[i] = (src1[i] <= src2[i]) ? 0xFFFF : 0x0000

2

_MM_PCOMCTRL_GT

r[i] = (src1[i] > src2[i]) ? 0xFFFF : 0x0000

3

_MM_PCOMCTRL_GE

r[i] = (src1[i] >= src2[i]) ? 0xFFFF : 0x0000

4

_MM_PCOMCTRL_EQ

r[i] = (src1[i] == src2[i]) ? 0xFFFF : 0x0000

5

_MM_PCOMCTRL_NEQ

r[i] = (src1[i] != src2[i]) ? 0xFFFF : 0x0000

6

_MM_PCOMCTRL_FALSE

r[i] = 0x0000 (маска, состоящая из всех нулей)

7

_MM_PCOMCTRL_TRUE

r[i] = 0xFFFF (маска, состоящая из всех единиц)

При желании можно использовать следующие макросы, определяемые при включении заголовка <intrin.h>:

Макрос

Значение

_mm_comlt_epi16(src1, src2)

_mm_com_epi16(src1, src2, 0)

_mm_comle_epi16(src1, src2)

_mm_com_epi16(src1, src2, 1)

_mm_comgt_epi16(src1, src2)

_mm_com_epi16(src1, src2, 2)

_mm_comge_epi16(src1, src2)

_mm_com_epi16(src1, src2, 3)

_mm_comeq_epi16(src1, src2)

_mm_com_epi16(src1, src2, 4)

_mm_comneq_epi16(src1, src2)

_mm_com_epi16(src1, src2, 5)

_mm_comfalse_epi16(src1, src2)

_mm_com_epi16(src1, src2, 6)

_mm_comtrue_epi16(src1, src2)

_mm_com_epi16(src1, src2, 7)

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

Пример

#include <stdio.h>
#include <intrin.h>
main()
{
    __m128i a, b, d;
    int i;
    for (i = 0; i < 8; i++) {
        a.m128i_i16[i] = ((20011*i) % 65535) - 32768;
        b.m128i_i16[i] = ((32767*i) % 65535) - 32768;
    }
    printf("src1:   ");
    for (i = 0; i < 8; i++) printf_s(" %6d", a.m128i_i16[i]);
    printf_s("\nsrc2:   ");
    for (i = 0; i < 8; i++) printf_s(" %6d", b.m128i_i16[i]);
    printf_s("\n<  mask:");
    d = _mm_com_epi16(a, b, _MM_PCOMCTRL_LT);
    for (i = 0; i < 8; i++) printf_s("   %04x", d.m128i_u16[i]);
    printf_s("\n== mask:");
    d = _mm_com_epi16(a, b, _MM_PCOMCTRL_EQ);
    for (i = 0; i < 8; i++) printf_s("   %04x", d.m128i_u16[i]);
    printf("\n");
}
  

См. также

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

_mm_com_epi8

_mm_com_epi32

_mm_com_epi64

_mm_com_epu16

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

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

Дата

Журнал

Причина

Март 2011

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

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