MIPS指令集概述
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种典型的精简指令集计算机(RISC)架构,其指令集具有如下特征:
- 指令长度:MIPS指令集中的所有指令(除特殊情况下的MIPS16e扩展指令外)均为固定长度的32位(即4字节),这简化了指令解码和流水线操作。
- 指令分类:MIPS指令被划分为三种基本类型:I-Type、J-Type和R-Type。
I-Type指令
- 格式:包含操作码(op)、源寄存器(rs)、目的寄存器(rt)以及一个16位的立即数(immediate)。
- 功能:常用于执行算术逻辑运算、加载/存储操作以及其他直接使用立即数的操作。
- 字段位置:立即数通常占据指令的低位部分,rs和rt分别标识源寄存器和目的寄存器,op字段位于指令的高6位(Bit[31:26])以指定指令类型。
J-Type指令
- 格式:包含操作码(op)、一个26位的目标地址(target)。
- 功能:专用于实现无条件跳转和分支操作,如函数调用、循环控制等。
- 字段位置:目标地址占据指令的中间部分,op字段同样位于高位的Bit[31:26],用于标识该指令为J-Type跳转指令。
R-Type指令
- 格式:包含操作码(op)、两个源寄存器(rs、rt)、一个目的寄存器(rd)、一个功能码(funct)以及(对于某些指令)一个移位量字段(sa)。
- 功能:用于执行各种算术、逻辑、比较以及数据处理操作,这些操作通常涉及三个寄存器之间的交互。funct字段用于进一步区分R-Type指令中的具体操作。
- 字段位置:rs、rt和rd字段分别指定源寄存器和目的寄存器,funct字段通常位于指令的低6位(Bit[5:0]),用于指示具体的R-Type指令功能。移位量字段sa(如果存在)则用于指定移位指令中的位移数量。
操作码(op)
- 作用:位于指令的最高6位(Bit[31:26]),op字段是识别指令类型的关键,它定义了指令所属的基本类型(I-Type、J-Type或R-Type)以及相应的操作。
MIPS指令集编码规律
(1)分支与跳转指令
当 op == 000_xxx(其中 xxx 表示该字段的任意值),表示该指令为分支或跳转指令,且为PC相对寻址方式。这类指令通常用于实现条件分支、无条件跳转等控制流转移操作。op = 000_000 和 op = 000_001 不属于此类,它们有特殊含义(见下文)。
(2)含有立即数的算术操作指令
当 op == 001_xxx,表示该指令执行某种算术操作,并且操作数中包含一个立即数(即I-Type指令)。这类指令可用于执行加减乘除、逻辑操作等,其中一个操作数来自寄存器,另一个操作数为16位立即数。
(3)访问存储器的load指令
当 op == 100_xxx,表示该指令为load型指令,用于从内存中加载数据到寄存器(即I-Type指令)。这类指令通常包括lw(加载字)等,用于从内存指定地址读取数据。
(4)访问存储器的store指令
当 op == 101_xxx,表示该指令为store型指令,用于将寄存器中的数据存储到内存(即I-Type指令)。这类指令如sw(存储字)等,用于向内存指定地址写入数据。
特殊编码的指令:
当 op 取以下值时,这些指令有特殊含义,需要额外解码才能确定其具体操作类型:
op = 010_000(COP0)
op = 011_100(Special2)
op = 000_001(Regimm)
op = 000_000(Special)
其中,对于 op = 000_000(Special)的情况,需要结合指令中的 funct 字段(Bit[5:0])来进一步区分指令类型。funct 字段的不同值对应不同的Special指令,如算术逻辑运算、移位、比较、分支等。如表5.2。
在 Special2区域(即op==011_100时),也是需要使用指令当中的Bit[5:0](也就是
funct)才可以进一步区分指令的类型,这部分定义的指令如表5.3所示。
Special2区域的指令由 op = 011_100 标识,相较于其他指令区域,Special2区域包含的指令数量较少,主要聚焦于乘累加(multiply-accumulate, MAC)相关的操作以及其他两种特殊的位计数指令。
乘累加指令:Special2区域可能包括一些与乘累加运算相关的指令,这类指令通常用于高效地执行连续乘法与加法操作,常见于信号处理、矩阵运算等计算密集型应用中。例如,它们可能包括单精度或双精度浮点数的MAC指令,或者整数乘法后的累加操作。具体的指令名称和语法取决于MIPS指令集的具体实现和扩展。
特殊位计数指令:
(1)CLZ (Count Leading Zeroes):此指令计算指定寄存器中数据的高位起始连续零的个数。这对于快速确定数值的二进制表示中最左侧非零位的位置非常有用,常用于对齐、快速除以2的幂次、基数转换等操作,也可以作为硬件优化算法(如快速乘除、位扫描等)的基础。
(2)CLO (Count Leading Ones):与CLZ类似,CLO指令用于计算指定寄存器中数据的高位起始连续一的个数。该指令在处理具有特定前导位模式的数值时有用,可能在特定的算法或数据压缩、编码场景中发挥作用。
Regimm区域的指令由 op = 000_001 标识,这一区域扩展了分支指令的功能,使其更加灵活。这些指令的特点在于使用寄存器内容配合立即数来决定分支条件或目标地址,同时利用原本用于rt寄存器字段的Bit[20:16]进行指令编码。
分支指令扩展: Regimm区域的指令对分支指令进行了扩展,使得分支条件不仅依赖于比较结果,还可以结合寄存器内容和立即数进行更为复杂的跳转逻辑。这种扩展增强了程序控制流的灵活性,适应更多复杂条件下的分支需求。
编码特点:
- 立即数字段重用:在Regimm指令中,原本用于表示rt寄存器的Bit[20:16]不再用于指定目的寄存器,而是被重新用作立即数的一部分。这是因为这些指令的rt字段实际上并未使用,故可以合理地重新分配其功能。
- Bit[5:0]与Bit[20:16]组合:由于Bit[5:0](即funct字段)也属于立即数的一部分,Regimm指令的立即数由这两个字段共同组成。这样,尽管单个字段的宽度有限,但通过组合使用,能够表达更宽范围的立即数值,以满足分支指令扩展的需求。
COP0区域由 op = 010_000 标识,该区域定义了访问协处理器(Coprocessor)的特殊指令。这些指令用于在CPU的通用寄存器与协处理器寄存器之间交换数据,因为CPU无法直接操作协处理器寄存器。
指令编码特点:
- rs字段的使用:COP0指令不使用rs寄存器,因此其rs字段(Bit[25:21])被重新用于编码指令。这允许COP0指令扩展其功能,以支持对协处理器的特定操作。
- funct字段的特殊用途:指令中的Bit[5:0](即funct字段)在COP0指令中有着特定用途,如选择目标协处理器、指定协处理器内部寄存器等。由于这些特殊需求,funct字段不再用于进一步区分指令类型。
- MTCO:该指令将CPU通用寄存器中的数据传送到指定的协处理器寄存器。由于CPU无法直接操作协处理器寄存器,MTCO提供了一种间接途径来更新协处理器状态。
- MFCO:与MTCO相反,MFCO指令将协处理器寄存器中的数据读取到CPU的通用寄存器中,以便CPU可以对这些数据进行操作。完成操作后,可以通过MTCO指令将结果写回协处理器。
通用寄存器限制: 处理器在指令中能够直接操作的寄存器只有在指令集里面定义的32个通用寄存器。这意味着CPU只能直接访问其自身的通用寄存器集,而对协处理器寄存器的操作必须通过MTCO和MFCO等特殊指令进行间接访问。