在早期的ARM7TDMI 的三级流水线的体系结构中,为了支持Thumb 指令集,ARM 指令体系需要增加Thumb 解压缩器。 ARM7TDMI 是第一个应用此技术的核。 ARM7 和ARM7T 核完成单周期的执行都是需要三个阶段:取指令、译码和执行。 指令经过各个阶段是由时钟相位的高低来控制的,ARM7TDMI 正是利用了这个特点,考虑流水线各级间的平衡,利用译码阶段的一个未用的时钟相位,将Thumb 指令解压还原为32 位相应的ARM 指令来完成对Thumb指令的解压缩。 这些16 位的Thumb 指令可以由处理器在译码级解压成32 位的ARM 指令,在ARM 核里运行。 这样,不需要再附加时间费用和单独的解码周期,就可以维持指令的执行。 图2.4 为ARM7TDMI 中ARM7 和ARM7T 取指令、解压缩与执行的过程。 图2. 5 为Thumb 指令的解压缩和解码过程:从流水的取指令阶段得到的ARM 指令,经过ARM 译码,并且激活主副操作码控制信号。 其中,主操作码描述了要执行指令的类型,副操作码说明了指令的细节,诸如存储器、操作数等。 在Thumb 状态,多路复用器指导指令经过Thumb 解压缩逻辑,转换为相应的ARM 指令,然后执行。

图2.4 ARM7 和ARM7T 取指令、解压缩与执行

图2.5 Thumb 指令的解压缩和解码(https://www.xing528.com)
为了更好地理解,在此列举Thumb 的ADD 指令转换为ARM 的ADD 指令的过程,如图2.6所示。 原Thumb 指令的主操作码直接传给ARM 指令,副操作码先查表转换成相应的代码再放入ARM 指令中。 ARM 指令继承了从主操作码得来的执行条件(always condition code)。主操作码选择Thumb 的操作数传给ARM 指令,寄存器号码前面加一位“0”扩展成4 位(因为Thumb 指令只能用R0 ~R7 这8 个通用寄存器作为操作数,所以原来只用3 位)。 常数值前边也加“0000”扩展,因为原Thumb 指令中的常数是8 位。 这种解方案将会应用于所有的ARM核和未来的系列产品中。
在后来的ARM9TDMI 的五级流水线的体系结构中,这些16 位的Thumb 指令又由处理器在译码级直接译码产生相应的控制信号,然后在ARM 核里运行。

图2.6 Thumb 的ADD 指令转换为ARM 的ADD 指令
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
