【问题标题】:Floating point status transfer on ARM7 Cortex A8ARM7 Cortex A8 上的浮点状态传输
【发布时间】: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


【解决方案1】:

似乎不可能避免标志转换,因为代码流管理处理处理器的 ARM 部分,而不是 Neon 协处理器。 问题已结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2014-01-29
    • 2015-04-23
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    相关资源
    最近更新 更多