【发布时间】:2016-09-21 23:03:06
【问题描述】:
根据 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 架构构建它。
【问题讨论】:
-
请提供您的确切代码,因此这是minimal reproducible example。另外,您是为 AArch64 还是为 32 位 ARM 构建? (在 AArch64 中,d1 不是 q0 的高半部分;有 32 个单独的 q 寄存器。)
标签: assembly optimization arm neon