128bit 데이터형 안에 있는 pack의 값 한개를 넣고 뺄 때 사용한다. insert는 pack 한 개으 ㅣ값을 넣을 때, extract는 뺄 때 사용한다. 

 

Insert 함수

__m128i a : a7 a6 a5 a4 a3 a2 a1 a0

__m128i r = _mm_insert_epi16(__m128i a, int b, int imm)

imm = 3

__m128i r : a7 a6 a5 a4 b a2 a1 a0

 

16bit short 형 정수 8개를 담고있는 __m128i형 데이터에 입력받은 integer 형 정숫값 b를 입력한다. 입력하고자하는 pack의 위치는 상수 imm 값으로 지정한다.

 

 

Extract 함수

__m128i a : a7 a6 a5 a4 a3 a2 a1 a0

int r = _mm_insert_epi16(__m128i a, int imm)

imm = 6

int r = a6

 

16bit short형 정수 8개를 담고있는 __m128i형 데이터에 있는 값을 꺼내온다. 꺼내오고자 하는 pack의 위치는 상수 imm 값으로 지정한다.

 

Mask 생성 함수

8bit 정수형 pack을 가진 package에서 최상위 비트 한 개씩을 가져와서 리턴한다.

 

iont mask = _mm_moveask(_m128i a);

 

#include <iostream>
#include <afx.h>
using namespace std;
#include <emmintrin.h>

int main(int argc, char* argv[])
{
	__declspec(align(16)) short A[8] = { 1, 2, 3, 4, 5, 6, 7, 8};
	__declspec(align(16)) short R[8] = { 0 };

	__m128i xmmA = _mm_load_si128((__m128i*)A);

	__m128i xmmR = _mm_insert_epi16(xmmA,10, 3);		//insert 함수
	_mm_store_si128((__m128i*)R, xmmR);					//결과 출력
	cout << "Insert Result : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;

	int r = _mm_extract_epi16(xmmA, 6);					//extract 함수
	cout << "Extract Result : " << r << endl;			//결과 출력


	__declspec(align(16)) char B[16] = { 0xff, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

	__m128i xmmB = _mm_load_si128((__m128i*)B);		
	int mask = _mm_movemask_epi8(xmmB);					//mask 함수
	cout << "Mask = " << mask << endl;					//결과 출력


	return 0;
}

실행 결과

 

Posted by pi92

블로그 이미지
pi92

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.12
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함