【问题标题】:How to load 4 unsigned chars and convert them to signed shorts with NEON?如何加载 4 个未签名的字符并将它们转换为带有 NEON 的签名短裤?
【发布时间】:2017-09-17 04:24:18
【问题描述】:

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

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

【问题讨论】:

  • 你能以intrinisics的形式告诉我吗。我不想使用汇编。

标签: c gcc arm simd neon


【解决方案1】:

我认为它看起来会像这样:

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);
}

【讨论】:

  • 我得到以下错误,file.c:1239:错误:请求成员 'val' in 'vmovl_u8(((builtin_neon_uqi __vector)vdup_n_u32(( (uint32_t)ucptr))))',属于非类类型 'builtin_neon_uhi __vector' file.c:1240: error: cannot convert 'builtin_neon_hi __vector' to 'const int16_t*' for argument '1' to 'builtin_neon_hi __vector vld1_s16(const int16_t*)'
  • @pythonic 对不起。我忘记了一个右括号。
  • 仍然报错:初始化时无法将 'builtin_neon_uhi __vector' 转换为 'builtin_neon_uhi __vector'。另外,我想要一个签名短裤的向量,而不是未签名的短裤。
  • 我们将无符号 8 字节整数转换为无符号 16 字节 (0xFF -> 0x00FF),因此我们可以将它们转换为有符号 16 字节整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2016-01-06
相关资源
最近更新 更多