Как преобразовать символ без знака в целое число со знаком с помощью Neon SIMD

Как преобразовать переменную типа данных uint8_t в int32_t с помощью Neon? Я не мог найти ничего внутреннего для этого.


person user3476225    schedule 29.05.2015    source источник


Ответы (1)


Предполагая, что вы хотите преобразовать вектор целых чисел 16 x 8 бит в четыре вектора целых чисел 4 x 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
person Paul R    schedule 29.05.2015
comment
Преобразование векторных типов NEON с помощью приведения не гарантируется, поэтому для большей переносимости вы должны написать vreinterpretq_s16_u16(vmovl_u8(vget_low_u8(v))) - person Charles Baylis; 01.06.2015
comment
@CharlesBaylis: спасибо - я не знал об этом - gcc, похоже, доволен исходными приведениями, но теперь я обновил ответ на основе вашего предложения. - person Paul R; 01.06.2015