第六章移动操作指令的实现

本章将实现移动操作指令,首先在6.1节介绍了MIPS32指令集架构中定义的移动操作指令的格式、作用,接着在6.2节给出移动操作指令的实现思路,介绍了修改后的数据流图,新出现的数据相关问题及其解决措施,并给出了修改后的OpenMIPS系统结构图。

6.1 移动操作指令说明

MIPS32指令集架构中定义的移动操作指令共有6条:movn、movz、mfhi、mthi、mflo、mtlo,后4条指令涉及对特殊寄存器hi、LO的读/写操作。截至到本章,我们的OpenMIPS处理器只实现了32个通用寄存器以及PC、所有的指令也只是对32个通用寄存器进行操作,还没有涉及特殊寄存器,本章将实现HI、LO这两个特殊寄存器。
HI、LO寄存器用于保存乘法、除法结果。当用于保存乘法结果时,HI寄存器保存结果的高32位,LO寄存器保存结果的低32位;当用于保存除法结果时,HI寄存器保存余数,LO寄存器保存商。在后续“算术操作指令的实现”一章中,会进一步说明。

这6条移动操作指令的格式如图所示
在这里插入图片描述

这6条指令都是R类型指令,并且指令码都是6’b000000,即均为SPECIAL类指令:同时,指令第6-10bit都为0,可以依据指令中第0-5bit功能码的值判断是哪一种指令。各指令的用法和说明如下:
  • 当功能码为6’b001011时,表示是movn指令。
    指令用法为 movn rd,rs,rt。
    指令作用为:if rt != 0 then rd <- rs,判断地址为rt的通用寄存器的值。如果不为零,那么将地址为rs的通用寄存器的值赋给地址为rd的通用寄存器,反之,保存地址为rd的通用寄存器不变。movn 是 Move Conditional on Not Zero的意思。

  • 当功能码为6’b001010时,表示是movz指令。
    指令用法为:movz rd,rs,rt。
    指令作用为:if rt = 0 then rd <- rs,与上面movn指令的作用正好相反,判断地址为rt的通用寄存器的值。如果为零,那么将地址为rs的通用寄存器的值赋给地址为rd的通用寄存器;反之,保持地址为rd的通用寄存器不变。movz是 Move Conditional on Zero的意思。

  • 当功能码为6’b010000时,表示是mfhi指令。
    指令用法为:mfhi rd。
    指令作用为:rd <- hi,将特殊寄存器HI的值赋给地址为rd的通用寄存器。

  • 当功能码为6’b010010时,表示是mflo指令。
    指令用法为:mflo rd。
    指令作用为:rd <- lo,将特殊寄存器LO的值赋给地址为rd的通用寄存器。

  • 当功能码为6’b010001时,表示是mthi指令。
    指令用法为:mthi rs。
    指令作用为:hi <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器HI.

  • 当功能码为6’b010011时,表示是mtlo指令。
    指令用法为:mtlo rs。
    指令作用为:lo <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器LO。

6.2移动操作指令实现思路

这6条移动操作指令可以分为两类:一类是不涉及特殊寄存器HI、LO的指令,包括movn、movz;另一类是涉及特殊寄存器HI、LO的指令,包括mfhi、mflo、mthi、mtlo。前一类很容易实现,基本思路与第五章实现逻辑、移位操作指令时类似,只需要修改ID、EX模块即可。另一类涉及特殊寄存器HI 、LO,需要为OpenMIPS添加HI、LO寄存器,以及相应的读/写控制。下面分别介绍各自的实现思路。

1.movn、movz指令实现思路
与第5章逻辑、移位操作指令的实现过程类似。
(1)在译码阶段给出运算类型alusel_o,运算子类型aluop_o、要写入的目的寄存器地址wd_o等信号的值,同时读取地址为rs、rt的通用寄存器的值,但这里需要新增一个步骤:依据读取地址为rt的通用寄存器的值是否为零,判断是否要写入目的寄存器。将上述结果送到执行阶段。
(2)执行阶段依据传入的信号,确定最终要写入目的寄存器的信息(包括:是否写、写入目的寄存器的地址、写入的值),并将这些信息送到访存阶段。
(3)上述信息会一直传递到回写阶段、最终,依据这些信息修改目的寄存器,或者不做任何修改。
2.mthi、mtho指令实现思路
这2条指令需要写HI、LO寄存器,与之前实现的通用寄存器一样,对HI、LO寄存器的写操作放在回写阶段进行
(1)在译码阶段依据指令,给出运算类型alusel_o、运算子类型aluop_o的值,同时读出地址为rs的通用寄存器的值。由于mthi、mtlo不写通用寄存器,所以wreg_o为WriteDisable,wd_o为0.
(2)在执行阶段确定要写HI、LO寄存器的情况,以及要写入的值,并将这些信息传递到访存阶段。
(3)访存阶段将这些信息再传递到回写阶段。
(4)回写阶段依据这些信息修改HI、LO寄存器的值。
3.mfhi、mfho指令实现思路
这2条指令需要读HI、LO寄存器,设计在执行阶段才能读取到。
(1)在译码阶段依据指令,给出运算类型alusel_o、运算子类型aluop_o的值,同时因为有要写入的目的寄存器,所以wreg_o为WriteEnable,wd_o为指令中的rd的值,也就是目的寄存器的地址。
(2)在执行阶段获取HI、LO寄存器的值,作为要写入目的寄存器的数据,并将这些信息传递到访存阶段。
(3)访存阶段将这些信息再传递到回写阶段。
(4)回写阶段依据这些信息修改目的寄存器。
添加移动操作指令后的数据流图如图所示。
与以前的区别为:

  • 增加了HILO寄存器模块,并且该模块放在回写阶段。
  • 将HI、LO寄存器的值传递到执行阶段,在执行阶段增加了一个选择模块,用于选择要参与运算的数据,如果是mfhi、mflo指令,那么就会选择传递过来的HI、LO寄存器的值。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值