【问题标题】:ARM Cortex A7: avoid memory veneers?ARM Cortex A7:避免内存贴面?
【发布时间】:2017-01-21 12:36:12
【问题描述】:

在支持 Thumb 的 ARMv7 上,我们是否可以通过使用 BX 指令来避免所有的胶合板?

由于这条指令需要一个 32 位的寄存器,我们好吗?

如果是,当我在生成的代码中看到胶合代码时,我应该专门为我的机器输出,对吗?

谢谢

【问题讨论】:

  • 一般来说,当目标太远时,链接器会开始对分支进行贴面——你的代码有多大?
  • 对于 ARMv4T 互通单板(我忘记了),最好的解决方案可能是“不要针对 ARMv4T”或“不要使用 Thumb 代码” ,具体取决于您需要支持的具体内容。我们在这里讨论的是 C 代码(在这种情况下您无论如何都不能完全选择指令)还是汇编代码(在这种情况下您应该能够在适当的情况下使用blx)?
  • 它本质上是一个 gpu 堆栈,因此地址可以彼此远离。 BX 指令解决了我的问题,最终,正如 Andrea 所建议的,将使用相对跳转。谢谢 Notlikethat :)

标签: arm compiler-optimization 32-bit


【解决方案1】:

是的,由于 BX 采用 32 位寄存器,因此不需要 veeners,因为您可以覆盖整个寻址空间。

当然,您需要将 32 位值加载到寄存器中,这通常意味着不断池化,因此,如果您希望从中挤出每个周期并且您的程序不太大,那么您最好与相关分支。正如@Notlikethat 所指出的,如果您还没有寄存器中的地址,那么使用BX 是没有意义的,而您可以只使用LDR PC, ...(除非您需要支持ARMv4T 互通)。

相对、非条件、32 位 Thumb 分支具有 24 位寻址空间,因此您可以达到 +/- 16MB(其他请参阅 here)。如果您正在使用 ELF,请非常小心使用 16 位相对 Thumb 分支。 32 位分支将生成 24 位重定位,如果无法使用 24 位寻址目标,链接器将插入一个 veener。 16 位分支生成 11 位重定位,ELF for ARM 指定链接器不需要为它们生成 veeners,因此您将面临链接时间超出范围分支的风险.

【讨论】:

  • 关于第二段,如果您还没有寄存器中的地址,那么当您可以直接使用ldr pc,... 时使用bx 真的没有意义(除了不太可能必须支持 ARMv4T 互通)。
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 2021-05-19
  • 2023-03-14
  • 2014-10-05
  • 2022-10-16
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多