超标量处理器设计6-指令解码
1. 指令缓存
- 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来,这样指令在解码的时候,仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件,其原因有两个: 1. 每周期可以取指的个数大于每周期可以解码指令的个数,这样即使在I-Cache缺失的时候,指令缓存中仍然存在一些指令,不会引起流水线的暂停
- 有些复杂指令需要拆解成小的指令,因此需要指令缓存来缓存部分取出来的指令。
2. 指令译码完成的工作
- what type: 译码出指令是算术指令/访存指令还是分支指令,方便送到不同的issue queue
- what operation: 当指令是算术指令时,进行何种算术指令,当时访存指令时,是load还是store指令
- what resource: 译码出源寄存器和目的寄存器,rename要用
3. 常见指令的处理
3.1 分支指令
如果采用checkpoint的方式对分支预测失败的场景进行状态恢复,为了减少电路的复杂度,一般我们需要限制每周期内分支指令的个数,因此需要提前进行约束.
尽量提前检测预测错误的情况,可以减少penalty。
3.2 乘累加指令
涉及3 src的指令,所以PRF的读口个数会有影响
3.3 pre/post index指令
涉及 2 dst的指令,
pre-index : 对于load指令, 先更新存地址的寄存器值,然后用更新后的值索引内存 LDR W0, [X1, #12]
post-index: 先用寄存器的值索引内存,然后更新存放地址的寄存器值 LDR W0, [X1], #12
pre 和post针对的是啥时候更新X1的值
3.4 LDM/STM指令
这些涉及多个src和多个dst, 一般需要指令拆解