_mm256_permute2_ps

업데이트: 2011년 3월

Visual Studio 2010 SP1이 필요합니다.

Microsoft 전용

XOP YMM 명령 vpermil2ps를 생성하여 옵션을 0으로 하여 처음 두 소스에서 부동 소수점 값을 선택합니다.

__m256 _mm_permute2_ps (
   __m256 src1,
   __m256 src2,
   __m256i selector,
   int control
); 

매개 변수

  • [in] src1
    8개의 32비트 부동 소수점 값을 포함하는 256비트 매개 변수입니다.

  • [in] src2
    8개의 32비트 부동 소수점 값을 포함하는 256비트 매개 변수입니다.

  • [in] selector
    8개의 32비트 정수 선택기 값을 포함하는 256비트 매개 변수입니다.

  • [in] control
    결과에 0의 값이 있는지 결정하는 방법을 제어하는 32비트 정수 매개 변수입니다.

반환 값

8개의 32비트 부동 소수점 값을 포함하는 256비트 결과 r입니다.

결과의 상위 128비트의 각 값은 src1 및 src2에서 상위 128비트의 4개 32비트 부동 소수점 값에서 선택된 값 또는 0입니다. 결과의 하위 128비트의 각 값은 src1 및 src2에서 하위 128비트의 4개 32비트 부동 소수점 값에서 선택된 값 또는 0입니다.

요구 사항

내장

아키텍처

_mm256_permute2_ps

XOP

헤더 파일 <intrin.h>

설명

selector의 상위 128비트에서 각 4개 더블워드는 src1 및 src2에서 상위 128비트의 8개 32비트 부동 소수점 중 하나에서 결과의 해당 더블워드 값을 선택합니다. 이 값은 control의 값과 selector 더블워드의 비트 3의 값에 따라 결과에 쓰여지기 전에 0으로 대체될 수 있습니다. 마찬가지로 selector의 하위 128비트에서 각 4개 더블워드는 src1 및 src2의 하위 128비트에서 8개 32비트 부동 소수점 값 중 하나에서 값을 선택하며 이 값은 0으로 대체될 수도 있습니다.

selector에서 상위 128비트의 각 더블워드에 대해 3개의 하위 비트는 src1 또는 src2에서 부동 소수점 값 중 하나를 선택합니다. 값 0 ~ 3은 src1[4] ~ src1[7]을 선택하고 값 4 ~ 7은 src2[4] ~ src2[7]을 선택합니다. selector에서 하위 128비트의 각 더블워드에 대해 3개의 하위 비트는 src1 또는 src2에서 부동 소수점 값 중 하나를 선택합니다. 값 0 ~ 3은 src1[0] ~ src1[3]을 선택하고 값 4 ~ 7은 src2[0] ~ src2[3]을 선택합니다.

selector에서 각 더블워드의 다음 비트는 아래의 "일치" 비트로 참조됩니다. selector에서 각 더블워드의 상위 28비트는 무시됩니다.

4번째 소스인 control은 결과 값이 0으로 설정되는 조건을 결정합니다. control의 값은 0, 1, 2 또는 3이어야 합니다. control이 0 또는 1인 경우 선택한 부동 소수점 값이 대상에 쓰여집니다. control이 2인 경우 selector의 해당 일치 비트가 0이면 선택한 부동 소수점 값이 대상에 쓰여지지만 일치 비트가 1이면 0이 쓰여집니다. control이 3인 경우 해당 일치 비트기 1이면 선택한 부동 소수점 값이 대상에 쓰여지지만 일치 비트가 0이면 0이 쓰여집니다.

vpermil2ps 명령은 XOP 명령군의 일부입니다. 이 intrinsic을 사용하기 전에 프로세서가 이 명령을 지원하는지 확인해야 합니다. 이 명령에 대한 하드웨어 지원을 확인하려면 InfoType = 0x80000001을 사용하여 __cpuid intrinsic을 호출하고 CPUInfo[2] (ECX)의 비트 11을 확인합니다. 명령이 지원되는 경우 비트는 1이고, 그렇지 않으면 0입니다.

예제

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m256 a, b, d;
    __m256i select;
    int i;
    for (i = 0; i < 8; i++) {
        a.m256_f32[i] = i;
        b.m256_f32[i] = i+8;
    }
    select.m256i_i32[0] = 5;
    select.m256i_i32[1] = 1 + 8; // turn on match bit
    select.m256i_i32[2] = 2;
    select.m256i_i32[3] = 6 + 8; // turn on match bit
    select.m256i_i32[4] = 5 + 8; // turn on match bit
    select.m256i_i32[5] = 1;
    select.m256i_i32[6] = 2 + 8; // turn on match bit
    select.m256i_i32[7] = 6;

    d = _mm256_permute2_ps(a, b, select, 0); // just select, don't zero
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
    d = _mm256_permute2_ps(a, b, select, 2); // zero if match is 1
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
    d = _mm256_permute2_ps(a, b, select, 3); // zero if match is 0
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
}
    9.000  1.000  2.000 10.000 13.000  5.000  6.000 14.000
  9.000  0.000  2.000  0.000  0.000  5.000  0.000 14.000
  0.000  1.000  0.000 10.000 13.000  0.000  6.000  0.000

참고 항목

참조

__cpuid, __cpuidex

기타 리소스

_mm256_permute2_pd

_mm_permute2_ps

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

변경 기록

날짜

변경 내용

이유

2011년 3월

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

SP1 기능 변경