共用方式為


_mm_com_epi16

更新:2011 年 3 月

必須有 Visual Studio 2010 SP1。

Microsoft 專有的

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

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

參數

  • [in] src1
    含八個 16 位元帶正負號整數的 128 位元封裝陣列。

  • [in] src2
    含八個 16 位元帶正負號整數的 128 位元封裝陣列。

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

傳回值

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

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

需求

內建

架構

_mm_com_epi16

XOP

標頭檔 <intrin.h>

備註

這個指令會使用 condition 描述的比較運算子,將 src1 的每個位元組與 src2 的對應位元組做比較。 (每一對位元組會使用相同的比較運算子)。有效值 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 (全為 1 的遮罩)

如果您喜歡,您可以使用下列巨集 (當包含 <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 指令家族的一部分。 在使用這個內建之前,您必須先確定處理器支援這個指令。 若要判斷這個指令的硬體支援,請指定 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 < 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

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

變更記錄

日期

記錄

原因

2011 年 3 月

新增此內容。

SP1 功能變更。