共用方式為


_mm_com_epi64

更新:2011 年 3 月

必須有 Visual Studio 2010 SP1。

Microsoft 專有的

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

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

參數

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

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

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

傳回值

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

r[i] := src1[i] cond src2[i] ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;

需求

內建

架構

_mm_com_epi64

XOP

標頭檔 <intrin.h>

備註

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

整數值

符號名稱

意義

0

_MM_PCOMCTRL_LT

r[i] = (src1[i] < src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

1

_MM_PCOMCTRL_LE

r[i] = (src1[i] <= src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

2

_MM_PCOMCTRL_GT

r[i] = (src1[i] > src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

3

_MM_PCOMCTRL_GE

r[i] = (src1[i] >= src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

4

_MM_PCOMCTRL_EQ

r[i] = (src1[i] == src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

5

_MM_PCOMCTRL_NEQ

r[i] = (src1[i] != src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000

6

_MM_PCOMCTRL_FALSE

r[i] = 0x0000000000000000 (全為零的遮罩)

7

_MM_PCOMCTRL_TRUE

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

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

巨集

意義

_mm_comlt_epi64(src1, src2)

_mm_com_epi64(src1, src2, 0)

_mm_comle_epi64(src1, src2)

_mm_com_epi64(src1, src2, 1)

_mm_comgt_epi64(src1, src2)

_mm_com_epi64(src1, src2, 2)

_mm_comge_epi64(src1, src2)

_mm_com_epi64(src1, src2, 3)

_mm_comeq_epi64(src1, src2)

_mm_com_epi64(src1, src2, 4)

_mm_comneq_epi64(src1, src2)

_mm_com_epi64(src1, src2, 5)

_mm_comfalse_epi64(src1, src2)

_mm_com_epi64(src1, src2, 6)

_mm_comtrue_epi64(src1, src2)

_mm_com_epi64(src1, src2, 7)

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

範例

#include <stdio.h>
#include <intrin.h>
main()
{
    __m128i a, b, d;
    int i;
    a.m128i_i64[0] = -10;
    a.m128i_i64[1] =  10;
    b.m128i_i64[0] =  22;
    b.m128i_i64[1] = -22;
    printf("src1:     %16I64d %16I64d\n",
            a.m128i_i64[0], a.m128i_i64[1]);
    printf("src2:     %16I64d %16I64d\n",
            b.m128i_i64[0], b.m128i_i64[1]);
    d = _mm_com_epi64(a, b, _MM_PCOMCTRL_LT);
    printf("< mask:   %016I64x %016I64x\n",
            d.m128i_u64[0], d.m128i_u64[1]);
    d = _mm_com_epi64(a, b, _MM_PCOMCTRL_GT);
    printf("> mask:   %016I64x %016I64x\n",
            d.m128i_u64[0], d.m128i_u64[1]);
}
  

請參閱

其他資源

_mm_com_epi8

_mm_com_epi16

_mm_com_epi32

_mm_com_epu64

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

變更記錄

日期

記錄

原因

2011 年 3 月

新增此內容。

SP1 功能變更。