ARMv7-M参考手册的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发布于 2016-12-01 18:12:42
如果我想让一个有条件的分支离得更远,我该怎么办?
只需在该寄存器中使用带有目标地址的MOV{cond} PC, Rx指令:
LDR R1, =some_very_far_label
IT NE
MOVNE PC, R1发布于 2016-12-01 20:17:42
既然您说的是实际针对ARMv7,那么最好的方法就是忽略或禁用它,最好的方法是不以ARMv8 8-A为目标,从一开始就触发它。
对于v7 CPU来说,这是完全不相关的;对于现有的v8-A CPU来说,它基本上也是不相关的,因为AArch32的要点是向后兼容现有的v7代码,如果它们不运行该代码,至少不像它们的v7前辈那样运行,那么它们就不会很受欢迎。对于未来的V8-CPU,一旦很大一部分软件已经过渡到AArch64,在可能的情况下,重组您的AArch32代码以避免IT块可能是有意义的,但无论如何,最糟糕的事情就是只需要多个背对背的单指令块。
整件事都有点傻,真的。ARMv8-A体系结构参考手册对“IT的部分废弃”的描述是:
出于性能原因,ARMv8 8-A不推荐使用T32
IT指令。..。完整的ARMv7IT指令功能仍然可用,以便执行遗留的T32代码。..。
是的,可以有一个可选的控制位来捕获“废弃”的使用,但是即使v8-A CPU实现了这个功能,也没有任何操作系统期望运行v7代码来设置它。未来的AArch32实现仍然需要支持多指令IT块,它们可能比替代代码慢,因此ARM试图说服我们避免它们。坦率地说,我可以想象V8-CPU理论上的未来,它的目标不是运行现有的32位代码,因此可能会使那些使高效支持多指令it块变得不理想的优化变得更有可能完全放弃AArch32支持。
https://stackoverflow.com/questions/40916440
复制相似问题