CN100345117C - 二进制翻译中对x86中浮点运算的处理方法 - Google Patents
二进制翻译中对x86中浮点运算的处理方法 Download PDFInfo
- Publication number
- CN100345117C CN100345117C CNB2004100745326A CN200410074532A CN100345117C CN 100345117 C CN100345117 C CN 100345117C CN B2004100745326 A CNB2004100745326 A CN B2004100745326A CN 200410074532 A CN200410074532 A CN 200410074532A CN 100345117 C CN100345117 C CN 100345117C
- Authority
- CN
- China
- Prior art keywords
- instruction
- floating
- point
- stack
- work
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
- 238000000034 method Methods 0.000 title claims abstract description 64
- 238000013519 translation Methods 0.000 title claims abstract description 46
- 230000008569 process Effects 0.000 title claims abstract description 27
- 238000013507 mapping Methods 0.000 claims abstract description 5
- 238000007667 floating Methods 0.000 claims description 46
- 238000012545 processing Methods 0.000 claims description 18
- 230000006870 function Effects 0.000 claims description 9
- 238000012986 modification Methods 0.000 claims description 7
- 230000004048 modification Effects 0.000 claims description 7
- 238000012546 transfer Methods 0.000 claims description 4
- 230000008878 coupling Effects 0.000 claims description 3
- 238000010168 coupling process Methods 0.000 claims description 3
- 238000005859 coupling reaction Methods 0.000 claims description 3
- 230000008676 import Effects 0.000 claims description 2
- 238000003672 processing method Methods 0.000 abstract 2
- 238000005516 engineering process Methods 0.000 description 6
- 230000004069 differentiation Effects 0.000 description 5
- 238000011160 research Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 230000006399 behavior Effects 0.000 description 2
- 230000002950 deficient Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 235000007926 Craterellus fallax Nutrition 0.000 description 1
- 241001269238 Data Species 0.000 description 1
- 240000007175 Datura inoxia Species 0.000 description 1
- 238000009825 accumulation Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000008929 regeneration Effects 0.000 description 1
- 238000011069 regeneration method Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Images
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了一种二进制翻译中对X86中浮点运算的处理方法,包括以下步骤:在运行时环境中设置一个浮点栈,用于仿真X86中的物理浮点栈;通过浮点寄存器映射的处理和归一方法依次对源二进制程序中的每个基本块进行处理。本发明通过用目标机器的寄存器来映射X86的源寄存器,保证了X86的浮点运算在目标机器上也是由寄存器来实现,确保运算的效率;采用归一的方法,确保每个基本块的入口满足每次top的值相同的假设,从本质上来讲,将Intel的运行过程中对投机假设的判别,用归一的方法进行了保证。本发明使得基本块不需要每次都去判别是否投机假设成立,省去了这一部分开销,提高了系统翻译效率,从而提高了系统性能。
Description
技术领域
本发明涉及计算机领域的二进制翻译方法,尤其涉及对X86处理器的浮点运算的处理方法。
背景技术
编译是计算机自身领域的关键技术,二进制翻译则是编译的一个重要研究方向。早在1987年HP公司就开发了第一个商用二进制翻译系统Bergh et al。接下来,许多公司和研究机构也相继展开了这方面的研究,其中最具有代表性的有HP、IBM、Digital、AT&T、APPLE、Transmeta、澳大利亚Queensland大学、奥地利维也纳技术大学等,目前,Intel设立在中国的软件中心也加入了这个行列。
二进制翻译目前正在成为解决软件移植问题的一个研究热点。众所周知,新开发的处理器如果其指令级体系结构(ISA)不向前兼容,则会失去现有软件的支持,影响其推广和应用。这就迫使设计者使用宝贵的芯片空间来兼容老处理器,这样既增加新处理器的复杂度和功耗,影响其主频的提高,又阻碍了处理器的发展。二进制翻译技术为新旧处理器架起了一座桥梁,将现有的软件移植到新开发处理器上执行,使得新处理器摆脱向前兼容的约束。
二进制翻译技术对促进国产处理器的发展也很有意义。近十多年来,中国的信息产业得以飞速发展,并正在逐步走向成熟。随着知识和经验的积累,业界精英们开始向计算机领域中最为核心的技术挑战。以“龙芯”、“星光”、“方舟”、“汉芯”、“神威”、“万通”、“北大众志”等为代表的国产通用或嵌入式微处理器不断涌现,打破了中国无“芯”的局面。但由于Intel在X86系列微处理器上各种专利的限制,使得国内的许多微处理器设计者不得不采用与X86系列微处理器不兼容的ISA。众所周知,X86系列机器作为当前的主流机型,已经拥有极其丰富的应用软件。ISA的不兼容导致国产微处理器的应用软件与X86微处理器相比显得有些匮乏,从某种程度上影响了其推广和应用的步伐。因此开展二进制翻译的研究,同样可以丰富国产处理器的应用软件,为这些民族产业扩大市场提供支持。
在实现以X86为源机器的二进制翻译的过程中,一个较为棘手的问题是X86所具有的独特的浮点运算部件。该类处理器中设置了一个浮点寄存器栈,几乎所有的浮点运算都是在浮点栈参与下进行的。除了X86外,几乎没有处理器再采用类似的结构,由此带来了浮点翻译的问题,如果处理不好,会导致二进制翻译系统的性能的急剧下降。
为了便于对本发明的理解,这里在介绍本发明之前,先介绍一下X86浮点部件的工作机制以及目前的二进制翻译系统所采用的处理方法。
X86系列处理器采用了一个十分独特的浮点运算机制,其结构如图1所示。
X86的浮点部件中包含一个浮点数据寄存器栈,该栈由8个可以直接进行浮点运算的寄存器组成,按照顺序进行编号,分别是0~7。之所以称该寄存器是浮点寄存器栈,其原因在于X86处理器将它们作为一个堆栈进行使用。它是一个向下扩展的循环栈。处理器利用另外一个寄存器中的3位来标记栈顶所在的位置,这3位被称作top指针。当程序需要向寄存器栈中装入数据的时候,top指针的值减1,然后将数据存储到由top指针所指示的浮点寄存器中。当top值为0时,下一次压栈则将数据压入7号浮点寄存器中,top指针的值则被设置成7。当需要将堆栈中的数据保存到内存中,或弹出退栈,则进行退栈操作。退栈操作与压栈操作类似,top指针通过增1进行,如果此时top值是7,则退栈后的top的值设为0。上述操作由硬件自动的实现,对用户来讲是透明的。
用户通过指令对浮点数据进行操作时,所见到的浮点寄存器是ST(0)、ST(1)、…、ST(7)。这里的ST(i)是指距离栈顶第i个单元的寄存器。按照0所示状态,ST(0)为第3号寄存器,ST(1)为第4号,依此类推。
X86浮点运算提供了压栈(浮点装入指令)、退栈(浮点保存指令)、浮点运算指令和一些其它的辅助指令。程序可以通过浮点装入指令将内存中的浮点数据压入浮点寄存器栈中,通过浮点运算指令对浮点数据进行运算,通过浮点保存指令进行退栈,并将栈顶寄存器的内容保存到内存单元中。
这种浮点运算方式是X86系列处理器所独有的,其它的处理器基本上都没有类似的运算方式。一般来讲,在它们内部设置若干个通用的浮点寄存器,这些浮点寄存器统一编号,指令通过这些编号来直接访问某个固定的浮点寄存器。可以看出,X86指令中所操作的ST(i)随着栈顶指针top的变化而变化,而其它处理器中指令所操作的浮点寄存器fi则固定是第i个物理寄存器,这一区别为二进制翻译的实现带来了困难。
在介绍本发明之前,我们现介绍一下当前针对这一问题所采用的方案:
一般来讲,最为简单的实现方法就是在目标机的内存中开辟一块空间,用于仿真X86的浮点寄存器栈,并用一个变量或来指示栈顶所在位置,其形式如图2所示。
这种通过内存来仿真X86的寄存器栈的方法可以准确地实现X86的各种浮点运算,但其最大的缺陷就是效率问题。X86的浮点装入和保存指令,在目标机器上实质上被变换成了内存间的移动指令,X86的浮点寄存器的数学运算则被变成了在内存上的数据运算。由于内存的访问速度远远慢于寄存器的访问,这将会严重影响翻译后代码的性能。据我们统计,这种性能下降在一个数量级左右。
为了改变这种状况,提高效率,Intel的研究人员提出了一种较为有效的解决方案。该方案建立在一个投机性假设的前提上,即默认程序在进入同一个基本块时,无论从哪一个前驱进入该基本块,浮点栈的栈顶指针都是同一个常数,并且不会出现栈异常。在这种假设前提下,将X86的所有浮点栈种的寄存器一一映射到目标机器的固定寄存器中。这样可以避免访存操作所带来的巨大开销,从而带来性能的提高。
按照Intel的统计,上述假设在99%的情况下都是正确的,仅在极个别的情况下出现投机失败。针对这1%的可能性二进制翻译系统必须采用某种弥补措施以保证翻译后的代码能够正常工作。为此,Intel的二进制翻译系统在每个基本块的入口设置了一段指令。在运行时,由这些指令通过比较来判断每次进入基本块时,投机假设是否成立。如果投机假设成立的话,就进入正常地处理。如果不成立的话,则进行恢复操作。恢复操作所采用的方案是循环移动8个寄存器的值,使这些寄存器的状态和翻译前的投机默认一致。图3是上述处理方案所产生的结果的示意图(这个结果示意图是根据Intel的一篇论文所讲述的方法构造的,该文发表在IEEEProceedings of the 36th International Symposium on Microarchitecture(MICRO-36 2003)。)
Intel的这个方法虽然能够有效地解决前面方法所具有地问题,但该方法也存在着不足。既然99%以上地概率不会出现投机失败的问题,但系统也不得不在进入每个基本块时都要进行投机失败的判别。这些判别成为系统附加的一个较大的开销,降低了系统的翻译效率。
发明内容
本发明所要解决的技术问题是提供一种二进制翻译中对X86中浮点运算的处理方法,克服现有二进制翻译技术中系统开销大的缺陷,提高系统翻译效率,从而提高系统性能。
为了解决上述技术问题,本发明提供一种二进制翻译中对X86中浮点运算的处理方法,包括以下步骤;
a)在运行时环境中设置一个浮点栈,用于仿真X86中的物理浮点栈;
b)通过浮点寄存器映射的处理和归一方法依次对源二进制程序中的每个基本块进行处理,在处理时用目标机器的寄存器来映射X86的源寄存器,并且采用归一的方法来保证在每个基本块的入口满足每次栈顶指针top值相同的假设,具体包括以下步骤;
b1)在翻译器中,设置一个工作指针;
b2)判断是否处理完一个基本块,如果尚未处理结束,则执行下一步,否则,执行步骤b10);
b3)从X86基本块中依次取出下一条指令,准备处理;
b4)判断取出的指令是否是浮点指令?如果否,执行下一步,如果是,执行步骤b6);
b5)当遇到非浮点指令时,则进行普通指令的翻译,而后执行步骤b2);
b6)判别浮点指令类型,针对不同的类型进行不同的处理,其中浮点指令类型包括压栈指令,退栈指令和普通的浮点运算指令,如果为压栈指令,则执行下一步,为退栈指令执行步骤b8),为普通运算指令执行步骤b9);
b7)当遇到浮点装入指令(即浮点压栈)操作时,进行压栈指令处理,指令处理完毕后,执行步骤b2);
b8)当遇到浮点保存指令(即浮点退栈)操作时,进行退栈指令处理,指令处理完毕后,执行步骤b2);
b9)遇到普通的浮点运算指令时,则生成相应的本地码运算指令,指令处理完毕后,执行步骤b2);
b10)退出基本块时,判断压栈和退栈操是否匹配,如果匹配,则退出处理,如果不匹配,则执行下一步;
b11)做归一处理,当压栈多于退栈操作时,基本块处理结束后,工作指针大于0,此时生成指令,将f0至fwork压入运行时环境所预留的浮点栈中,并且修改运行指针top,然后退出。
在上述方案中,步骤a)中所述浮点栈由一个数组和一个用于指示栈顶的变量组成。
在上述方案中,步骤b1)中工作指针work初始值为0。
在上述方案中,步骤b7)中压栈指令处理包括以下步骤:
依次生成如下功能的本地码指令:需要压栈的内容传入第work个浮点寄存器fwork;
然后修改工作指针work:工作指针加1,work++。
在上述方案中,步骤b8)中,退栈指令处理包括以下步骤:
若工作指针大于0,work>0,则进行如下操作:
修改工作指针:工作指针减1,work--;
然后生成如下功能的本地码指令:将第work个浮点寄存器fwork传输至目标单元;
若工作指针为0,work==0,表明浮点寄存器所代表的栈顶已经全部被弹出堆栈,此时还需要退栈,则应该从运行时环境中的浮点数组中继续弹出,包括以下步骤:
生成指令,该指令完成对浮点栈的退栈过程,将运行时环境中的浮点仿真栈中栈顶元素取到第0个浮点寄存器f0中了。
然后可以生成退栈指令:第0个浮点寄存器f0传输至目标单元。
在上述方案中,步骤b9)中,源机器上的寄存器ST(i)的对应关系如下:若work-i-1≥0,则用目标机器上的编号为work-i-1的浮点寄存器;
若work-i-1<0,则使用运行时环境中的fpu_stack[top-(work-i)]。
在上述方案中,归一处理仅对浮点栈栈顶元素进行处理。
由上可知,本发明通过用目标机器的寄存器来映射X86的源寄存器,保证了X86的浮点运算在目标机器上也是由寄存器来实现,确保运算的效率;采用归一的方法,确保每个基本块的入口满足每次top的值相同的假设,从本质上来讲,将Intel的运行过程中对投机假设的判别,用归一的方法进行了保证。归一的工作是由翻译器来完成的,一次翻译多次使用。本发明使得基本块不需要每次都去判别是否投机假设成立,省去了这一部分开销,提高了系统翻译效率,从而提高了系统性能。
附图说明
图1是现有技术中X86浮点寄存器栈结构图。
图2是现有技术中采用内存模拟X86浮点栈示意图。
图3是现有技术中Intel对二进制翻译中对X86中浮点运算的处理方法流程图。
图4是本发明中二进制翻译中对X86中浮点运算的处理方法流程图。
图5是本发明实施例中翻译器对基本块的处理方法流程图。
图6是本发明实施例中对二进制翻译中对X86中浮点运算的处理结果示意图。
具体实施方式
为了便于对本方法的介绍,我们先要明确两个概念:翻译器和运行时环境。
本方法所提到的二进制翻译系统由两个部分组成:翻译器和运行时环境。翻译器的作用是对源二进制代码进行翻译,将源二进制代码翻译成目标机器上可以执行的代码,即本地码。运行时环境则是为本地码的运行而设置的执行环境,该环境内具备二进制代码执行所需的内存环境等信息。在运行时环境的支持下,二进制翻译后的代码才能够正确地执行。
翻译器既可以静态也可以动态执行,静态进行翻译不会占用系统总的执行时间,即使在动态运行时进行翻译,也只需进行一次翻译,翻译的所产生的本地码则可以供多次执行。
本发明建立在如下两个基本原则上:一是尽可能地利用目标机器上的浮点寄存器,这一点和Intel所采用方案基本一致:二是尽可能地避免本地码执行过程中不必要的操作,将这些操作安排在翻译时完成,从而以达到提高本地码执行的效率的目的。
下面参照附图详细说明本发明的技术方案。一种二进制翻译中对X86中浮点运算的处理方法包括以下步骤:
步骤100,在运行时环境中设置一个浮点栈,用于仿真X86中的物理浮点栈,该栈由一个数组和一个用于指示栈顶的变量组成。具体定义如图2所示。
这样,在二进制翻译中,可以用内存中的这两个变量来仿真X86中的浮点操作。不过,正如前面所述,这种通过内存操作来实现的方法会导致频繁的对内存的访问,影响系统的效率。为此,需要充分利用目标机器上的浮点运算资源。我们知道,一般的目标机器具有较为丰富的浮点寄存器。但这些浮点寄存器无法通过间接寻址来访问,不能够直接用来仿真X86的工作。即使这样,我们还可以对它们加以利用。我们可以在运行目标代码时,将目标机器的浮点寄存器作为运行时环境浮点栈的延伸,将它们作为浮点栈的栈顶。具体实现如步骤110所示。
步骤110,通过浮点寄存器映射的处理和归一方法依次对源二进制程序中的每个基本块进行处理。每个基本块的处理方法流程如图4所示,在步骤110中,又包括以下步骤:
步骤200,在翻译器中,设置一个工作指针(为了表述方便,我们将该指针命名为work),在步骤200中,Work的初始值为0。
在此,我们也采用类似Intel系统的假设,即每次翻译一个基本块时,我们默认进入基本块前,所有的浮点栈都处于一致的状态。但与Intel方法的区别在于,我们不是在基本块入口实时判断,而是通过步骤250来保证。
步骤210,判断是否处理完一个基本块,如果尚未处理结束,则执行下一步,否则,执行步骤290。在步骤210中,按照编译技术中的基本块定义,就可以将程序划分成一系列基本块,每个基本块有一系列指令组成,当处理完基本块的最后一条指令时,表示基本块结束了。
步骤220,从X86基本块中依次取出下一条指令,准备处理。
步骤230,判断取出的指令是否是浮点指令?如果否,执行下一步,如果是,执行步骤250,
步骤240,当遇到非浮点指令时,则进行普通指令的翻译(这一点不属于本发明的内容,不作过多介绍)。然后执行步骤210。
步骤250,判别浮点指令类型,针对不同的类型进行不同的处理,其中浮点指令类型包括压栈指令,退栈指令和普通的浮点运算指令,如果为压栈指令,则执行下一步,为退栈指令执行步骤270,为普通浮点运算指令执行步骤280。
步骤260,当遇到浮点装入指令(即浮点压栈)操作时,进行压栈指令处理,指令处理完毕后,执行步骤210,具体操作如下:
生成如下功能的本地码指令:
fwork←需要压栈的内容
然后修改工作指针work:
work++
步骤270,当遇到浮点保存指令(即浮点退栈)操作时,进行退栈指令处理,指令处理完毕后,执行步骤210,具体操作如下:
若work>0,则进行如下操作:
首先修改工作指针:
work--
然后生成如下功能的本地码指令:
目标单元←fwork
若work==0,这种情况表明浮点寄存器所代表的栈顶已经全部被弹出堆栈,此时还需要退栈,则应该从运行时环境中的浮点数组中继续弹出,具体做法如下:
生成指令,该指令完成对浮点栈的退栈过程,具体功能如下:
f0←fpu_stack[top]
top←top+1
这两条指令将运行时环境中的浮点仿真栈中栈顶元素取到f0中了。
然后可以生成退栈指令:
目标单元←f0
步骤280,遇到普通的浮点运算指令时,则生成相应的本地码运算指令,指令处理完毕后,执行步骤210。源机器上的寄存器ST(i)的对应关系如下:
若work-i-1≥0,则用目标机器上的编号为work-i-1的浮点寄存器。
若work-i-1<0,则使用运行时环境中的fpu_stack[top-(work-i)]
步骤290,退出基本块时,判断压栈和退栈操是否匹配,也就是说判断work是否为0,如果匹配,work为0,则退出处理,如果不匹配,则执行下一步。
如果压栈和退栈操作不匹配,如果不加以处理,则会导致在进入下一个基本块时,浮点栈的和翻译时的假设不一致。
步骤295,归一处理,然后退出。
对退栈多于压栈的情况,上面的对退栈处理的方法可以保证基本块处理结束时,work为0。
当压栈多于退栈操作时,基本块处理结束后,work>0。这时候再生成指令,将f0~fwork压入运行时环境所预留的浮点栈中,并且修改运行指针top。具体做法如下:
for(i=0;i<work;i++)
fpu_stack[top-i-1]←fi;
top←(top-work)mod 8;
在以上步骤中,f为浮点寄存器变量,f0-fwork表示从第0至第work的浮点寄存器,←表示传输的意思,fpu_stack是定义的数组。
以上为本发明二进制翻译中对X86中浮点运算的处理方法的具体方描述。按照上述方法,经过处理后,产生如图5所示的处理结果。
本发明所提供的二进制翻译中的浮点处理方法具有如下两个特点:一是用目标机器的寄存器来映射X86的源寄存器,保证了X86的浮点运算在目标机器上也是由寄存器来实现,确保运算的效率;二是采用归一的方法,确保每个基本块的入口满足每次top的值相同的假设,从本质上来讲,将Intel的运行过程中对投机假设的判别,用归一的方法进行了保证。归一的工作是由翻译器来完成的,一次翻译多次使用。另外,我们仅对那些需要归一的基本块进行归一,这样按照Intel的统计结果,仅需对1%左右的基本块进行归一处理。
本发明根据是否需要归一而把X86基本块分为两类。对于那些不需归一的基本块,所产生的完全是用于实现X86基本块功能的本地代码。相对于Intel的处理方案,翻译结果省去了对投机条件的判断,以及投机失败后的循环移动的开销。即使对于那些需要归一的代码,也省去了投机条件的判别的开销。另外,本方法的归一操作,是将那些留存在目标机器浮点寄存器中的浮点数据写回浮点虚拟栈中。这个操作要进行访存处理,表面上看开销比较大。但是,经过我们试验的统计发现,需要归一的基本块99%的由如下原因引起,即函数的返回值是浮点数据,此时需要通过浮点栈传送返回值。这种情况仅需要对浮点寄存器中的一个寄存器进行归一处理。也就是说,需要一次访存操作。
我们知道,按照Intel的统计,99%以上的基本块都不会出现投机假设不成立的情况。为此,99%的基本块所对应的本地码是自然归一的,仅仅由1%左右的基本块需要归一。这样,本发明使得基本块不需要每次都去判别是否投机假设成立,省去了这一部分开销。从而改善了性能。
最后应说明的是:以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
Claims (7)
1、一种二进制翻译中对X86中浮点运算的处理方法,包括以下步骤:
a)在运行时环境中设置一个浮点栈,用于仿真X86中的物理浮点栈;
b)通过浮点寄存器映射的处理和归一方法依次对源二进制程序中的每个基本块进行处理,在处理时用目标机器的寄存器来映射X86的源寄存器,并且采用归一的方法来保证在每个基本块的入口满足每次栈顶指针top值相同的假设,具体包括以下步骤:
b1)在翻译器中,设置一个工作指针work;
b2)判断是否处理完一个基本块,如果尚未处理结束,则执行下一步,否则,执行步骤b10);
b3)从X86基本块中依次取出下一条指令,准备处理;
b4)判断取出的指令是否是浮点指令,如果否,执行下一步,如果是,执行步骤b6);
b5)当遇到非浮点指令时,则进行普通指令的翻译,翻译完毕执行步骤b2);
b6)判别浮点指令类型,针对不同的类型进行不同的处理,其中浮点指令类型包括压栈指令,退栈指令和普通的浮点运算指令,如果为压栈指令,则执行下一步,为退栈指令执行步骤b8),为普通运算指令执行步骤b9);
b7)当遇到浮点装入指令,即浮点压栈操作时,进行压栈指令处理,指令处理完毕后,执行步骤b2);
b8)当遇到浮点保存指令,即浮点退栈操作时,进行退栈指令处理,指令处理完毕后,执行步骤b2);
b9)遇到普通的浮点运算指令时,则生成相应的本地码运算指令,指令处理完毕后,执行步骤b2);
b10)退出基本块时,判断压栈和退栈操是否匹配,如果匹配,则退出处理,如果不匹配,则执行下一步;
b11)做归一处理,当压栈多于退栈操作时,基本块处理结束后,工作指针大于0,此时生成指令,将f0至fwork压入运行时环境所预留的浮点栈中,并且修改运行指针top,然后退出。
2、如权利要求1所述的方法,其特征在于,步骤a)中所述浮点栈由一个数组和一个用于指示栈顶的变量组成。
3、如权利要求1所述的方法,其特征在于,步骤b1)中工作指针work初始值为0。
4、如权利要求1所述的方法,其特征在于,步骤b7)中压栈指令处理包括以下步骤:
依次生成如下功能的本地码指令:需要压栈的内容传入第work个浮点寄存器fwork;
然后修改工作指针work:工作指针加1,work++。
5、如权利要求1所述的方法,其特征在于,步骤b8)中,退栈指令处理包括以下步骤:
若工作指针大于0,work>0,则进行如下操作:
修改工作指针:工作指针减1,work--;
然后生成如下功能的本地码指令:将第work个浮点寄存器fwork传输至目标单元;
若工作指针为0,work==0,表明浮点寄存器所代表的栈顶已经全部被弹出堆栈,此时还需要退栈,则应该从运行时环境中的浮点数组中继续弹出,包括以下步骤:
生成指令,该指令完成对浮点栈的退栈过程,将运行时环境中的浮点仿真栈中栈顶元素取到第0个浮点寄存器f0中了;
然后可以生成退栈指令:第0个浮点寄存器f0传输至目标单元。
6、如权利要求1所述的方法,其特征在于,步骤b9)中,源机器上的寄存器ST(i)的对应关系如下:若work-i-1≥0,则用目标机器上的编号为work-i-1的浮点寄存器;
若work-i-1<0,则使用运行时环境中的fpu_stack[top-(work-i)]。
7、如权利要求1所述的方法,其特征在于,归一处理仅对浮点栈栈顶元素进行处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2004100745326A CN100345117C (zh) | 2004-09-07 | 2004-09-07 | 二进制翻译中对x86中浮点运算的处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2004100745326A CN100345117C (zh) | 2004-09-07 | 2004-09-07 | 二进制翻译中对x86中浮点运算的处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1746850A CN1746850A (zh) | 2006-03-15 |
CN100345117C true CN100345117C (zh) | 2007-10-24 |
Family
ID=36166396
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004100745326A Expired - Lifetime CN100345117C (zh) | 2004-09-07 | 2004-09-07 | 二进制翻译中对x86中浮点运算的处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100345117C (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101216756B (zh) | 2007-12-28 | 2011-03-23 | 中国科学院计算技术研究所 | 一种risc处理器装置及其模拟浮点栈操作的方法 |
CN101546271B (zh) * | 2009-04-30 | 2012-01-04 | 上海交通大学 | 动态二进制翻译系统中超级块的寄存器分配方法 |
CN101739238B (zh) * | 2010-01-14 | 2012-11-21 | 上海交通大学 | 针对sse2指令的二进制浮点翻译方法 |
CN116501451B (zh) * | 2023-06-25 | 2023-10-17 | 中国科学院计算技术研究所 | 二进制翻译方法、翻译控制方法、指令执行方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6112296A (en) * | 1997-12-18 | 2000-08-29 | Advanced Micro Devices, Inc. | Floating point stack manipulation using a register map and speculative top of stack values |
US6134573A (en) * | 1998-04-20 | 2000-10-17 | Ip-First, L.L.C. | Apparatus and method for absolute floating point register addressing |
-
2004
- 2004-09-07 CN CNB2004100745326A patent/CN100345117C/zh not_active Expired - Lifetime
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6112296A (en) * | 1997-12-18 | 2000-08-29 | Advanced Micro Devices, Inc. | Floating point stack manipulation using a register map and speculative top of stack values |
US6134573A (en) * | 1998-04-20 | 2000-10-17 | Ip-First, L.L.C. | Apparatus and method for absolute floating point register addressing |
Also Published As
Publication number | Publication date |
---|---|
CN1746850A (zh) | 2006-03-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1103079C (zh) | 用于高级微处理器的门控存储缓冲器 | |
CN1161691C (zh) | 检测被寻址单元预测失败的存储控制器 | |
CN1308826C (zh) | 用于smt处理器上的cpi调度的系统和方法 | |
US7813909B2 (en) | Register mapping in emulation of a target system on a host system | |
CN1302385C (zh) | 编译装置 | |
CN1241272A (zh) | 赋予高级微处理器内存储器数据别名的方法和装置 | |
CN1009592B (zh) | 微处理器芯片上的堆栈式超高速缓冲存储器 | |
CN1682181A (zh) | 具有外部和内部指令集的数据处理系统 | |
CN1725175A (zh) | 分支目标缓冲器及其使用方法 | |
CN1238500A (zh) | 用于进行静态初始化的方法和系统 | |
CN1542609A (zh) | 处理器及处理管线中例外反应的装置与方法 | |
CN1855053A (zh) | 用于执行java虚拟机的指令的方法和设备 | |
CN1142485C (zh) | 流水线控制相关延迟消除方法 | |
CN1521636A (zh) | 一种高速缓存及从高速缓存读取数据的方法与运算逻辑 | |
CN100345117C (zh) | 二进制翻译中对x86中浮点运算的处理方法 | |
CN1766848A (zh) | 基于模拟器的嵌入式软件运行时能耗估算方法 | |
Haque et al. | Dew: A fast level 1 cache simulation approach for embedded processors with fifo replacement policy | |
CN1860436A (zh) | 用于处理指令循环的方法和系统 | |
CN1755631A (zh) | 二进制翻译中的库函数调用处理方法 | |
Chakraborty | Fifty years of peephole optimization | |
Gross et al. | A retrospective on “MIPS: a microprocessor architecture” | |
CN100339826C (zh) | 处理器和半导体器件 | |
CN1489038A (zh) | 数据处理装置 | |
CN1438576A (zh) | 基于操作栈记录的恢复的Java线程迁移的方法 | |
EP2013723B1 (en) | Register mapping in emulation of a target system on a host system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CX01 | Expiry of patent term |
Granted publication date: 20071024 |
|
CX01 | Expiry of patent term |