_mm_com_epu16
Требуется Visual Studio 2010 с пакетом обновления 1 (SP1).
Только для систем Microsoft
Формирует инструкцию XOP vpcomuw для возвращения битовой маски, формируемой пословным беззнаковым сравнением своих первых двух источников с использованием условия, заданного третьим источником.
__m128i _mm_com_epu16 (
__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_epu16 |
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_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 0) |
_mm_comle_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 1) |
_mm_comgt_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 2) |
_mm_comge_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 3) |
_mm_comeq_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 4) |
_mm_comneq_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 5) |
_mm_comfalse_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 6) |
_mm_comtrue_epu16(src1, src2) |
_mm_com_epu16(src1, src2, 7) |
Инструкция vpcomuw входит в состав семейства инструкций 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_u16[i]);
printf_s("\nsrc2: ");
for (i = 0; i < 8; i++) printf_s(" %6d", b.m128i_u16[i]);
printf_s("\n> mask:");
d = _mm_com_epu16(a, b, _MM_PCOMCTRL_GT);
for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
printf_s("\n!= mask:");
d = _mm_com_epu16(a, b, _MM_PCOMCTRL_NEQ);
for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
printf("\n");
}
См. также
Другие ресурсы
Встроенные объекты XOP, добавленные в Visual Studio 2010 с пакетом обновления 1 (SP1)
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Март 2011 |
Добавлено это содержимое. |
Изменение функции SP1. |