如何加载 4 个无符号字符并使用 NEON 将它们转换为带符号的短裤?

How to load 4 unsigned chars and convert them to signed shorts with NEON?

我想从内存中加载 4 个无符号字符(8 位)并将它们扩展为带符号的短裤(16 位)。我如何使用 NEON 内在函数来做到这一点?

从 NEON 内在函数列表中,我一次只能看到 8 个无符号字符的加载选项。但我想为 4 个无符号字符做。这可能吗?

我认为它看起来类似于:

inline int16x4_t LoadAndConvert4(const uint8_t * p)
{
    return vreinterpret_s16_u16(vget_low_u16(vmovl_u8(
        vreinterpret_u8_u32(vdup_n_u32(*(uint32_t*)p)))));
}

或一步一步:

inline int16x4_t LoadAndConvert4(const uint8_t * p)
{
    uint32_t u32 = *(uint32_t*)p;
    uint32x2_t u32x2 = vdup_n_u32(a32);
    uint8x8_t u8x8 = vreinterpret_u8_u32(a32x2);
    uint16x8_t u16x8 = vmovl_u8(a8x8);
    uint16x4_t u16x4 = vget_low_u16(a16x8);
    return vreinterpret_s16_u16(u16x4);
}