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

Arm Q寄存器两个子部分之和的NEON内在函数,arm,neon,Arm,Neon,我在uint16x8\u t(Q寄存器)中有一个值。如果是asm,我会添加寄存器的两个子部分,例如,对于Q0,它将是vadd_u16(d0,d1)我需要的结果。问题是,我不知道如何使用霓虹灯内部器件实现这一点,因为没有从uint16x8\u t到uint16x4x2\u t的转换,从而能够将低部分和高部分传递到vadd\u u16 有很多vreinterpret_x_y宏,但没有一个宏从uint16x8_t转换为uint16x4x2_t。我是否遗漏了一些东西,在arm neon中应该如何进行此类

我在uint16x8\u t(Q寄存器)中有一个值。如果是asm,我会添加寄存器的两个子部分,例如,对于Q0,它将是
vadd_u16(d0,d1)
我需要的结果。问题是,我不知道如何使用霓虹灯内部器件实现这一点,因为没有从uint16x8\u t到uint16x4x2\u t的转换,从而能够将低部分和高部分传递到vadd\u u16

有很多vreinterpret_x_y宏,但没有一个宏从uint16x8_t转换为uint16x4x2_t。我是否遗漏了一些东西,在arm neon中应该如何进行此类操作?

您可以使用

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

Android Studio中内置的叮当声在处理这些问题时尤其糟糕,GCC版本低于6.x也是如此

您唯一的选择是将工具链更新为最新的工具链,或坚持使用部件。

您可以使用

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

Android Studio中内置的叮当声在处理这些问题时尤其糟糕,GCC版本低于6.x也是如此


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

奇怪的是,这些被列为VMOV指令,而从Q寄存器引用Dn、Dn+1显然不需要任何操作码。我总是写neon asm,从来没有写过neon Intrinsic,也不知道如何解决这个问题。@Pavel我注意到GCC6.x或更高版本可以按照您想象的方式处理它们,但是任何旧版本都会生成带有大量
vmov
的FUBAR机器代码。Android Studio上内置的
叮当声
尤其糟糕。@Pavel我甚至试着求助于
联合
,但情况更糟。(内存加载/存储)。这是真正的“内在体验”。请继续使用程序集。我使用内部函数来测试/验证代码。似乎最新的clang/gcc实际上为我混乱的本质生成了体面的代码。我很好奇ms arm或armcc会产生什么,这很奇怪,它们被列为VMOV指令,而引用Q寄存器中的Dn,Dn+1显然不需要任何操作码。我总是写neon asm,从来没有写过neon Intrinsic,也不知道如何解决这个问题。@Pavel我注意到GCC6.x或更高版本可以按照您想象的方式处理它们,但是任何旧版本都会生成带有大量
vmov
的FUBAR机器代码。Android Studio上内置的
叮当声
尤其糟糕。@Pavel我甚至试着求助于
联合
,但情况更糟。(内存加载/存储)。这是真正的“内在体验”。请继续使用程序集。我使用内部函数来测试/验证代码。似乎最新的clang/gcc实际上为我混乱的本质生成了体面的代码。我很好奇arm女士或armcc会生产什么