_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.의 권한으로 재현