指令解码

指令解码

指令解码:将指令中携带的信息提取出来,处理器使用这些信息来控制后续的流水线执行这条指令。

CISC指令长度不固定,解码首先需要分辨指令边界,寻址方式也很复杂,提升了解码难度。

RISC指令长度固定,寻址方式相对简单,解码更容易。

超标量处理器希望一个周期能够解码n条指令,对应n个解码电路。

6.1 指令缓存

为减少I-Cache miss带来的影响,处理器可以在取指令阶段从I-Cache中取出的指令个数多余每周期可以解码的指令个数。需要在取指令和译码之间加入缓存,将多取的指令保存起来。

指令缓存本质是个FIFO。

  • I-Cache发生miss的时候,指令缓存中仍有一些指令余量。如果miss能够很快解决,就基本不会引起流水线暂停,保证处理器性能。
  • 一些特殊的指令如乘累加等,实际执行会拆分成若干条普通指令。这样就会增加指令数量,后续送过来的指令不能被全部解码就需要放进FIFO等待。

指令缓存FIFO实际实现时不会采用多端口SRAM,而是采用多个单端口SRAM。避免使用多端口SRAM带来的硬件和速度上的限制。

6.2 一般情况

MIPS指令集一般的指令包含Rs、Rt两个源寄存器,Rd一个目的寄存器。

ARM指令集一般的指令包含Rn、Rs、Rm三个源寄存器,Rd一个目的寄存器。

  • ARM中条件执行的指令还有第四个源寄存器CPSR,通过CPSR判断条件
  • 改变状态的指令CPSR会作为第二个目的寄存器。除了将结果写到正常目的寄存器外,还要将结果执行状态写道CPSR寄存器。
  • 对前后变址的load/store指令,也包含第二个目的寄存器。除了将结果写到正常目的寄存器外,还需要将地址寄存器内容进行更新。
  • 其他另类的LDM/STM指令,包括个数不确定的目的寄存器和源寄存器。

6.3 特殊情况

ARM指令集中的LDM/STM指令,需要多个周期才能够完成,而且目的寄存器、源寄存器有多个。在超标量处理器中不会直接处理这种复杂的指令,而是转化为多条简单的指令,按照一般方式进行处理。

6.3.1 分支指令的处理

在对预测失败进行状态恢复时,为了减少复杂度,需要限制每周期内解码的分支指令个数。而若是每周期读取了多条分支指令,就需要在解码阶段处理这个情况。

简单方法:遇到分支指令时,就不在本周起对这条分支指令后面的指令进行解码。

6.3.2 乘累加/乘法指令的处理

在4-way超标量处理器中,如果一个周期内解码的四条指令都是乘累加类型的指令,那么会解码出八条指令。寄存器重命名不可能设计成每周期可以对8条指令进行操作,这会浪费大量的硬件面积。

6.3.3 前/后变址指令的处理

与乘累加处理类似

ARM采用一条指令的功能MIPS需要两条指令才能完成,可以占用更少的指令存储器,降低I-Cache的缺失率,但也会占用更多硅片面积,增加功耗。

6.3.4 LDM/STM指令的处理

LDM:将存储器中一片连续地址空间上的数据加载到多个寄存器

STM:将多个寄存器的内容保存在存储器中的一片连续空间

处理时拆成多条普通的load/store指令

6.3.5 条件执行指令的处理

CPSR寄存器作为状态寄存器

上一篇:H5 canvas 实现类似于导航效果的线


下一篇:12 中断和异常