如何在ARM拇指上设置函数的指令大小(16位或32位)



ARM有多个指令集:A32(32位长的指令(和混合长度T32(32位或16位长的命令(。T32在ArmV8之前被称为Thumb。

虽然16位指令减少了代码大小,但32位指令可以具有更高的性能。

根据https://developer.arm.com/documentation/dui0473/m/dom1359731139853和https://developer.arm.com/architectures/instruction-sets,当使用混合长度指令时,可以分别为代码的不同部分定义使用的指令长度。

一些指令使用地址的最低有效位来确定分支到的代码是Thumb代码还是ARM代码

T32指令集是作为16位指令的补充集引入的,支持提高用户代码的代码密度。随着时间的推移,T32演变成了一个16位和32位的混合长度指令集。因此,编译器可以在单个指令集中平衡性能和代码大小的权衡

据我所知,Rust中的默认值来自目标(例如thumbv7m-none-eabi=T32(,但如何在Rust中强制使用基于每个函数的指令长度?

以下是关于如何在C上启用它的答案:https://stackoverflow.com/a/52692271/499839

这可以使用不稳定的特性isa_attribute来完成。

#![feature(isa_attribute)]
#[instruction_set(arm::t32)]
pub unsafe fn t32() { ... }
#[instruction_set(arm::a32)]
pub unsafe fn a32() { ... }

最新更新