在非CISC处理器上进行浮点栈溢出检查的装置和方法转让专利

申请号 : CN200710177655.6

文献号 : CN101158891B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 苏孟豪刘哲源

申请人 : 中国科学院计算技术研究所

摘要 :

本发明公开了一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法。该装置包括一浮点寄存器栈,所述浮点寄存器栈由多个可进行浮点运算的栈寄存器组成;一溢出检查寄存器,用于在对所述栈寄存器进行浮点访问时栈溢出例外检查,其包括有与所述栈寄存器相应的多个位,每个位分别表示相应的栈寄存器的状态;一栈溢出判断模块,用于检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查。其能大大减少虚拟机的工作量,提高效率。

权利要求 :

1.一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置,其特征在于,包括一浮点寄存器栈,所述浮点寄存器栈由多个可进行浮点运算的栈寄存器组成;

一溢出检查寄存器,用于在对所述栈寄存器进行浮点访问时栈溢出例外检查,其包括有与所述栈寄存器相应的多个位,每个位分别表示相应的栈寄存器的状态;

一栈溢出判断模块,用于检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查。

2.根据权利要求1所述的浮点栈溢出检查的装置,其特征在于,所述浮点寄存器栈包括8个栈寄存器;所述溢出检查寄存器为一至少8位的多位通用寄存器,分别表示所述8个栈寄存器的0~7位的状态。

3.根据权利要求2所述的浮点栈溢出检查的装置,其特征在于,所述非复杂指令集计算机处理器为精简指令集计算机处理器。

4.根据权利要求1至3任一项所述的浮点栈溢出检查的装置,其特征在于,所述栈溢出判断模块包括第一判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。

5.根据权利要求1至3任一项所述的浮点栈溢出检查的装置,其特征在于,所述栈溢出判断模块包括第二判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。

6.根据权利要求1至3任一项所述的浮点栈溢出检查的装置,其特征在于,所述栈溢出判断模块包括第三判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。

7.根据权利要求1至3任一项所述的浮点栈溢出检查的装置,其特征在于,所述栈溢出判断模块包括第四判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。

8.根据权利要求1至3任一项所述的浮点栈溢出检查的装置,其特征在于,所述栈溢出判断模块包括第五判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。

9.一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的方法,其特征在于,以非复杂指令集处理器的多个栈寄存器组成浮点寄存器栈;一溢出检查寄存器,包括有与所述栈寄存器相应的多个位,每个位分别表示相应的栈寄存器的状态,包括下列步骤:步骤A,检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查。

10.根据权利要求9所述的浮点栈溢出检查的方法,其特征在于,所述浮点寄存器栈包括8个栈寄存器;所述溢出检查寄存器为一至少8位的多位通用寄存器,分别表示所述8个栈寄存器的0~7位的状态。

11.根据权利要求10所述的浮点栈溢出检查的方法,其特征在于,所述非复杂指令集计算机处理器为精简指令集计算机处理器。

12.根据权利要求9至11任一项所述的浮点栈溢出检查的方法,其特征在于,所述步骤A包括下列步骤:判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。

13.根据权利要求9至11任一项所述的浮点栈溢出检查的方法,其特征在于,所述步骤A包括下列步骤:判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。

14.根据权利要求9至11任一项所述的浮点栈溢出检查的方法,其特征在于,所述步骤A包括下列步骤:判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。

15.根据权利要求9至11任一项所述的浮点栈溢出检查的方法,其特征在于,所述步骤A包括下列步骤:判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。

16.根据权利要求9至11任一项所述的浮点栈溢出检查的方法,其特征在于,所述步骤A包括下列步骤:判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。

说明书 :

技术领域

本发明涉及微处理器技术领域,特别是涉及一种在非复杂指令集计算机处理器上支持复杂指令集计算机(CISC)中的浮点栈,进行浮点栈溢出检查,防止浮点栈溢出的装置和方法。

背景技术

中央处理器(CPU)简称微处理器,是计算机的核心单元。微处理器采用的指令集、设计规范(体系结构)是计算机的首要特征,它决定了计算机需要采用的外围设备和应用软件的类型。
当今世界比较流行的两大体系结构分别为:以MIPS公司的MIPS32/64为代表的精简指令集计算机(Reduced Instruction Set Computing,RISC)体系结构和以Intel公司的X86为代表的复杂指令集计算机(Complex Instruction SetComputing,CISC)体系结构。CISC处理器指令数量繁多,一些指令可执行相当复杂的功能,一般需要许多时钟周期来执行;RISC处理器使用较少数量的可用指令,以更高的速率执行一组更简单的功能。而采用不同的体系结构的处理器上运行的程序软件需要针对处理器的体系结构专门编写,X86上的应用软件通常不能在MIPS体系结构的计算机上运行,即常说的不兼容。
然而计算机制造商希望通过在自己制造的一种体系结构的微处理器上运行更多的现有软件来节省软件开发的开销,同时达到市场占有率最大化的目的。
为了解决这一问题,虚拟机应运而生。一般地,将具有一种类型体系结构的CPU的计算机称为主机;同时将需要主机仿真的,不相关体系结构类型的CPU环境称为目标机,需要一种应用程序,这种程序能够促使主机执行一个或多个主机指令,响应于给定的目标机指令,运行为目标机编写的软件,这种程序就叫虚拟机。
目前现有的虚拟机有:SimOS,QEMU,Transmeta等,但是现有的虚拟机由于各种体系结构的巨大差异造成虚拟机运行开销过大,执行效率过低,很难应用到实际工作中。
由于X86体系结构是目前个人计算机(PC)上较流行的一类结构,所以多数虚拟机都以X86体系结构为目标机,都需要解决向X86兼容的问题,而众所周知的棘手问题是对X86所具有的独特的浮点栈防止溢出机制的模拟。一般地,CISC类处理器,如X86,中都设置一个浮点寄存器栈,大部分浮点运算都是在寄存器栈参与下进行的,而为了保证浮点栈的正常正确工作,X86有一个复杂的防止溢出机制方法。而除了X86外,其他处理器,特别是RISC处理器没有类似的浮点栈以及防止溢出机制方法,由此带来的如何在虚拟机上进行浮点翻译是众多虚拟机研发部门迫切需要解决的热点问题。
一般而言,在非CISC处理器中,其内部设置若干个通用的浮点寄存器,这些浮点寄存器统一编号,指令通过这些编号直接访问固定的浮点寄存器而完成工作。
如果在多个虚拟机程序运行过程中,浮点栈溢出例外没有被发现,程序就可能会执行错误操作,并且沿着错误的道路一直进行下去,而且错误比较难于发现,直到造成比较大的损失。所以,在虚拟机对X86进行仿真时,往往需要维护一个溢出检查机制,实时监控浮点栈的状态,但是这种检查机制对虚拟机存在一定的性能影响,而且不便于程序对栈中数据状态的了解。

发明内容

本发明所要解决的问题是提供一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法,其在非CISC体系结构的处理器上能够支持CISC中的浮点栈运算,防止浮点栈溢出,具有各种类型的对栈中寄存器所进行的操作,能大大减少虚拟机的工作量,提高效率。
为实现本发明而提供的一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置,包括一浮点寄存器栈,所述浮点寄存器栈由多个可进行浮点运算的栈寄存器组成;
一溢出检查寄存器,用于在对所述栈寄存器进行浮点访问时栈溢出例外检查,其包括有与所述栈寄存器相应的多个位,每个位分别表示相应的栈寄存器的状态;
一栈溢出判断模块,用于检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查。
所述浮点寄存器栈包括8个栈寄存器;所述溢出检查寄存器为一至少8位的多位通用寄存器,分别表示所述8个栈寄存器的0~7位的状态。
所述装置为精简指令集计算机处理器。
所述栈溢出判断模块包括第一判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。
所述栈溢出判断模块还包括第二判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。
所述栈溢出判断模块还包括第三判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。
所述栈溢出判断模块还包括第四判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。
所述栈溢出判断模块还包括第五判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
为实现本发明还提供一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的方法,以非复杂指令集处理器的多个栈寄存器组成浮点寄存器栈;一溢出检查寄存器,包括有与所述栈寄存器相应的多个位,每个位分别表示相应的栈寄存器的状态,包括下列步骤:
步骤A,检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查。
所述浮点寄存器栈包括8个栈寄存器;所述溢出检查寄存器为一至少8位的多位通用寄存器,分别表示所述8个栈寄存器的0~7位的状态。
所述装置为精简指令集计算机处理器。
所述步骤A包括下列步骤:
判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
本发明的有益效果是:本发明的在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法,使得非CISC体系结构,如X86的处理器能够支持X86中的特殊浮点栈的溢出检查机制,从而方便虚拟机进行二进制翻译工作,提高虚拟机效率,增强处理器兼容性,能大大减少虚拟机的工作量,提高效率。

附图说明

图1为本发明在非CISC处理器上进行浮点栈溢出检查的装置结构示意图;
图2为本发明栈寄存器与溢出检查寄存器的位对应示意图;
图3为本发明实施例在非CISC处理器上入栈过程中进行浮点栈溢出检查过程流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例中,以提供一种在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法,其应用在协同设计虚拟机中,在RISC处理器上支持CISC体系结构,如X86中的特殊浮点栈,防止浮点栈溢出的方法和系统为例为进行说明,但应当理解的是,其并不是对本发明的限制。
为了更深入理解本发明,本发明实施例先说明CISC体系结构,如X86的浮点栈的防溢出机制方法。
X86的浮点部件中包括一个浮点寄存器栈,该栈由8个可直接进行浮点运算的栈寄存器组成,按照顺序进行编号,分别是0~7。X86还包括一个16位的浮点标志寄存器,其中每两位组成一个TAG,每个TAG用于检测浮点访问时会不会发生栈溢出例外,每个TAG对应一个浮点寄存器的状态:00表示valid,表示该栈寄存器中含有一个可用的数据;01表示zero,表示该栈寄存器中的数据为0;10表示special,表示该栈寄存器含有非数、无穷数、或者错误格式的数据;11表示empty,表示该栈寄存器为空,可以对栈进行操作,不会发生溢出。
举例而言,如果用户进行向栈中存储数据的操作(push),那么硬件会自动检查相应栈寄存器所对应的浮点标志寄存器的TAG,以确定栈是否可用。在这种情况下,如果TAG为00、01、10当中的任何一个,都代表相应的栈寄存器已经被使用了,不能向里面装入数据,也就是不能再进行存储(push)操作,表示栈已满,如果再进行存储(push)操作,就会发生浮点栈溢出例外。相同,对于读取数据的操作(pop),其也是一样的。
本发明实施例中,所述在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置,是一精简指令集计算机(RISC)处理器10,包括浮点寄存器栈11,该栈由8个可直接进行浮点运算的栈寄存器111组成,按照顺序进行编号,分别为0~7;
本发明实施例的RISC处理器10,还包括一个溢出检查寄存器12,用于实现与X86的浮点标志寄存器中的TAG的功能,检测对浮点寄存器栈11中的栈寄存器111进行浮点访问时会不会发生栈溢出例外,其为一至少8位的多位寄存器,表示TAG位,即溢出检查功能位,分别表示浮点寄存器栈11的栈寄存器0~7号的状态。
在本发明实施例中,在RISC处理器10中,选择一个通用寄存器r(i),其低8位由低到高分别表示浮点寄存器栈的栈寄存器0~7号的状态。
通用寄存器r(i)的低8位中,每位对应一个浮点寄存器栈11中的栈寄存器111,每位的值代表不同状态,其中,0表示空,可压栈,不可出栈,否则会溢出;1表示有效,不可再压栈,否则会溢出。
作为一种可实施方式,如图1所示,本发明的RISC处理器10中,包括一个由0~31,共32个的多位浮点寄存器组成的浮点寄存器栈11,其中0~7号,共8个栈寄存器111,模拟X86的浮点寄存器栈的8个栈寄存器;在RISC处理器10中,还包括一个32位的通用寄存器(定点)r(i),其低8位由低到高分别表示浮点寄存器栈的栈寄存器0~7号的状态,完成X86浮点栈机制中的TAG功能,图1中的箭头表示了栈寄存器和通用寄存器(溢出检查寄存器12)的TAG位之间的对应关系。
所述RISC处理器10中,还包括栈溢出判断模块13,用于检查指定的浮点寄存器栈11中的栈寄存器111,并根据栈寄存器111的值对溢出检查寄存器12进行操作,进行浮点栈溢出检查。
较佳地,所述栈溢出判断模块包括第一判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。
较佳地,所述栈溢出判断模块包括第二判断子模块,用于判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。
较佳地,所述栈溢出判断模块包括第三判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。
较佳地,所述栈溢出判断模块包括第四判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。
较佳地,所述栈溢出判断模块包括第五判断子模块,用于判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
较佳地,所述栈溢出判断模块13,包括第一判断子模块131,第二判断子模块132,第三判断子模块133,第四判断子模块134,第五判断子模块135,其中:
第一判断子模块131,用于判断浮点寄存器栈11中被指定的栈寄存器111是否为空,如果为空,则将指定的溢出检查寄存器12的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外;
第二判断子模块132,用于判断浮点寄存器栈11中被指定的栈寄存器111是否有效,如果有效,则将指定的溢出检查寄存器12的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外;
第三判断子模块133,用于判断浮点寄存器栈11中被指定的两个栈寄存器111是否都有效,如果都有效,并且栈寄存器111中的数据不需要出栈,则将指定的溢出检查寄存器12的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外;
第四判断子模块134,用于判断浮点寄存器栈11中被指定的两个栈寄存器111是否有效,如果都有效,并且有一个栈寄存器111中的数据需要出栈,则将数据出栈的栈寄存器111对应的溢出检查寄存器12的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外;
第五判断子模块135,用于判断浮点寄存器栈11中被指定的两个栈寄存器111是否有效,如果都有效,并且栈寄存器11中的数据都需要出栈,则将对应的溢出检查寄存器12的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
下面进一步详细说明本发明在非复杂指令集计算机处理器上进行浮点栈溢出检查的方法,其以RISC处理器10的8个栈寄存器111组成浮点寄存器栈11;以一通用寄存器为溢出检查寄存器12,其低8位模拟X86的TAG功能,每位对应一个栈寄存器111的不同状态。
本发明的在非复杂指令集计算机处理器上进行浮点栈溢出检查的方法,包括如下步骤:
步骤S100,检查指定的浮点寄存器栈11中的栈寄存器111,并根据栈寄存器111的值对溢出检查寄存器12进行操作,进行浮点栈溢出检查;
判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外。
较佳地,所述步骤S100包括下列步骤:
较佳地,所述步骤S100包括下列步骤:
判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外。
较佳地,所述步骤S100包括下列步骤:
较佳地,所述步骤S100包括下列步骤:
判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外。
判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
较佳地,所述步骤S100包括下列步骤:
较佳地,所述步骤S100包括下列步骤:
所述步骤S100包括下列步骤:
步骤S110,判断浮点寄存器栈11中被指定的栈寄存器111是否为空,如果为空,则将指定的溢出检查寄存器12的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外;
步骤S120,判断浮点寄存器栈11中被指定的栈寄存器111是否有效,如果有效,则将指定的溢出检查寄存器12的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外;
步骤S130,判断浮点寄存器栈11中被指定的两个栈寄存器111是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器12的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外;
步骤S140,判断浮点寄存器栈11中被指定的两个栈寄存器111是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器12的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外;
步骤S150,判断浮点寄存器栈11中被指定的两个栈寄存器111是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器12的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
下面以对浮点寄存器栈的操作为例,进一步详细说明本发明的在非复杂指令集计算机处理器上进行浮点栈溢出检查的方法。
对浮点寄存器栈11的操作有很多种情况,如图2所示,为浮点寄存器栈11的入栈操作流程图,进行入栈操作时。
首先RISC处理器10确定浮点寄存器栈的栈顶,并读取该栈顶的栈寄存器111对应的溢出检查寄存器12的TAG位;
RISC处理器10根据本发明的浮点寄存器栈11,判断确定浮点寄存器栈11的栈顶,并确定对应的本发明的栈顶的栈寄存器111对应的溢出检查寄存器的TAG位,是一种现有技术,其不是本发明的发明创造,本领域技术人员根据本发明实施例的描述,可以实现上述操作,因此,在本发明中不再一一详细描述说明。
判断栈顶的栈寄存器111对应的溢出检查寄存器的相应TAG位是否为0;
如果是,则将栈顶的栈寄存器111对应的溢出检查寄存器12的相应TAG位置1,并将数据写入该栈寄存器111,并结束返回;
如果否,则引发栈溢出例外。
作为一种可实施的方式,本发明实施例中,选择通用寄存器r(3)作为溢出检查寄存器,r(3)的低8位,也就是bit r(3)_0~bit r(3)_7分别对应浮点寄存器栈中的栈寄存器f(0)~f(7)的状态。
1)如果遇到入栈操作,并且栈顶在栈寄存器f(5);
则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为0;
如果为0,则先将溢出检查寄存器的bit r(3)_4置1,然后将数据入栈,存入栈寄存器f(5);
如果为1,则引发栈溢出例外。
2)如果出栈操作,并且栈顶在栈寄存器f(5),
则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1;
如果为1,则先将溢出检查寄存器的bit r(3)_4清零,然后将数据出栈,存入指定的浮点寄存器;
如果为0,则引发栈溢出例外。
3)如果是运算操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中,
则判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1;
如果为0,则引发栈溢出例外;
如果为1,则继续下面的步骤:
则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1;
如果为1,则继续运算操作;
如果为0,则引发栈溢出例外。
4)如果是运算并出栈操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中;
如果栈顶在栈寄存器f(5),则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1;
如果为0,则引发栈溢出例外;
如果为1,则继续下面的步骤:
判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1;
如果为0,则引发栈溢出例外;
如果为1,则继续下面的步骤:
先将溢出检查寄存器的第5位,也就是bit r(3)_4清零,然后继续运算操作;
5)如果是运算并连续出栈操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中;
则判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1;
如果为0,则引发栈溢出例外;
如果为1,则将溢出检查寄存器的第4位,也就是bit r(3)_3清零,然后继续下面的步骤:
判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1;
如果为1,则将溢出检查寄存器的第5位,也就是bit r(3)_4清零,然后继续运算操作;
如果为0,则引发栈溢出例外。
本发明的在非复杂指令集计算机处理器上进行浮点栈溢出检查的装置和方法,本发明的装置设计精巧简单,硬件开销很少;能够提供了很强的仿真支持,可以省去对浮点栈的模拟维护,大大减少了在读取内存上的时间和空间损失,提高了工作效率。其缩小了不同体系结构间的差异,为协同设计虚拟机以及RISC和x86之间的兼容做出了开拓性的贡献。
通过以上结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。