我正在将 32 位 NEON asm 代码移植到 NEON 内在函数,我想知道是否可以使用内在函数以简洁的方式编写此代码:
vst4.32 {d0[0], d2[0], d4[0], d6[0]}, [%[v1]]!
1) 前面的代码是对q
寄存器进行操作的,但是涉及到存储的时候,没有使用q0
, q1
, q2
和 q3
,它必须重新创建向量,每个部分都在 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,这应该意味着指针增加了与同一行上的指令写入的相同数量。
对吗?有什么方法可以用内在函数复制它?
最佳答案
经过更多调查后,我发现了这条针对 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 只是一个增加的指针。
关于ios - 使用 NEON 内在函数存储非相邻 d 寄存器的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28752533/