다음을 통해 공유


_mm_insert_si64, _mm_inserti_si64

Microsoft 전용

두 번째 피연산자의 insertq 비트를 첫 번째 피연산자로 삽입하는 명령을 생성합니다.

구문

__m128i _mm_insert_si64(
   __m128i Source1,
   __m128i Source2
);
__m128i _mm_inserti_si64(
   __m128i Source1,
   __m128i Source2
   int Length,
   int Index
);

매개 변수

Source1
[in] 필드가 삽입될 하위 64비트에서 입력 데이터가 있는 128비트 필드입니다.

Source2
[in] 하위 비트에 삽입할 데이터가 있는 128비트 필드입니다. 의 경우 _mm_insert_si64상위 비트에 필드 설명자도 포함됩니다.

길이
[in] 삽입할 필드의 길이를 지정하는 정수 상수입니다.

Index
[in] 데이터를 삽입할 필드의 가장 중요한 비트의 인덱스를 지정하는 정수 상수입니다.

반환 값

하위 64비트가 원본1의 원래 하위 64비트를 포함하고 지정된 비트 필드가 Source2의 하위 비트로 대체된 128비트 필드입니다. 반환 값의 상위 64비트가 정의되지 않았습니다.

요구 사항

Intrinsic 아키텍처
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

헤더 파일<intrin.h>

설명

이러한 내장 함수는 Source2에서 Source1비트를 삽입하는 명령을 생성 insertq 합니다. 두 가지 버전 _mm_inserti_si64이 있습니다. 즉, 즉시 실행 버전이며 _mm_insert_si64 직접 실행되지 않는 버전입니다. 각 버전은 Source2에서 지정된 길이의 비트 필드를 추출하여 Source1에 삽입합니다. 추출된 비트는 Source2의 가장 중요한 비트입니다. 이러한 비트를 삽입할 Source1 필드는 가장 중요한 비트의 길이와 인덱스로 정의됩니다. 길이 및 인덱스의 값은 모드 64로 설정되므로 -1과 127은 모두 63으로 해석됩니다. (축소된) 비트 인덱스 및 (축소된) 필드 길이의 합계가 64보다 크면 결과가 정의되지 않습니다. 필드 길이에 대해 0의 값은 64로 해석됩니다. 필드 길이와 비트 인덱스가 모두 0이면 Source2비트 63:0이 Source1삽입됩니다. 필드 길이가 0이지만 비트 인덱스가 0이 아니면 결과가 정의되지 않습니다.

_mm_insert_si64 호출에서 필드 길이는 Source2의 비트 77:72 및 비트 69:64의 인덱스에 포함됩니다.

컴파일러에서 정수 상수로 확인할 수 없는 인수를 사용하여 호출 _mm_inserti_si64 하는 경우 컴파일러는 해당 값을 XMM 레지스터에 압축하고 호출 _mm_insert_si64하는 코드를 생성합니다.

명령에 대한 insertq 하드웨어 지원을 확인하려면 내장 InfoType=0x80000001 함수를 __cpuid 호출하고 6의 CPUInfo[2] (ECX)비트 6을 확인합니다. 명령이 지원되는 경우 이 비트는 1이고, 그렇지 않으면 0입니다. 명령을 지원하지 insertq 않는 하드웨어에서 내장 함수를 사용하는 코드를 실행하면 결과를 예측할 수 없습니다.

예시

// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source1, source2, source3, result1, result2, result3;

int
main()
{

    __int64 mask;

    source1.ui64[0] = 0xffffffffffffffffll;
    source2.ui64[0] = 0xfedcba9876543210ll;
    source2.ui64[1] = 0xc10;
    source3.ui64[0] = source2.ui64[0];

    result1.m = _mm_insert_si64 (source1.m, source2.m);
    result2.m = _mm_inserti_si64(source1.m, source3.m, 16, 12);
    mask = 0xffff << 12;
    mask = ~mask;
    result3.ui64[0] = (source1.ui64[0] & mask) |
                      ((source2.ui64[0] & 0xffff) << 12);

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;

}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff

Microsoft 전용 종료

부분 저작권 2007 고급 마이크로 디바이스, Inc. 모든 권한이 예약되어 있습니다. 고급 마이크로 디바이스, Inc.의 권한으로 재현

참고 항목

_mm_extract_si64, _mm_extracti_si64
컴파일러 내장 함수