2016-10-04 30 views
0

剛開始使用內在函數,並觸及某些暴露了我的無知的內容。下面是我所看到的人造版本(VS2015):Intel Intrinsics組件命令誤解

__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位整數,並將結果保存在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 

,但如果我換上面的輸入(使用評價值設定),然後我得到了看起來是整數飽和的結果: -

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將其輸入視爲已簽名,以防不清楚。