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

时间:2015-02-26 20:53:15

标签: ios neon

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

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

1)之前的代码在q个寄存器上运行,但在存储时,不是使用q0q1q2q3 ,它必须重新创建在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变量来提供给{{1} }。

这可能吗?

2)我不完全确定vst4_f32做了什么(是的,我google了很多):它应该是对名为[%[v1]]!的变量的引用,并且感叹号会做< em> writeback ,这意味着指针的增加量与同一行上的指令所写的数量相同。

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

3 个答案:

答案 0 :(得分:2)

经过一些调查后,我发现了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所写。

答案 1 :(得分:1)

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

要获得索引后回写,您可以编写

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

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

[编辑:误读了这个问题,vst4q_lane_f32完全映射到所需的指令]

答案 2 :(得分:0)

似乎是内联汇编。 无论如何,答案是:

1)否

2)是的