共用方式為


_mm_com_epu8

更新:2011 年 3 月

必須有 Visual Studio 2010 SP1。

Microsoft 專有的

產生 XOP 指令 vpcomub 以傳回遮罩,這個遮罩是使用第三個來源指定的條件,以位元組為單位,對其前兩個來源逐一進行不帶正負號的比較所產生。

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

參數

  • [in] src1
    含十六個 8 位元不帶正負號整數的 128 位元封裝陣列。

  • [in] src2
    含十六個 8 位元不帶正負號整數的 128 位元封裝陣列。

  • [in] condition
    要用於比較的 32 位元整數條件。 有效值為 0 到 7。

傳回值

含十六個 8 位元不帶正負號整數 (其中每個整數不是 0x00 就是 0xFF) 的 128 位元封裝陣列 r。 如果 cond 是 condition 值隱含的邏輯運算子,則

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

需求

內建

架構

_mm_com_epu8

XOP

標頭檔 <intrin.h>

備註

這個指令會使用 condition 描述的比較運算子,將 src1 的每個位元組與 src2 的對應位元組做比較。 (每一對位元組會使用相同的比較運算子)。有效值 condition 為 0 到 7。 只要包含 <intrin.h>,您就能為 condition 使用下列名稱而非其數值:

整數值

符號名稱

意義

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 (全為零的遮罩)

7

_MM_PCOMCTRL_TRUE

r[i] = 0xFF (全為 1 的遮罩)

如果您喜歡,您可以使用下列巨集 (當包含 <intrin.h> 時,就會定義這些巨集):

巨集

意義

_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)

vpcomub 指令屬於 XOP 指令家族的一部分。 在使用這個內建之前,您必須先確定處理器支援這個指令。 若要判斷這個指令的硬體支援,請指定 InfoType = 0x80000001 以呼叫 __cpuid 內建,並檢查 CPUInfo[2] (ECX) 的位元 11。 當支援指令時,這個位元為 1,否則為 0。

範例

#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");
}
  

請參閱

其他資源

_mm_com_epu16

_mm_com_epu32

_mm_com_epu64

_mm_com_epi8

針對 Visual Studio 2010 SP1 加入的 XOP 內建

變更記錄

日期

記錄

原因

2011 年 3 月

新增此內容。

SP1 功能變更。