_mm_sha_epi16

업데이트: 2011년 3월

Visual Studio 2010 SP1이 필요합니다.

Microsoft 전용

XOP 명령 vpshaw를 생성하여 첫 번째 소스의 각 워드에 대해 두 번째 소스에 지정된 양만큼 산술 시프트를 수행합니다.

__m128i _mm_sha_epi16 (
   __m128i src,
   __m128i counts
); 

매개 변수

  • [in] src
    8개의 16비트 부호 있는 정수를 포함하는 128비트 매개 변수입니다.

  • [in] counts
    16개의 8비트 부호 있는 정수를 포함하는 128비트 매개 변수입니다.

반환 값

8개의 16비트 부호 있는 정수를 포함하는 128비트 결과 r입니다.

r[i] := (counts[2*i] >= 0) ? src[i] << counts[2*i]) : 
                           src[i] >> -counts[2*i]);

요구 사항

내장

아키텍처

_mm_sha_epi16

XOP

헤더 파일 <intrin.h>

설명

src의 각 16비트 부호 있는 정수 값은 counts의 해당 값에 지정된 비트 수만큼 이동되며 16비트 부호 있는 정수 결과는 대상에 해당 값으로 저장됩니다. counts 값이 양수인 경우 시프트는 왼쪽(최상위 비트 쪽으로)으로 진행되고 오른쪽 끝에는 0이 시프트됩니다. 그렇지 않으면 오른쪽으로 시프트되고 왼쪽 끝에는 부호 비트의 사본이 시프트됩니다. 시프트 횟수가 15 이상인 경우 해당 결과 값은 0이고 시프트 횟수가 -15 이하인 경우 src의 값이 음수이면 -1이고, 그렇지 않으면 0입니다. 개수의 다른 값은 무시됩니다.

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

예제

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m128i a, b, d;
    int i;
    for (i = 0; i < 8; i++) {
        a.m128i_u16[i] = (2*(i+1)) << 12 | (15 - 2*(i+1)) << 8 |
                          2*i << 4 | (15 - 2*i);
        b.m128i_i8[2*i] = 3*i - 12;
    }
    printf_s("data:       ");
    for (i = 0; i < 8; i++) printf_s(" %04x", a.m128i_u16[i]);
    printf_s("\nshifted by  ");
    for (i = 0; i < 8; i++) printf_s(" %4d", b.m128i_i8[2*i]);
    d = _mm_sha_epi16(a, b);
    printf_s("\ngives       ");
    for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
    printf_s("\n");
}
  데이터:        2d0f 4b2d 694b 8769 a587 c3a5 e1c3 ffe1
-12   -9   -6   -3    0    3    6    9 만큼 이동
제공        0002 0025 01a5 f0ed a587 1d28 70c0 c200

참고 항목

참조

__cpuid, __cpuidex

기타 리소스

_mm_sha_epi8

_mm_sha_epi32

_mm_sha_epi64

_mm_shl_epi16

_mm_rot_epi16

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

변경 기록

날짜

변경 내용

이유

2011년 3월

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

SP1 기능 변경