【发布时间】:2011-12-29 08:05:47
【问题描述】:
有一个比较:
if( val0 > val1 )
其中 val0 和 val1 是双变量。
Apple LLVM 编译器生成的代码是
+0x184 vcmpe.f64 d17, d16
+0x188 vmrs APSR_nzcv, fpscr <-- FP status transfer (30 cycles stall of ALU)
+0x18c ble.w .....
有什么办法可以避免这种转移?
[更新] 代码在 Cortex-A8 处理器上运行。
【问题讨论】:
-
如何将它们作为符号和幅度整数进行比较?这是possible with IEEE-754。
-
@Alex,也许你先解释一下为什么需要这个?通过部分进行比较肯定会更慢和更长。
-
你在哪里找到了 30 次循环图?
-
我怀疑这是标志传输,您更有可能在等待 vcmpe 完成,然后才能执行 vmrs 指令,vmrs 已停止。如果您同时还有其他想做的事情,请先做,然后执行 vmrs 和 ble。
-
@Alex,根据 Cortex-A9 文档,vcmpe.f64 的最大延迟为 5(1 个指令延迟,4 是结果写回),vmrs 是免费的,它根本没有延迟。但是,vcmpe.f64 是 VFP 指令,VFP 单元在 A8/A9 上根本没有流水线,并且与 NEON 共享资源。所以,如果你在 vcmpp 之前有一些 NEON 代码,那么停顿可能是由 VFP-NEON 域更改引起的。
标签: performance floating-point llvm arm7 assembly