_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]);
}
請參閱
其他資源
針對 Visual Studio 2010 SP1 加入的 XOP 內建
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2011 年 3 月 |
新增此內容。 |
SP1 功能變更。 |