Yve*_*ust 4 gcc arm intrinsics neon
我正在使用来自C++代码的NEON内在函数进行ARM优化.我理解并掌握了大多数打字问题,但我仍然坚持这一点:
该指令vzip_u8返回一个uint8x8x2_t值(实际上是一个两个数组uint8x8_t).我想将返回的值分配给plain uint16x8_t.我认为没有适当的vreinterpretq内在实现这一点,简单的演员阵容被拒绝.
一些定义要清楚地回答......
NEON有32个寄存器,64位宽(双视图为16个寄存器,128位宽).
NEON单元可以查看相同的寄存器组:
- 16个128位四字寄存器,Q0-Q15
- 32个64位双字寄存器,D0-D31.
uint16x8_t是一种需要128位存储的类型,因此它需要在quadword寄存器中.
ARM NEON Intrinsics vector array data type在ARM®C语言扩展中有一个定义:
...用于加载和存储操作,表查找操作,以及返回一对向量的结果操作类型.
vzip指令
...交错两个向量的元素.
vzip Dd,Dm
并且具有内在的相似性
uint8x8x2_t vzip_u8 (uint8x8_t, uint8x8_t)
Run Code Online (Sandbox Code Playgroud)
从这些我们可以得出结论,uint8x8x2_t实际上是两个随机编号双字寄存器的列表,因为vzip指令对输入寄存器的顺序没有任何要求.
现在答案是......
uint8x8x2_t可以包含非连续的两个双字寄存器,同时uint16x8_t是由两个连续双字寄存器组成的数据结构,第一个具有偶数索引(D0-D31-> Q0-Q15).
因此,您不能vector array data type轻易地将两个双字寄存器转换为四字寄存器.
编译器可能足够聪明,可以帮助您,或者您可以强制转换,但是我会检查生成的程序集的正确性和性能.