Mir*_*cea 5 arm simd vectorization neon
我有兴趣找到比较存储在Cortex-A9内核上的NEON寄存器(比如Q0和Q3)的值的最快方法(最低周期数)(允许VFP指令).
到目前为止,我有以下内容:
(1)使用VFP浮点比较:
vcmp.f64 d0, d6
vmrs APSR_nzcv, fpscr
vcmpeq.f64 d1, d7
vmrseq APSR_nzcv, fpscr
Run Code Online (Sandbox Code Playgroud)
如果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
Run Code Online (Sandbox Code Playgroud)
D29寄存器先前预先加载了正确的16位模式:
vmov.i16 d29, #65280 ; 0xff00
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有比这更好的了?我是否在监督一些明显的方法呢?
我相信你可以通过一条指令来减少它。通过使用左移和插入(VLSI),可以将Q15的4个32位值组合成D31中的4个16位值。然后您可以与 0 进行比较并获取浮点标志。
vceq.i32 q15, q0, q3
vlsi.32 d31, d30, #16
vcmp.f64 d31, #0
vmrs APSR_nzcv, fpscr
Run Code Online (Sandbox Code Playgroud)