2015-05-29 3 views

ответ

6

Предполагая, что вы хотите, чтобы преобразовать вектор размера 16 х 8 разрядных целых чисел до четырех векторов 4 х 32 битных Интсов, вы можете сделать это первой распаковку до 16 бит, а затем снова 32 бит:

// load 8 bit vector 
uint8x16_t v = vld1q_u8(p); // load vector of 16 x 8 bits ints from p 

// unpack to 16 bits 
int16x8_t vl = vreinterpretq_s16_u16(vmovl_u8(vget_low_u8(v))); // 0..7 
int16x8_t vh = vreinterpretq_s16_u16(vmovl_u8(vget_high_u8(v))); // 8..15 

// unpack to 32 bits 
int32x4_t vll = vmovl_s16(vget_low_s16(vl));   // 0..3 
int32x4_t vlh = vmovl_s16(vget_high_s16(vl));   // 4..7 
int32x4_t vhl = vmovl_s16(vget_low_s16(vh));   // 8..11 
int32x4_t vhh = vmovl_s16(vget_high_s16(vh));   // 12..15 
+4

Типы векторов NEON не гарантируются конвертируемыми приведениями, поэтому для большей мобильности вы должны написать 'vreinterpretq_s16_u16 (vmovl_u8 (vget_low_u8 (v))) –

+0

@CharlesBaylis: спасибо - я не знал об этом - gcc кажется довольным оригинальные ролики, но теперь я обновил ответ на основании вашего предложения. –

Смежные вопросы