ARMv7-M reference manual的A6.7.12节为分支指令(B
)提供了四种可能的编码:
对于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
答案 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
指令。 [...]完整的ARMv7IT
指令功能仍然可用,以便执行传统的T32代码。 [...]
是的,可以有一个可选的控制位来捕获'不赞成'的用法,但即使v8-A CPU确实实现了这一点,也没有任何期望运行v7代码的操作系统会设置它。未来的AArch32实现仍然需要支持多指令IT块,它们可能比替代代码慢,因此ARM试图说服我们避免它们。坦率地说,我想象一下理论上未来的v8-A CPU并非针对运行现有的32位代码,因此可能会进行优化,这使得难以有效地支持多指令IT块,可能更有可能完全放弃AArch32的支持。