NEON ASM中的VLD3.8并不像vld3q_u8文档那样工作吗?

时间:2016-09-21 23:03:07

标签: assembly optimization arm neon

根据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架构构建它。

1 个答案:

答案 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变量。