Thumb-2中的长条件分支

时间:2016-12-01 17:08:35

标签: arm thumb

ARMv7-M reference manual的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

2 个答案:

答案 0 :(得分:1)

  

如果我想让条件分支更远,我该怎么办?

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

LDR R1, =some_very_far_label
IT NE
MOVNE PC, R1

答案 1 :(得分:1)

由于你所说的实际上是针对ARMv7的,所以关于这个警告的最好办法就是简单地忽略或禁用它,理想情况是首先不要将ARMv8-A作为目标来激活它。

对于v7 CPU,它完全无关紧要;对于现有的v8-A CPU来说,它在很大程度上也是无关紧要的,因为AArch32的主要观点是与现有v7代码的向后兼容性,如果他们没有至少像他们的v7前辈一样运行该代码,他们就不会一直很受欢迎。对于未来的v8-A CPU,一旦很大一部分软件转换为AArch64,可能可能重组您的AArch32代码,以避免尽可能避免IT阻塞,但无论哪种方式,最差的要做的就是最终得到多个背对背的单指令块。

整件事真的有点傻。 “ARMv8-A架构参考手册”中有关“部分弃用IT”的内容如下:

  

出于性能原因,ARMv8-A不赞成使用T32 IT指令。 [...]完整的ARMv7 IT指令功能仍然可用,以便执行传统的T32代码。 [...]

是的,可以有一个可选的控制位来捕获'不赞成'的用法,但即使v8-A CPU确实实现了这一点,也没有任何期望运行v7代码的操作系统会设置它。未来的AArch32实现仍然需要支持多指令IT块,它们可能比替代代码慢,因此ARM试图说服我们避免它们。坦率地说,我想象一下理论上未来的v8-A CPU并非针对运行现有的32位代码,因此可能会进行优化,这使得难以有效地支持多指令IT块,可能更有可能完全放弃AArch32的支持。