2016-10-04 5 views
0

내장 함수를 시작하고 내 무지가 노출 된 것을 누르십시오. 여기에 내가보고있는 무슨의 인공 버전 (VS2015)입니다 :인텔 내장 팩 명령에 오해가 있습니다

__m128i test; 

//test.m128i_u16[0] = 127; 
//test.m128i_u16[1] = 128; 
//test.m128i_u16[2] = 129; 
//test.m128i_u16[3] = 130; 
//test.m128i_u16[4] = 131; 
//test.m128i_u16[5] = 132; 
//test.m128i_u16[6] = 133; 
//test.m128i_u16[7] = 134; 

test.m128i_u16[0] = 50; 
test.m128i_u16[1] = 70; 
test.m128i_u16[2] = 90; 
test.m128i_u16[3] = 110; 
test.m128i_u16[4] = 50; 
test.m128i_u16[5] = 70; 
test.m128i_u16[6] = 90; 
test.m128i_u16[7] = 110; 

__m128i result = _mm_packus_epi16 (test, test); 

그래서 마지막 명령 "개종자가에서 16 비트 정수를 포장와 b의 부호없는 포화를 사용하여 8 비트 정수를 포장하기 위해, 그리고 그 결과를 저장 in dst ".

-  m128i_i8 char[16] 
     [0] 50  char 
     [1] 70  char 
     [2] 90  chara 
     [3] 110  char 
     [4] 50  char 
     [5] 70  char 
     [6] 90  char 
     [7] 110  char 
     [8] 50  char 
     [9] 70  char 
     [10] 90  char 
     [11] 110 char 
     [12] 50  char 
     [13] 70  char 
     [14] 90  char 
     [15] 110 char 

을하지만 난 (주석 값 세트를 사용) 위의 입력을 교환하면, 그때 정수 결과 포화 보인다 것을 얻을 : I가 표시된대로 실행하면, 내가 기대하는 것을 얻을 -

m128i_i8  char[16] 
     [0]  127  char 
     [1]  -128 char 
     [2]  -127 char 
     [3]  -126 char 
     [4]  -125 char 
     [5]  -124 char 
     [6]  -123 char 
     [7]  -122 char 
     [8]  127  char 
     [9]  -128 char 
     [10] -127 char 
     [11] -126 char 
     [12] -125 char 
     [13] -124 char 
     [14] -123 char 
     [15] -122 char 

무엇이 여기에 있습니까? 해석, 잘못된 명령?

+2

해당 입력 및 출력이 (가로 또는 세로로) 늘어서있는 테이블을 만들면 귀하의 질문이 훨씬 짧아지고 읽기 쉬워집니다. –

답변

1

부호없는 채도를 지정 했는데도 int8_t이 아닌 uint8_t 요소가 아닌 결과 벡터를 인쇄하는 것으로 보입니다. 따라서 127보다 큰 모든 값은 음수로 인쇄됩니다.

0xFF로 포화 된 모든 것은 -1로 인쇄됩니다. (0으로 포화 된 것은 모두 0으로 인쇄되지만, int16_t 입력은 모두 음수가 아닙니다.)

또한 PACKUSWB가 명확하지 않았다 경우, 서명으로 그 입력 취급 있습니다.