_mm_com_epu64
更新:2011 年 3 月
需要 Visual Studio 2010 SP1。
Microsoft 专用
生成 XOP 指令 vpcomuq 以返回一个位掩码,该位掩码由其前两个源使用第三个源给的条件通过逐个四字无符号比较生成。
__m128i _mm_com_epu64 (
__m128i src1,
__m128i src2,
int condition
);
参数
[in] src1
具有两个 64 位无符号整数的 128 位压缩数组。[in] src2
具有两个 64 位无符号整数的 128 位压缩数组。[in] condition
要在比较中使用的 32 位整数条件。 合法值是从 0 到 7。
返回值
具有两个 64 位无符号整数的 128 位压缩数组 r,其中每个无符号整数要么是 0x0000000000000000,要么是 0xFFFFFFFFFFFFFFFF。 如果 cond 是 condition 的值所隐含的逻辑运算符,则
r[i] := src1[i] cond src2[i] ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;
要求
内部 |
体系结构 |
---|---|
_mm_com_epu64 |
XOP |
头文件 <intrin.h>
备注
此指令会使用由 condition 描述的比较运算符,将 src1 的每个四字与 src2 的相应四字进行比较。 (每对四字使用相同的比较运算符。)合法值 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_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 0) |
_mm_comle_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 1) |
_mm_comgt_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 2) |
_mm_comge_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 3) |
_mm_comeq_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 4) |
_mm_comneq_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 5) |
_mm_comfalse_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 6) |
_mm_comtrue_epu64(src1, src2) |
_mm_com_epu64(src1, src2, 7) |
vpcomuq 指令是 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: %20I64u %20I64u\n",
a.m128i_u64[0], a.m128i_u64[1]);
printf("src2: %20I64u %20I64u\n",
b.m128i_u64[0], b.m128i_u64[1]);
d = _mm_com_epu64(a, b, _MM_PCOMCTRL_LT);
printf("< mask: %016I64x %016I64x\n",
d.m128i_u64[0], d.m128i_u64[1]);
d = _mm_com_epu64(a, b, _MM_PCOMCTRL_GT);
printf("> mask: %016I64x %016I64x\n",
d.m128i_u64[0], d.m128i_u64[1]);
}
请参见
其他资源
针对 Visual Studio 2010 SP1 添加的 XOP 内部函数
修订记录
Date |
修订记录 |
原因 |
---|---|---|
2011 年 3 月 |
添加了本内容。 |
SP1 功能更改。 |