在拇指-2中长度有条件的分支

  • 本文关键字:有条件 分支 arm thumb
  • 更新时间 :
  • 英文 :


ARMV7-M参考手册的A6.7.12节给分支指令的四个可能的编码(B):

  • T1:16位指令,4位条件,8位地址
  • T2:16位指令,没有条件,11位地址
  • T3:32位指令,4位条件,17位地址
  • T4:32位指令,没有条件,21位地址

使用T3(以及T1和T2),我只能分支在程序计数器中解决-1048576和1048574位置。如果我想让有条件的分支更远?

该怎么办?

以下(在UAL中):

it     ne
bne.w  some_far_label

给我一个弃用警告:

Warning: IT blocks containing 32-bit Thumb instructions are deprecated in ARMv8

如果我要有条件的分支更远?

我该怎么办?

只需在该寄存器中使用MOV{cond} PC, Rx指令与目标地址:

LDR R1, =some_very_far_label
IT NE
MOVNE PC, R1

由于您正在谈论实际针对ARMV7,因此警告的最好的事情就是简单地忽略或禁用它,理想情况下,不要针对ARMV8-A在第一个中挑衅它位置。

对于v7 cpu,它完全无关;对于现有的V8-A CPU,这也很大程度上无关,因为AARCH32的主要点与现有V7代码具有向后兼容性,并且如果它们至少没有运行该代码,那么他们的V7前辈就不会很受欢迎。对于将来的V8-A CPU,一旦大部分软件已过渡到Aarch64,可能会在重组您的AARCH32代码以避免使用时会有所一点,无论哪种方式,最糟糕的是,这是最糟糕的。要做的就是最终得到多个背对背的单建筑块。

整个事情确实有点愚蠢。ARMV8-A体系结构参考手册所说的关于"部分贬值"的内容是:

出于绩效原因,

ARMV8-a弃用T32 IT指令的某些用途。[...]完整的ARMV7 IT指令功能仍然可用,以执行旧版T32代码。[...]

是的,可能会有一个可选的控制位来捕获"弃用"的用途,但是即使V8-A CPU确实实现了它,也没有希望运行V7代码的OS将其设置。多指令它仍然必须得到未来的AARCH32实现的支持,它们可能比替代代码慢,因此ARM试图说服我们避免它们。坦率地说,我认为理论未来的V8-A CPU并非针对运行现有的32位代码,因此可能会进行优化,这使得它不可能有效地支持多层实体,这可能会有效地阻止它,这可能更有可能是更有可能的无论如何,只要放弃Aarch32的支持。

最新更新