在早期的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 指令的解压缩和解码(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 指令
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。