我有兴趣寻找一种最快的方式(最低的周期计数),以比较存储在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

我的问题是:还有什么比这更好的了吗?我正在监督一些明显的方法吗?

最佳答案

我相信您可以通过一条指令减少它。通过使用左移并插入(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

关于ARM NEON : comparing 128 bit values,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9068959/

10-12 18:57