Share via


_mm_com_epu8

Visual Studio 2010 SP1 is required.

Microsoft Specific

Generates the XOP instruction vpcomub to return a bitmask generated by a byte-by-byte unsigned comparison of its first two sources using the condition given by the third source.

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

Parameters

  • [in] src1
    Packed 128-bit array of sixteen 8-bit unsigned integers.

  • [in] src2
    Packed 128-bit array of sixteen 8-bit unsigned integers.

  • [in] condition
    A 32-bit integer condition to be used in the comparison. Legal values are 0 through 7.

Return value

A packed 128-bit array r of sixteen eight-bit unsigned integers, each of which is either 0x00 or 0xFF. If cond is the logical operator implied by the value of condition, then

r[i] := src1[i] cond src2[i] ? 0xFF : 0x00;

Requirements

Intrinsic

Architecture

_mm_com_epu8

XOP

Header file <intrin.h>

Remarks

This instruction compares each byte of src1 to the corresponding byte of src2, using the comparison operator described by condition. (Each pair of bytes uses the same comparison operator.) The legal values condition are 0 through 7. By including <intrin.h> you will be able to use the following names rather than numerical values for condition:

Integer Value

Symbolic Name

Meaning

0

_MM_PCOMCTRL_LT

r[i] = (src1[i] < src2[i]) ? 0xFF : 0x00

1

_MM_PCOMCTRL_LE

r[i] = (src1[i] <= src2[i]) ? 0xFF : 0x00

2

_MM_PCOMCTRL_GT

r[i] = (src1[i] > src2[i]) ? 0xFF : 0x00

3

_MM_PCOMCTRL_GE

r[i] = (src1[i] >= src2[i]) ? 0xFF : 0x00

4

_MM_PCOMCTRL_EQ

r[i] = (src1[i] == src2[i]) ? 0xFF : 0x00

5

_MM_PCOMCTRL_NEQ

r[i] = (src1[i] != src2[i]) ? 0xFF : 0x00

6

_MM_PCOMCTRL_FALSE

r[i] = 0x00 (mask of all zeros)

7

_MM_PCOMCTRL_TRUE

r[i] = 0xFF (mask of all ones)

If you prefer, you may use the following macros, which will be defined when <intrin.h> is included:

Macro

Meaning

_mm_comlt_epu8(src1, src2)

_mm_com_epu8(src1, src2, 0)

_mm_comle_epu8(src1, src2)

_mm_com_epu8(src1, src2, 1)

_mm_comgt_epu8(src1, src2)

_mm_com_epu8(src1, src2, 2)

_mm_comge_epu8(src1, src2)

_mm_com_epu8(src1, src2, 3)

_mm_comeq_epu8(src1, src2)

_mm_com_epu8(src1, src2, 4)

_mm_comneq_epu8(src1, src2)

_mm_com_epu8(src1, src2, 5)

_mm_comfalse_epu8(src1, src2)

_mm_com_epu8(src1, src2, 6)

_mm_comtrue_epu8(src1, src2)

_mm_com_epu8(src1, src2, 7)

The vpcomub instruction is part of the XOP family of instructions. Before you use this intrinsic, you must ensure that the processor supports this instruction. To determine hardware support for this instruction, call the __cpuid intrinsic with InfoType = 0x80000001 and check bit 11 of CPUInfo[2] (ECX). This bit is 1 when the instruction is supported, and 0 otherwise.

Example

#include <stdio.h>
#include <intrin.h>
main()
{
   __m128i a, b, d;
    int i;
    for (i = 0; i < 16; i++) {
        a.m128i_i8[i] = ((11*i) % 31) - 16;
        b.m128i_i8[i] = ((13*i) % 31) - 16;
    }
    printf("src1:  ");
    for (i = 0; i < 16; i++) printf_s(" %3u", a.m128i_u8[i]);
    printf_s("\nsrc2:  ");
    for (i = 0; i < 16; i++) printf_s(" %3u", b.m128i_u8[i]);
    printf_s("\n< mask:");
    d = _mm_com_epu8(a, b, _MM_PCOMCTRL_LT);
    for (i = 0; i < 16; i++) printf_s("  %02x", d.m128i_u8[i]);
    printf_s("\n>=mask:");
    d = _mm_com_epu8(a, b, _MM_PCOMCTRL_GE);
    for (i = 0; i < 16; i++) printf_s("  %02x", d.m128i_u8[i]);
    printf("\n");
}
src1:   240 251   6 242 253   8 244 255  10 246   1  12 248   3  14 250
src2:   240 253  10 248   5 243   0  13 251   8 246   3 241 254  11 249
< mask:  00  ff  ff  ff  00  ff  00  00  ff  00  ff  00  00  ff  00  00
>=mask:  ff  00  00  00  ff  00  ff  ff  00  ff  00  ff  ff  00  ff  ff

See Also

Reference

_mm_com_epu16

_mm_com_epu32

_mm_com_epu64

_mm_com_epi8

XOP Intrinsics Added for Visual Studio 2010 SP1