改进MIPS指令集模拟方法的研究

摘 要:
微处理器模拟是开发嵌入式系统的重要方法,其关键是指令集的译码.通过改进传统的 MIPS指令集译码方法,采用多级索引和指令抽象技术实现了MIPS指令集模拟加速.实验证明,此法优化效果 比较明显,能提高程序的执行效率.

引言
在众多类型的 RIsc CPU体系中,MIPS(Microprocessor without Interlocked Pipeline Stages)是相当成功 的一种微处理器.基于MIPS构架的 CPU在网络、通信、多媒体娱乐等领域得到了广泛应用.Ciseo的路由 器,IBM 网络彩色 打印机 , 4000、5000、8000、9000系列激 光 打印机 及扫 描仪 ,Sony的 Playstation和 Playstation 2游戏机等 ,都是应用 了基于 MIPS指令集微处理器的产品.为满足市场需求 ,MIPS嵌入式指令 体系已由 MIPS16、MIPS32发展到 MIPS64.随着 PC机的普遍使用 ,如果能在 PC机上实现 MIPS虚拟机的 模拟,将对开发和应用 MIPS微处理器有着重要意义.

由于最常用的宿主机是 PC计算机 ,所 以研制 系统模拟器的关键是在宿主机上对虚拟机 的指令集进行指令译码.传统的MIPS指令集译码方法,主要是借助高级语言(主要是 C十+),在一个函数块中集成了所有的指令 ,通过使用大量的 if-else-if结构对操作码 、操作数 以及地址模式进行判断,从而实现 x86指令系统对某一 MIPS指令的具体译码和指令模拟操作 .这种方法虽然简单 ,但当对某条具体 的指令进行译码时 ,必须对该指令之前的所有指令进行条件判断 ,从而造成大量的时延 .

本文提出了优化指令集译码的两个主要方法 :首先根据操作码和功能码对指令进行分级 ,通过多级索引对指令进行查找 ;其次 ,采用指令抽象技术 ,根据 MIPS的特点对指令分类处理 ,并定义相应 的 C++函数类 ,加快译码速度.

1 MIPS指令集的多级索引
1.1 MIPS指令 格式
MIPS采用定长操作码的指令字格式 .所有指令字长度是 32位(MIPS32)或 64位(MIPS64)单字长指令,且是对准的,其中操作码占 6位.由于 MIPS只有两种寻址模式,因此在指令格式中没有必要专门设置寻址方式描述位 ,可以将其直接编码到操作码 中.为了使机器更容易进行流水线操作和译码 ,所有的 MIPS指令都是如表 1所示三种编码格式之一 .

10

其中,I型指令格式主要用来对各种类型数的存取操作指令编码,即各种 Load指令和 Store指令.I型指令格式还用来为分支指令编码,包括条件分支指令、寄存器跳转指令和寄存器跳转并连接指令.

R型指令格式主要用来为各种算术/逻辑运算指令编码.

J型指令格式主要用来为跳转(寄存器跳转除外)并连接指令及陷阱与异常返回指令编码.

1.2 MIPS指令集的三级索引
如果对 MIPS指令集按照操作码 op一功能码 fun一指令进行分类 ,就能实现三级索引.具体来说 ,首先 ,将需要进行译码的所有指令按照操作码进行分组.由于 MIPS指令集的操作码统一为 6位,即共有 64种操作码 ,这样可将所有的 MIPS指令分成 64组 ,每组指令 的操作码都相 同,并通过数组来 实现具体的分级.如将 groupO,groupl,……,group63放在数组 mips—instr[64]中.对 于只有操作码的指令 ,如 j和 jal指令 ;或者操作码和功能码唯一的指令 ,如 1w、lh及 等指令 ;可 以在数组中直接定义指令 的引用.然后 ,再将其它指令组中功能码相同的进行二次分组 ,例如 groupO组中又可分为 groupO0、groupO1等组,其 中每组指令的操作码和功能码都相同.

举例说明,以下是需要译码 的四条二进制指令 :
000000 dddddsssssttttl 111111 instructionl ,
000000 dddddssssstttt0 1 1 1 1 1 1 instruction2
000000 dddddssssstttt0 000001 instruction3
000001 dddddsssssttttt 000002 instruction4
上述指令 的索引可 以通过以下函数实现.

(1)定义分组
由于本例中 opmde码只有两个 ,所以只定义两个分组 ,type为数组类型. 。
Typel mips— instr
{ &groupO,
& instruction4;
}

(2)指令译码索引
Type2 mipsDexode(uint32—.t instr)
{ uint32一t mainopc= (instr>> 26)& 3f;
return mips— instr[mainopc](instr);
}

(3)通过指令索引返 回指令函数
groupO(uint32一t instr)
{ sv,fitch(instr& Ox3f)
case groupO1 :
switch((instr>> 6)& Ox1)
caSe 0:return instructionO(instr);
case 1:return instructionl(instr);
case group02:return instruction3(instr);
}

instruction4可以直接返 回指令 执行 函数 ,instructionl、instruction2和 instruction3通过 多级索 引来实现.这样对 instruction4进行译码时可以根据操作码找到执行的函数,没有必要对其它指令进行条件判断.

2 指令抽象
对二进制指令译码后,通过返回一个具体的实现函数来实现该指令的功能.传统的方法是通过一个函数块将所有的函数集成在一起 ,如果要调用某一个 函数 ,需要进行条件判断 ;而在 比较先进的译码方法中(如LISA模型【3】等),当二进制指令被译码后 ,译码中包含了一个指向函数的指针,需要通过指针调用该函数来实现译码.虽然这两种方法都能实现译码功能 ,但 与所有指令近 300条的 MIPS相比,如采用类似 IS-CS方法的指令抽象技术,则应能更方便地实现译码,同时速度也会得到提高.

IS-CS(instruction set compiled simulation)[ 】方法是成功地用于 ARM 指令集模拟器上的典型的指令抽象技术 .其方法是:定义指令集的类 ,每一类指令有相似的格式.比如 ,对 ARM 指令集定义 了七种指令集类 , 并对每一个指令集的类定义了一个掩码 .掩码包括“0”、“1”、“x”.“0”或“l”只与指令 的二进制码中同一位置的“0”或“1”相对应.掩码 “x”则不受此限制 .通过掩码可直接找到所要译码的指令集类 ,从而调用相应 的函
数来处理.但是 ,ARM 返回的是一个大类 ,需要用分支结构来进一步区分要译码的函数 .

鉴于 MIPS指令具有以下两个特点 :一是其指令格式相对简单 ,寄存器格式只有三种 ,即 R格式 ,J格式 和 I格式;二是 MIPS指令数 比ARM 指令集要少.因此,对 MIPS处理时 ,无须定义掩码 ,只要将 MIPS指令按功能分为算术 、加载和存储 、协处理和分支四类 ,在这四类中直接定义指令的执行函数 ,然后用 C++函数来实现每条指令的具体实现 .这样 ,指令译码完成后返回时不再返 回一个包含多个 函数的类 ,而是直接返 回到一个具体的执行函数 .由于执行函数已经定义,只要在译码时给出相应的操作数的值便可以实现一条指令的具体执行.这样在执行译码时不仅减少了在类 中查找具体指令函数的时间,也有利于 MIPS指令代码的重用 .

例如,首先在 MIPS—arithmetic.hpp文件中将 MIPS指令集 中所有与算术相关的指令定 义为 MIPS— arithmetic类,然后 ,在该类中定义与算术相关的指令运算函数 ,如 add、sub、mul及 addi等 .那么 ,该类可定义 如下 :
class M IPS— — arithm etic
{ public:
type add();
type sub();
type mul();
type addi();
private:
uint8一 t rd;
uint8— — t rs;
uint8— — t rt;
};

在 MIPS—arithm etic.hpp的头文件中定义了所有与运算相关的函数 ,还需要在 MIPS—arithm etic。cpp 文件中具体定义每个 函数的实现 .

3 实验验证
整个实验过程是在 DELL vostro 1000上来完成的.其 中,编译工具为 g++ 4.3—54,交叉编译工具是 mips-elf-gcc.3.4.6,并通过在 SimSOC[ ]上对一个具体程序进行两种方式译码 ,证明该方法的优越性 .

测试中,试验采用复杂的加密解密程序 crypto.c(它的很多函数来 自于 XYSSL lib~;ary[ 】)和排序程序 so~ing.c对两种 MIPS指令模拟方法的性能进行了检测 .一种模拟方法是传统的既不采用多级索引和指令抽象技术的译码方法 ,也不使用本文中介绍的优化译码方法;另一种是采用本文介绍的优化方法 .通过使用 gcc交叉编译分别把测试程序编译成不 同的可执行程序 .其中没有优化的 MIPS可执行程序 以 a0.X和 h0.X 为后缀 ,优化 了的 MIPS可执行程序 以 a3.X和 b3.X 为后缀 .实验结果如表 2所示.

20

从表 2中可知 ,优化后 的可执行 程序执行速度大大提高,其加速比分别达到了 2.58和 2.06,可见通过在指令集模拟中使用多级索引和指令抽象技术 ,确实能提高模拟器 的译码效率 .

4 结束语
表 2 两种测试 结果 比较测试程序 测试结果时间 /s 时间/mips MIPS64主要对 MIPS32的功能进行了扩展 .在实 际应用中,MIPS64指令集 可以通过一个模式选择开关完全兼容 MIPS32指令集 ,并且基于 MIPS32的应用程序也可 以在 MIPS64上运行 .因此 ,提 出的加速指令集译码方法同样适用于 MIPS64.由于使用该方案对指令集模拟器进行设计的主要难点在于周期精确的流水线的设计 ,故对于周期精确型指令集模拟器的设计 ,该方案还需要进一步的改进 .

--电子创新网--
粤ICP备12070055号