更新:2011 年 3 月
需要 Visual Studio 2010 SP1。
Microsoft 专用
生成 XOP 指令 vpcomd 以返回一个位掩码,该位掩码由其前两个源使用第三个源给的条件通过逐个双字带符号比较生成。
__m128i _mm_com_epi32 (
   __m128i src1,
   __m128i src2,
   int condition
);
参数
- [in] src1 
 具有四个 32 位带符号整数的 128 位压缩数组。
- [in] src2 
 具有四个 32 位带符号整数的 128 位压缩数组。
- [in] condition 
 要在比较中使用的 32 位整数条件。 合法值是从 0 到 7。
返回值
具有四个 32 位无符号整数的 128 位压缩数组 r,其中每个无符号整数要么是 0x00000000,要么是 0xFFFFFFFF。 如果 cond 是 condition 的值所隐含的逻辑运算符,则
r[i] := src1[i] cond src2[i] ? 0xFFFFFFFF : 0x00000000;
要求
| 内部 | 体系结构 | 
|---|---|
| _mm_com_epi32 | XOP | 
头文件 <intrin.h>
备注
此指令会使用 condition 中描述的比较运算符,将 src1 中的每个双字与 src2 的相应双字进行比较。 (每对双字使用相同的比较运算符。)合法值 condition 为 0 到 7。 通过包括 <intrin.h>,您将能够使用以下名称而不是数值用于 condition:
| 整数值 | 符号名 | 含义 | 
|---|---|---|
| 0 | _MM_PCOMCTRL_LT | r[i] = (src1[i] < src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 1 | _MM_PCOMCTRL_LE | r[i] = (src1[i] <= src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 2 | _MM_PCOMCTRL_GT | r[i] = (src1[i] > src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 3 | _MM_PCOMCTRL_GE | r[i] = (src1[i] >= src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 4 | _MM_PCOMCTRL_EQ | r[i] = (src1[i] == src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 5 | _MM_PCOMCTRL_NEQ | r[i] = (src1[i] != src2[i]) ? 0xFFFFFFFF : 0x00000000 | 
| 6 | _MM_PCOMCTRL_FALSE | r[i] = 0x00000000(掩码全部为零) | 
| 7 | _MM_PCOMCTRL_TRUE | r[i] = 0xFFFFFFFF(掩码全部为 1) | 
如果您愿意,可以使用以下在包括 <intrin.h> 时将被定义的宏:
| 宏 | 含义 | 
|---|---|
| _mm_comlt_epi32(src1, src2) | _mm_com_epi32(src1, src2, 0) | 
| _mm_comle_epi32(src1, src2) | _mm_com_epi32(src1, src2, 1) | 
| _mm_comgt_epi32(src1, src2) | _mm_com_epi32(src1, src2, 2) | 
| _mm_comge_epi32(src1, src2) | _mm_com_epi32(src1, src2, 3) | 
| _mm_comeq_epi32(src1, src2) | _mm_com_epi32(src1, src2, 4) | 
| _mm_comneq_epi32(src1, src2) | _mm_com_epi32(src1, src2, 5) | 
| _mm_comfalse_epi32(src1, src2) | _mm_com_epi32(src1, src2, 6) | 
| _mm_comtrue_epi32(src1, src2) | _mm_com_epi32(src1, src2, 7) | 
vpcomd 指令是 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 < 4; i++) {
        a.m128i_i32[i] = 1000*i - 1500;
        b.m128i_i32[i] = 2000*i - 2500;
    }
    printf("src1:      ");
    for (i = 0; i < 4; i++) printf_s("   %8d", a.m128i_i32[i]);
    printf_s("\nsrc2:      ");
    for (i = 0; i < 4; i++) printf_s("   %8d", b.m128i_i32[i]);
    printf_s("\n!= mask:   ");
    d = _mm_com_epi32(a, b, _MM_PCOMCTRL_NEQ);
    for (i = 0; i < 4; i++) printf_s("   %08x", d.m128i_u32[i]);
    printf_s("\ntrue mask: ");
    d = _mm_com_epi32(a, b, _MM_PCOMCTRL_TRUE);
    for (i = 0; i < 4; i++) printf_s("   %08x", d.m128i_u32[i]);
    printf("\n");
}
请参见
其他资源
针对 Visual Studio 2010 SP1 添加的 XOP 内部函数
修订记录
| Date | 修订记录 | 原因 | 
|---|---|---|
| 2011 年 3 月 | 添加了本内容。 | SP1 功能更改。 |