ARM Cortex A7:避免内存贴面?
ARM Cortex A7: avoid memory veneers?
在支持 Thumb 的 ARMv7 上,我们是否可以通过使用 BX
指令来避免所有的胶合代码?
由于这条指令需要一个 32 位寄存器,我们可以吗?
如果是,当我在生成的代码中看到单板时,我应该专门为我的机器输出,对吗?
谢谢
是的,因为 BX
采用 32 位寄存器,所以不需要 veneers,因为您可以覆盖整个寻址 space。
当然你需要将一个 32 位值加载到寄存器中,这通常意味着常量池,所以如果你想从中挤出每个周期并且你的程序不是太大你是与相关分支机构更好。正如@Notlikethat 指出的那样,如果您还没有在寄存器中拥有地址,那么在您可以 LDR PC, ...
时使用 BX
是没有意义的(除非您需要支持 ARMv4T 互通)。
相对、非条件、32 位 Thumb 分支具有 24 位寻址 space,因此您可以达到 +/- 16MB(对于其他人,请参阅 here). If you're doing ELF, be really careful with 16-bit relative Thumb branches. A 32-bit branch will generate a 24-bit relocation and the linker will insert a veener if the target can't be addressed with 24 bits. A 16-bit branch generates a 11-bit relocation and ELF for ARM 指定 linker 是 not 为那些生成 veeners 所必需的,所以你会冒 link-time out-of-range 分支的风险。
在支持 Thumb 的 ARMv7 上,我们是否可以通过使用 BX
指令来避免所有的胶合代码?
由于这条指令需要一个 32 位寄存器,我们可以吗?
如果是,当我在生成的代码中看到单板时,我应该专门为我的机器输出,对吗?
谢谢
是的,因为 BX
采用 32 位寄存器,所以不需要 veneers,因为您可以覆盖整个寻址 space。
当然你需要将一个 32 位值加载到寄存器中,这通常意味着常量池,所以如果你想从中挤出每个周期并且你的程序不是太大你是与相关分支机构更好。正如@Notlikethat 指出的那样,如果您还没有在寄存器中拥有地址,那么在您可以 LDR PC, ...
时使用 BX
是没有意义的(除非您需要支持 ARMv4T 互通)。
相对、非条件、32 位 Thumb 分支具有 24 位寻址 space,因此您可以达到 +/- 16MB(对于其他人,请参阅 here). If you're doing ELF, be really careful with 16-bit relative Thumb branches. A 32-bit branch will generate a 24-bit relocation and the linker will insert a veener if the target can't be addressed with 24 bits. A 16-bit branch generates a 11-bit relocation and ELF for ARM 指定 linker 是 not 为那些生成 veeners 所必需的,所以你会冒 link-time out-of-range 分支的风险。