_mm256_cmov_si256
更新:2011 年 3 月
需要 Visual Studio 2010 SP1。
Microsoft 专用
生成 XOP YMM 指令 vpcmov 以执行按位条件移动前两个源的移动,取决于其第三个源的值。
__m256i _mm256_cmov_si256 (
__m256i src1,
__m256i src2,
__m256i selector
);
参数
[in] src1
256 位参数。[in] src2
256 位参数。[in] selector
从 src1 和 src2 选择位的 256 位参数。
返回值
包含来自 src1 和 src2 的位的 256 位结果 r。 选择的位取决于 selector。
要求
内部 |
体系结构 |
---|---|
_mm256_cmov_si256 |
XOP |
头文件 <intrin.h>
备注
结果中的每个位从 src1 或 src2 中相应的位位置选择(复制),取决于 selector 中该位位置的值。 如果 selector 中的位是 1,则从 src1 中选择位;否则从 src2 中选择位。
vpcmov 指令是 XOP 系列指令的一部分。 在您使用此内部函数之前,必须确保处理器支持该指令。 若要确定此指令的硬件支持,调用 InfoType = 0x80000001 的 __cpuid 内部函数并检查和 CPUInfo[2] (ECX) 的位 11。 当该指令受支持时,此位为 1,否则为 0。
示例
#include <stdio.h>
#include <intrin.h>
int main()
{
__m256i a, b, selector, d;
int i;
a.m256i_u64[3] = 0xffffffffffffffffll;
a.m256i_u64[2] = 0xeeeeeeeeeeeeeeeell;
a.m256i_u64[1] = 0xccccccccccccccccll;
a.m256i_u64[0] = 0x8888888888888888ll;
b.m256i_u64[3] = 0x0000000000000000ll;
b.m256i_u64[2] = 0x1111111111111111ll;
b.m256i_u64[1] = 0x3333333333333333ll;
b.m256i_u64[0] = 0x7777777777777777ll;
selector.m256i_u64[3] = 0xfedcba9876543210ll;
selector.m256i_u64[2] = 0x0123456789abcdefll;
selector.m256i_u64[1] = 0xfedcba9876543210ll;
selector.m256i_u64[0] = 0x0123456789abcdefll;
d = _mm256_cmov_si256(a, b, selector);
printf_s("a: %016I64x %016I64x\n",
a.m256i_u64[3], a.m256i_u64[2]);
printf_s(" %016I64x %016I64x\n",
a.m256i_u64[1], a.m256i_u64[0]);
printf_s("b: %016I64x %016I64x\n",
b.m256i_u64[3], b.m256i_u64[2]);
printf_s(" %016I64x %016I64x\n",
b.m256i_u64[1], b.m256i_u64[0]);
printf_s("selector %016I64x %016I64x\n",
selector.m256i_u64[3], selector.m256i_u64[2]);
printf_s(" %016I64x %016I64x\n",
selector.m256i_u64[1], selector.m256i_u64[0]);
printf_s("result: %016I64x %016I64x\n",
d.m256i_u64[3], d.m256i_u64[2]);
printf_s(" %016I64x %016I64x\n",
d.m256i_u64[1], d.m256i_u64[0]);
}
请参见
参考
其他资源
针对 Visual Studio 2010 SP1 添加的 XOP 内部函数
修订记录
Date |
修订记录 |
原因 |
---|---|---|
2011 年 3 月 |
添加了本内容。 |
SP1 功能更改。 |