使用 NEON 内在函数存储非相邻 d 寄存器的最快方法

Fastest way of storing non-adjacent d registers with NEON intrinsics

我正在将 32 位 NEON asm 代码移植到 NEON 内在函数,我想知道是否可以使用内在函数以简洁的方式编写此代码:

vst4.32 {d0[0], d2[0], d4[0], d6[0]}, [%[v1]]!

1) 前面的代码对q寄存器进行操作,但是在存储时,没有使用q0q1q2和[=15] =],它必须重新创建每个部分都在 d 寄存器之一中的向量,例如v1[0] = d0[0], v1[1] = d2[0] ... v2[0] = d0[1], v2[1] = d2[1] ... v3[0] = d1[0], v3[1] = d3[0] ...

此操作是 asm 中的单行操作,但对于内在函数,我不知道我是否可以在不首先拆分高位和低位并构建新的 float32x4x4_t 变量以提供给 vst4_f32.

这可能吗?

2) 我不完全确定 [%[v1]]! 做了什么(是的,我用谷歌搜索了很多):它应该是对名为 v1 的变量的引用,感叹号将做 writeback,这应该意味着指针增加了与同一行上的指令写入的相同数量。

对吗?有什么方法可以用内在函数复制它吗?

好像是内联汇编。 无论如何,答案是:

1) 否

2) 是

原则上,足够智能的编译器可以使用您想要的 vst4_f32 内在指令,但实际上,没有哪个编译器那么好。

要得到post-索引写回,你可以写

vst4_f32(ptr, v);
ptr += 4;

一些编译器会识别这一点。 GCC 5.1(发布时)至少在某些情况下会这样做。

[编辑:误读了问题,vst4q_lane_f32 确实完美地映射到所需的指令]

经过更多调查后,我发现了这条针对 store a specific lane of an array of 4 vectors 的特定指令,因此无需拆分为高位和低位变量:

float32x4x4_t u = { q0, q1, q2, q3 };
vst4q_lane_f32(v1, u, 0);
v1 += 4;

正如@charlesbaylis 所写,Writeback 只是一个增加的指针。