ARM NEON:比较 128 位值
我感兴趣的是找到比较 Cortex-A9 内核(允许使用 VFP 指令)上 NEON 寄存器(例如 Q0 和 Q3)中存储的值的最快方法(最低周期数)。
到目前为止,我有以下内容:
(1)使用VFP浮点比较:
vcmp.f64 d0, d6
vmrs APSR_nzcv, fpscr
vcmpeq.f64 d1, d7
vmrseq APSR_nzcv, fpscr
如果64位“浮点数”相当于NaN,则该版本将无法工作。
(2) 使用 NEON 缩小和 VFP 比较(这次仅一次且以 NaN 安全的方式):
vceq.i32 q15, q0, q3
vmovn.i32 d31, q15
vshl.s16 d31, d31, #8
vcmp.f64 d31, d29
vmrs APSR_nzcv, fpscr
D29 寄存器先前已预加载正确的 16 位模式:
vmov.i16 d29, #65280 ; 0xff00
我的问题是:还有比这更好的吗?我是否在监督一些明显的方法来做到这一点?
I'm interested in finding the fastest way (lowest cycle count) of comparing the values stored into NEON registers (say Q0 and Q3) on a Cortex-A9 core (VFP instructions allowed).
So far I have the following:
(1) Using the VFP floating point comparison:
vcmp.f64 d0, d6
vmrs APSR_nzcv, fpscr
vcmpeq.f64 d1, d7
vmrseq APSR_nzcv, fpscr
If the 64bit "floats" are equivalent to NaN, this version will not work.
(2) Using the NEON narrowing and the VFP comparison (this time only once and in a NaN-safe manner):
vceq.i32 q15, q0, q3
vmovn.i32 d31, q15
vshl.s16 d31, d31, #8
vcmp.f64 d31, d29
vmrs APSR_nzcv, fpscr
The D29 register is previously preloaded with the right 16bit pattern:
vmov.i16 d29, #65280 ; 0xff00
My question is: is there any better than this? Am I overseeing some obvious way to do it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我相信你可以通过一条指令来减少它。通过使用左移和插入(VLSI),可以将Q15的4个32位值组合成D31中的4个16位值。然后您可以与 0 进行比较并获取浮点标志。
I believe you can reduce it by one instruction. By using the shift left and insert (VLSI), you can combine the 4 32-bit values of Q15 into 4 16-bit values in D31. You can then compare with 0 and get the floating point flags.