_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>

설명

결과의 각 비트는 selector에서 해당 비트 위치의 값에 따라 src1 또는 src2의 해당 비트 위치에서 선택(복사)됩니다. selector의 비트가 1인 경우 src1의 비트가 선택되고, 그렇지 않으면 src2의 비트가 선택됩니다.

vpcmov 명령은 XOP 명령군의 일부입니다. 이 intrinsic을 사용하기 전에 프로세서가 이 명령을 지원하는지 확인해야 합니다. 이 명령에 대한 하드웨어 지원을 확인하려면 InfoType = 0x80000001을 사용하여 __cpuid intrinsic을 호출하고 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]);
}
  a:        ffffffffffffffff eeeeeeeeeeeeeeee
          cccccccccccccccc 8888888888888888
b:        0000000000000000 1111111111111111
          3333333333333333 7777777777777777
선택기  fedcba9876543210 0123456789abcdef
          fedcba9876543210 0123456789abcdef
결과:   fedcba9876543210 1032547698badcfe
          cdef89ab45670123 76543210fedcba98

참고 항목

참조

__cpuid, __cpuidex

기타 리소스

_mm_cmov_si128

Visual Studio 2010 SP1용으로 추가된 XOP 내장 함수

변경 기록

날짜

변경 내용

이유

2011년 3월

이 내용이 추가되었습니다.

SP1 기능 변경