如何使用 Neon SIMD 将无符号字符转换为有符号整数
How to convert unsigned char to signed integer using Neon SIMD
如何使用 Neon 将数据类型 uint8_t
的变量转换为 int32_t
?我找不到这样做的任何内在因素。
假设您要将一个 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
如何使用 Neon 将数据类型 uint8_t
的变量转换为 int32_t
?我找不到这样做的任何内在因素。
假设您要将一个 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