Q 寄存器的两个子部分之和的 NEON 内在函数

NEON intrinsic for sum of two subparts of a Q register

我在 uint16x8_t(Q 寄存器)中有一个值。如果它是 asm,我会添加寄存器的两个子部分,例如对于 Q0,它将是 vadd_u16(d0, d1) 我需要的结果。问题是我不知道如何使用 neon 内在函数来获得它,因为没有从 uint16x8_t 到 uint16x4x2_t 的转换能够将低和高部分传递给 vadd_u16。

有很多 vreinterpret_x_y 宏,但没有一个可以从 uint16x8_t 转换为 uint16x4x2_t。我是否遗漏了什么,在 arm-neon 中应该如何完成这样的操作?

您可以使用vget_low and vget_high

然而,问题是编译器会把它弄得一团糟,从而导致严重的性能损失。

Android Studio 中的 built-in Clang 处理这些问题特别糟糕,因此 GCC 版本低于 6.x

您唯一的选择是将工具链更新到最新的,或者坚持使用汇编。