根据ARM参考,我们有2个函数分别加载8和16个uint8_t实例:
uint8x16x3_t vld3q_u8(__transfersize(48) uint8_t const * ptr);
// VLD3.8 {d0, d2, d4}, [r0]
uint8x8x3_t vld3_u8(__transfersize(24) uint8_t const * ptr);
// VLD3.8 {d0, d1, d2}, [r0]
在NEON内在函数中,我尝试了vld3q_u8,并且一切顺利,加载了16 * 3个uint8元素;但是,当我在NEON汇编中使用VLD3.8 {d0,d2,d4}时,只加载了8 * 3个uint8元素。
在我看来,没有使用d1,d3和d5寄存器。
我想完全使用q0(d0,d1),q1(d2,d3)和q3(d4,d5)寄存器来加载16 * 3的uint8元素。
有人可以帮忙吗?
//sample code:
vld3.8 {d0, d2, d4}, [%[A]]!
vst.3.8 {d0, d2, d4}, [%[C]]!
我正在为32位ARM架构构建它。
答案 0 :(得分:2)
在我看来,没有使用d1,d3和d5寄存器
确实他们不是,除非你加载它们。内在参考文献非常清楚的是,Q-form加载/存储内在函数每个都扩展为两个指令 - 仅基础vldn
/ vstn
指令目标D寄存器,但可以连续地或以2的步幅执行,这样一对指令可以按适当的顺序加载寄存器对。
以下是vld3q_u8
内在实际上看起来像原位的反汇编示例:
0: f460650f vld3.8 {d22,d24,d26}, [r0]
4: e2802018 add r2, r0, #24
...
c: f462750f vld3.8 {d23,d25,d27}, [r2]
...
这是针对编译器明显已分配Q11-13的uint8x16x3_t
变量。