ARM有多个指令集: A32 (32位长指令)和混合长度T32 ( 32位或16位长指令)。T32在ArmV8之前被称为拇指。
当16位指令减少代码大小时,32位指令可以具有更高的性能。
根据https://developer.arm.com/documentation/dui0473/m/dom1359731139853和https://developer.arm.com/architectures/instruction-sets,当使用混合长度指令时,可以为代码的不同部分分别定义使用的指令长度。
一些指令使用地址中最不重要的位来确定被分支到的代码是拇指代码还是ARM代码。T32指令集是作为16位指令的补充集引入的,它支持用户代码的改进代码密度。随着时间的推移,T32逐渐发展成为一个16位和32位混合长度指令集.因此,编译器可以在单个指令集中平衡性能和代码大小的权衡。
据我所知,默认的Rust来自目标(例如thumbv7m-none-eabi
= T32),但是如何在Rust中强制使用每个函数的指令长度呢?
这里有一个关于如何在C:https://stackoverflow.com/a/52692271/499839上启用它的答案
发布于 2022-04-03 09:24:27
这可以使用不稳定的特性isa_attribute
来完成。
#![feature(isa_attribute)]
#[instruction_set(arm::t32)]
pub unsafe fn t32() { ... }
#[instruction_set(arm::a32)]
pub unsafe fn a32() { ... }
https://stackoverflow.com/questions/71724365
复制相似问题