CN110187883B - 一种面向指令目标操作数的寄存器对分配方法及存储介质 - Google Patents
一种面向指令目标操作数的寄存器对分配方法及存储介质 Download PDFInfo
- Publication number
- CN110187883B CN110187883B CN201910411700.2A CN201910411700A CN110187883B CN 110187883 B CN110187883 B CN 110187883B CN 201910411700 A CN201910411700 A CN 201910411700A CN 110187883 B CN110187883 B CN 110187883B
- Authority
- CN
- China
- Prior art keywords
- register
- instruction
- replacement
- pair
- idle
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种面向指令目标操作数的寄存器对分配方法及存储介质,该方法步骤包括:S1.分别将待处理指令中所有目标操作数寄存器对所包含的两个符号寄存器均进行独立的寄存器分配;S2.依次获取各条指令进行寄存器修正分配,将寄存器对中错误使用寄存器使用替换寄存器进行替换,替换寄存器根据各寄存器、寄存器对在指令操作数字段出口处的空闲状态进行选取,并使得每个替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者。本发明面向指令目标操作数实现寄存器对分配,具有实现方法简单、分配成功率及资源利用率高、灵活性强等优点。
Description
技术领域
本发明涉及编译优化技术领域,尤其涉及一种面向指令目标操作数的寄存器对分配方法及存储介质。
背景技术
随着微电子技术和嵌入式处理器技术的发展,许多微处理器特别是高性能嵌入式处理器体系结构对数据的处理能力日益增强,一个重要的特点是体系结构中往往有许多指令的操作数被设计成是由即寄存器对构成。这种硬件特性的典型应用如在指令中用寄存器对作为一个操作数来实现更大字长的数据处理能力或超过某个地址范围的访存能力。常见的寄存器对的使用规则一般要求对中的两个寄存器是奇偶连号的。对于系统的编译软件来讲,在代码中充分利用寄存器是其的核心任务之一。为了发挥先进体系结构的性能,在编译技术中,对寄存器资源的利用由寄存器分配这一过程来实现,从而寄存器分配是现代优化编译器需要优化的核心过程之一。
寄存器分配主要有线性扫描法和基于图着色思想的全局寄存器分配方法两类,其中后者基于对变量生命期的详细刻画,是寄存器分配效果较好的一类方法。在传统的寄存器分配方法中,对寄存器对的分配均是把需要成对寄存器的地方对应的两个寄存器分配候选者作为一个整体,在寄存器指派时为其指派一个符合要求的物理寄存器对。该类方法尽管能够保证为操作数指派符合要求的寄存器对,但在代码的寄存器压力较大时,会因成功获得符号连号寄存器对的要求的可能性小而导致产生许多额外的溢出和访存操作指令,使得代码的执行效率降低,而实际上对于数据密集型或地址量很多的程序,会有相当一部分数据高(或低)字内容相同,这些相同数据实际并不需要不同的寄存器来存储,而传统的寄存器分配方法的寄存器对分配策略无法处理该类问题,从而不能充分利用寄存器资源来提升代码的性能。此外,如果需要针对具体的体系结构以开发某种低级中间语言的方式来实现获得高效代码,传统的绑定寄存器分配候选者为一对来指派物理寄存器对的方式也不具有适用性。
发明内容
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种实现方法简单、分配成功率及资源利用率高、灵活性强的面向指令目标操作数的寄存器对分配方法及存储介质。
为解决上述技术问题,本发明提出的技术方案为:
一种面向指令目标操作数的寄存器对分配方法,步骤包括:
S1.初始分配:分别将待处理指令中包括成对寄存器的所有目标操作数所包含的两个符号寄存器均作为单寄存器分配候选者进行独立的寄存器分配;
S2.修正分配:依次获取各条指令进行寄存器修正分配,如果指令中存在至少一个以上的目标操作数涉及寄存器对,对指令中各目标操作数依次进行寄存器对合法性检查,并根据检查结果将寄存器对中不符合使用规则的错误使用寄存器使用替换寄存器进行替换,所述替换寄存器根据各寄存器、寄存器对在指令操作数字段出口处的空闲状态进行选取,并使得每个所述替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者。
作为本发明的进一步改进,所述步骤S1中,具体将目标操作数中成对的寄存器分配候选者中的每一个都当作对应着单个物理寄存器的独立单寄存器分配候选者,并与其他单寄存器分配候选者一起采用相同的寄存器分配方式分配各自的物理寄存器。
作为本发明的进一步改进,所述步骤S2的步骤包括:
S21.在每条指令处理前获取各寄存器以及寄存器对在指令操作数字段出口处的空闲状态;
S22.对每条指令进行处理时,从指令的第一个目标操作数开始遍历各个目标操作数,如果目标操作数包含一个寄存器对,对该寄存器对进行合法性检查,判断该寄存器对中两个寄存器是否符合寄存器对使用规则,若不符合,判定需要修正,转入执行步骤S23;
S23.判断需要修正的寄存器对中错误使用寄存器的位置,根据所述错误使用寄存器的位置以及各寄存器在指令操作数字段出口处的空闲状态选取替换寄存器对当前各所述错误使用寄存器进行修正,优先选取在指令操作数字段出口处空闲的寄存器作为所述替换寄存器。
作为本发明的进一步改进,所述步骤S23的步骤包括:判断目标操作数中寄存器对是否是由两个连号的奇偶号寄存器构成,如果目标操作数寄存器对中两个寄存器序号均不符合,则判定为需要全部替换目标操作数寄存器对的两个寄存器,使用第一修正模式对目标操作数中两个寄存器进行修正;如果目标操作数寄存器对中的左位寄存器或右位寄存器序号不符合,则判定需要替换目标操作数寄存器对中的左位寄存器或右位寄存器,使用第二修正模式对目标操作中左位或右位寄存器进行修正;如果目标操作数寄存器对中的两个寄存器序号不匹配,则判定需要替换目标操作数寄存器对中的任意一个寄存器,使用第三修正模式对目标操作数中任意一个寄存器进行修正。
作为本发明的进一步改进,所述步骤S23中对每条指令的处理步骤具体包括:
S231.对指令进行目标操作数寄存器对修正的数据进行初始化,包括获取指令源操作数字段出口处的寄存器空闲状态和寄存器对的空闲状态;
S232.判断指令是否还有要修正的目标操作数,如果没有转到步骤S236,否则执行步骤S233;
S233.切换到下一个要处理的目标操作数寄存器对;
S234.初始化处理1个目标操作数寄存器对时所需的数据;
S235.选取所需替换寄存器修正当前目标操作数;
S236.更新当前指令的目标操作数涉及的变量;
S237.添加将所有需要保护数据的替换寄存器中的内容保护到寄存器的指令到前插指令队列首,加恢复内容的指令到原寄存器的指令到后插指令队列尾。
S238.将所有的前插指令插入到当前被处理指令之前,将所有的后插指令插入到当前被处理指令之后。
作为本发明的进一步改进,所述使用第一修正模式对目标操作数中两个寄存器进行修正时,根据指令的源操作数字段出口处的寄存器空闲状态以及使用状态查找一个用于替换的寄存器对,使用查找到的寄存器对分别替换目标操作数中两个错误使用寄存器;所述查找一个用于替换的寄存器对的步骤包括:
a)从所有满足使用规则的合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口处寄存器对中的两个寄存器都空闲,若查找到转入执行步骤d),若未查找到转入执行步骤b);
b)从所述合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口上寄存器对中的一个寄存器不空闲、另外一个空闲,若查找到转入执行步骤d),若未查找到转入执行步骤c);
c)从所述合法寄存器对构成的集合中查找一个寄存器对:在指令的源操作数字段出口处寄存器对中的两个寄存器都不空闲,查找到后转入执行步骤d);
d)由当前查找到的寄存器对作为所述用于替换的寄存器对输出。
作为本发明的进一步改进,Sa1.将需要修正的寄存器对中左寄存器rL和右寄存器rR都添加到错误使用寄存器ErrRegSet中;
Sa2.判断指令源操作数字段出口处是否有空闲寄存器对,如果是转入执行步骤Sa3,否则转入步骤Sa8;
Sa3.排除所有空闲寄存器对中满足包含当前指令的目标寄器存且该目标寄存器在指令的出口不空闲的空闲寄存器对,得到排除后的空闲寄存器对集合;
Sa4.判断所述排除后的空闲寄存器对集合是否仍有剩余寄存器对,如果有,转入执行步骤Sa5,否则转入执行步骤Sa8;
Sa5.从所述排除后的空闲寄存器对集合中挑选编号最大的空闲寄存器对作为用来替换的替换寄存器对,转入执行步骤Sa6;
Sa6.将所述Sa5确定的替换寄存器对中两个寄存器加入所述替换寄存器集合中,转入执行步骤Sa7;
Sa7.确定替换方案为:使用步骤Sa5确定的所述替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将所述替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,转入进行数据更新操作;
Sa8.判断指令源操作数字段出口处是否有半空闲寄存器对SLO,所述半空闲寄存器对为一个寄存器空闲、另一个不空闲,如果有,转入执行步骤Sa9,否则转入执行步骤Sa14;
Sa9.获取所有半空闲对SLO构成集合SH,转到步骤Sa10;
Sa10.从所述集合SH中去除满足以下条件的寄存器对:两个寄存器中的任意一个是指令的目标寄存器且该寄存器在指令的出口处活跃,得到处理后的集合SH,转入执行步骤Sa11;
S a11.判断所述处理后的集合SH是否为非空集合,如果是,转入执行步骤S a12,否则转入执行步骤Sa15;
Sa12.取所述处理后的集合SH中编号最大的半闲寄存器对SLO作为当前替换寄存器对,对当前替换寄存器对中不空闲的寄存器Rx中数据进行保存,转到步骤Sa13;
Sa13.将当前替换寄存器对中两个寄存器添加至所述替换寄存器集合中,转入执行步骤Sa14;
Sa14.确定替换方案rep为:使用所述步骤Sa7确定的替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将当前替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sa15.查找指令源操作数字段出口处所有非空闲寄存器对,所述非空闲寄存器对两个寄存器均不空闲的寄存器对,从查找到的所有非空闲寄存器对中去除满足寄存器对中有作为当前指令目标寄存器且在出口不空闲的寄存器,得到处理后的非空寄存器集合,转入执行步骤S a16;
Sa16.取所述非空寄存器集合中编号最大的寄存器对作为替换寄存器候选者并保存寄存器中数据,转入执行步骤Sa13。
作为本发明的进一步改进,所述使用第二修正模式对目标操作中左位或右位寄存器进行修正的步骤包括:
Sb1.根据错误寄存器R的配对寄存器PRA得到对应的替换寄存器PRB,转到步骤Sb2;
Sb2.判断所述替换寄存器PRB是否在指令出口处空闲,如果是,转到步骤Sb3,否则转到步骤Sb5;
Sb3.将错误寄存器R添加至错误寄存器集合中,以及将所述替换寄存器PRB添加至所述替换寄存器集合中;
Sb4.确定替换方案rep为:使用所述替换寄存器PRB替换所述错误寄存器R,并在当前指令后插入1条数据传送指令以将所述替换寄存器PRB中的数据传送给所述错误寄存器R,转入进行数据更新操作;
Sb5.判断所述替换寄存器PRB是否在当前指令中已经是目标寄存器,如果是转入使用第一修正模式对所述错误寄存器R进行修正,否则转到步骤Sb6;
Sb6.保存所述替换寄存器PRB中数据,将错误寄存器R添加至错误寄存器集合中,转到Sb7;
Sb7.确定替换方案rep为:使用所述替换寄存器PRB替换所述错误寄存器R,并在当前指令后要插入1条数据传送指令以将所述替换寄存器PRB中的数据传送给所述错误寄存器R,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
作为本发明的进一步改进,所述使用第三修正模式对目标操作数中任意一个寄存器进行修正的步骤包括:
Sc1.根据寄存器配对规则要求选取左位寄存器rL的替换寄存器PRB_L,转到步骤Sc2;
Sc2.判断所述替换寄存器PRB_L是否在指令的出口处空闲,如果是转到Sc3,否则转到步骤Sc5;
Sc3.将所述左位寄存器rL添加至错误使用寄存器集合中,所述替换寄存器PRB_L添加至所述替换寄存器集合中;
Sc4.确定替换方案rep为:使用所述替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给所述左位寄存器rL,转入进行数据更新操作;
Sc5.根据寄存器配对规则要求选取右位寄存器rR的替换寄存器PRB_R,转到步骤Sc6;
Sc6.判断所述替换寄存器PRB_R是否在指令的出口处空闲,如果是转到步骤Sc7,否则转到Sc9;
Sc7.将所述右位寄存器rR添加至错误使用寄存器集合中,所述替换寄存器PRB_R添加至所述替换寄存器集合中.,转入执行步骤S c8;
S c8.确定替换方案rep为:使用所述替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给所述右位寄存器rR,转入进行数据更新操作;
Sc9.判断所述替换寄存器PRB_L是否在当前指令中已经是目标寄存器,如果是,转入执行步骤S c12,否则转入执行步骤Sc10;
Sc10.将所述左位寄存器rL添加至错误使用寄存器集合中,以及将所述替换寄存器PRB_L添加至所述替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤Sc11;
S c11.确定替换方案rep为:使用所述替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给所述左位寄存器rL,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sc12.判断所述替换寄存器PRB_R是否在当前指令中已经是目标寄存器,如果是,转入使用所述第一修正模式对错误使用寄存器R进行修正,否则转入执行步骤S c13;
S c13.将所述右位寄存器rR添加至错误使用寄存器集合中,所述替换寄存器PRB_R添加至所述替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤.S c14;
S c14.确定替换方案rep为:使用所述替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给所述右位寄存器rR,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
一种存储有计算机程序的计算机可读存储介质,所述计算机程序执行时实现如上述的方法。
与现有技术相比,本发明的优点在于:
1、本发明对于指令目标操作数中使用的寄存器对分配时,通过先将目标寄存器对中的寄存器分配候选者视为单个候选者进行独立的单寄存器分配,再对寄存器对中不符合使用规则的错误使用寄存器进行修正,根据寄存器、寄存器对在指令操作数字段出口处的空闲状态选取替换寄存器,同时每个替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者,可以充分利用指令目标操作数寄存器的特性,提高寄存器指派过程的成功率,减少冗余的溢出和访存操作指令,减少冗余的寄存器溢出的同时能够保证寄存器对的使用正确性。
2、本发明通过将寄存器对分配分成单寄存器初始分配以及修正分配两个阶段,在单寄存器分配完成后通过目标操作数寄存器对修正处理来保证指令源操作数中的寄存器对符合使用规则要求,因而对指令源操作数中的成对寄存器分配候选者无需如传统的要求必须在寄存器指派时就获得合法的寄存器偶对,能够提升指令源操作数对寄存器的使用灵活性,尤其是在代码的寄存器压力较大时能减少寄存器分配过程产生的寄存器溢出。
3、本发明考虑指令目标操作数中的寄存器的内容将被所在的指令覆盖,且一个寄存器只能在一条指令中作为目标操作数一次的特性,在处理指令各目标操作数的过程中挑选替换寄存器时,按优先级依次考虑空闲寄存器对、半空闲寄存器对、非空闲寄存器对的顺序来进行挑选,并及时更新被替换寄存器的空闲状态以供剩下的待处理目标操作数使用,从而尽可能地减少对新的寄存器的需求,减少需要在指令序列中插入的数据传送指令、数据保护指令和恢复指令。
4、本发明能够自动处理某个单寄存器分配候选者在某些目标操作数寄存器对中位于左位但在另外一些目标操作数寄存器对中位于右位的情况,从而提升在目标操作数中使用变量方面的灵活性。
附图说明
图1是本实施例面向指令目标操作数的寄存器对分配方法的实现流程示意图。
图2是本实施例中修正一个目标操作数时四种处理模式的路径原理示意图。
图3是本发明具体应用实施例中对一条指令的目标操作数进行寄存器对修正的处理总流程示意图。
图4是本发明具体应用实施例中进入第一修正模式A的实现流程示意图。
图5是本发明具体应用实施例中进入第二修正模式B或C的实现流程示意图。
图6是本发明具体应用实施例中进入第三修正模式D的实现流程示意图。
图7是本发明具体应用实施例中公共处理子过程的实现流程示意图。
图8是本发明具体应用实施例中寄存器替换方案生成后的公共处理子过程的实现流程示意图。
具体实施方式
以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
如图1所示,本实施例面向指令目标操作数的寄存器对分配方法步骤包括:
S1.初始分配:分别将待处理指令中包括成对寄存器的所有目标操作数寄存器对所包含的两个符号寄存器均作为单寄存器分配候选者进行独立的寄存器分配;
S2.修正分配:依次获取各条指令进行寄存器修正分配,如果指令中存在至少一个以上的目标操作数涉及寄存器对,对指令中各目标操作数依次进行寄存器对合法性检查,并根据检查结果将寄存器对中不符合使用规则的错误使用寄存器使用替换寄存器进行替换,替换寄存器根据各寄存器、寄存器对在指令操作数字段出口处的空闲状态进行选取,并使得每个替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者。
指令目标操作数中的寄存器的内容将被所在的指令覆盖,且一个寄存器只能在一条指令中作为目标操作数一次。本实施例考虑指令目标操作数的上述特点,对于指令目标操作数中使用的寄存器对分配时,通过先将目标寄存器对中的寄存器分配候选者视为单个候选者进行独立的单寄存器分配,再对寄存器对中不符合使用规则的错误使用寄存器进行修正,根据寄存器、寄存器对在指令操作数字段出口处的空闲状态选取替换寄存器,同时每个替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者,可以充分利用指令目标操作数寄存器的特性,提高寄存器指派过程的成功率,减少冗余的溢出和访存操作指令,减少冗余的寄存器溢出的同时能够保证寄存器对的使用正确性。
本实施例上述寄存器对分配方法,通过将寄存器对分配分成单寄存器初始分配以及修正分配两个阶段,在单寄存器分配完成后通过目标操作数寄存器对修正处理来保证指令源操作数中的寄存器对符合使用规则要求,因而对指令源操作数中的成对寄存器分配候选者无需如传统的要求必须在寄存器指派时就获得合法的寄存器偶对,能够提升指令源操作数对寄存器的使用灵活性,尤其是在代码的寄存器压力较大时能减少寄存器分配过程产生的寄存器溢出。
本实施例步骤S1中,具体将目标操作数中成对的寄存器分配候选者中的每一个都当作对应着单个物理寄存器的独立单寄存器分配候选者,并与其他单寄存器分配候选者一起采用相同的寄存器分配方式分配各自的物理寄存器。即在寄存器分配时,首先将目标操作数中的成对的寄存器分配候选者中的每一个都当作对应着单个物理寄存器的普通单寄存器分配候选者,采用与普通单寄存器分配候选者相同的寄存器分配方法,与普通的单寄存器分配候选者一起参与寄存器分配,得到各自的物理寄存器。
本实施例中,步骤S2的步骤包括:
S21.在每条指令处理前获取各寄存器以及寄存器对在指令操作数字段出口处的空闲状态;
S22.对每条指令进行处理时,从指令的第一个目标操作数开始遍历各个目标操作数,如果目标操作数包含一个寄存器对,对该寄存器对进行合法性检查,判断该寄存器对中两个寄存器是否符合寄存器对使用规则,若不符合,判定需要修正,转入执行步骤S23;
S23.判断需要修正的寄存器对中错误使用寄存器的位置,根据错误使用寄存器的位置以及各寄存器在指令操作数字段出口处的空闲状态选取替换寄存器之后对当前各错误使用寄存器进行修正,优先选取在指令操作数字段出口处空闲的寄存器作为替换寄存器。
本实施例在处理每一条指令之前,先对该指令出口处的寄存器和寄存器对的空闲状态进行分析,由于指令可以具有任意多个目标操作数,而指令目标操作数中的寄存器的内容将被所在的指令覆盖,且一个寄存器只能在一条指令中作为目标操作数一次,进行寄存器对修正分配时,通过依据指令出口处寄存器、寄存器对的空闲状态来选取替换寄存器,优先选取空闲的寄存器,可以减少冗余的溢出和访存操作指令,一个寄存器一旦被用来替换,则不再作为相同指令中的其他目标操作数的替换寄存器候选者,被替换出来的寄存器也不作为其他替换寄存器的候选者,减少冗余的寄存器溢出的同时能够保证寄存器对的使用正确性。
本实施例中,步骤S23的步骤包括:判断目标操作数中寄存器对是否是由两个连号的奇偶号寄存器构成,如果两个寄存器序号均不符合,则判定为需要全部替换目标操作数寄存器对的两个寄存器,使用第一修正模式对目标操作数中两个寄存器进行修正;如果目标操作数中的左位寄存器或右位寄存器序号不符合,则判定需要替换目标操作数中的左位寄存器或右位寄存器,使用第二修正模式对目标操作中左位或右位寄存器进行修正;如果目标操作数中的两个寄存器序号不匹配,则判定需要替换目标操作数中的任意一个寄存器,使用第三修正模式对目标操作数中任意一个寄存器进行修正。
如图2所示,本实施例对于要进行修正处理的目标操作数,按照不同的处理模式采用相应的启发式优化方法进行处理,根据寄存器对须由两个连号的奇偶号寄存器构成这个基本要求,设置如下四种可能的修正处理模式:(A)全部替换目标操作数寄存器对的两个寄存器,(B)替换目标操作数中的左位寄存器(即写在一对中的左边的那个寄存器),(C)替换目标操作数中的右位寄存器(即写在一对中的右边的那个寄存器),(D)替换目标操作数中的任意一个寄存器。各修正模式(A、B、C、D)对应一种修正处理方式(R1~R4),其中B、C模式的原理相同,即A类对应为第一修正模式,B、C类对应为第二修正模式,D类对应为第三修正模式,在处理过程中,B、C、D三种处理模式可以根据实际状态转换成处理模式A。
指令可能有任意多个目标操作数,对于每一条指令,如果它至少有一个目标操作数涉及寄存器对,则对该指令的各目标操作数进行寄存器对合法性检查,对于不满足硬件关于寄存器对的使用规则的目标操作数中的寄存器对,先确定其所需的修正处理模式,再根据寄存器和寄存器对在指令出口处的空闲状态采用上述启发式优化方法将它们替换成符合规则要求的寄存器对。
本实施例中,步骤S23中对每条指令的处理步骤具体包括:
S231.对指令进行目标操作数寄存器对修正的数据进行初始化,包括获取指令源操作数字段出口处的寄存器空闲状态和寄存器对的空闲状态;
S232.判断指令是否还有要修正的目标操作数,如果没有转到步骤S236,否则执行步骤S233;
S233.切换到下一个要处理的目标操作数寄存器对;
S234.初始化处理1个目标操作数寄存器对时所需的数据;
S235.选取所需替换寄存器修正当前目标操作数;
S236.更新当前指令的目标操作数涉及的变量;
S237.添加将所有需要保护数据的替换寄存器中的内容保护到寄存器的指令到前插指令队列首,加恢复内容的指令到原寄存器的指令到后插指令队列尾。
S238.将所有的前插指令插入到当前被处理指令之前,将所有的后插指令插入到当前被处理指令之后。
本实施例中,使用第一修正模式(A)对目标操作数中两个寄存器进行修正时,根据指令的源操作数字段出口处的寄存器空闲状态以及使用状态查找一个用于替换的寄存器对,使用查找到的寄存器对分别替换目标操作数中两个错误使用寄存器;查找一个用于替换的寄存器对的步骤包括:
a)从所有满足使用规则的合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口处寄存器对中的两个寄存器都空闲,若查找到转入执行步骤d),若未查找到转入执行步骤b);
b)从合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口上寄存器对中的一个寄存器不空闲、另外一个空闲,若查找到转入执行步骤d),若未查找到转入执行步骤c);
c)从合法寄存器对构成的集合中查找一个寄存器对:在指令的源操作数字段出口处寄存器对中的两个寄存器都不空闲,查找到后转入执行步骤d);
d)由当前查找到的寄存器对作为用于替换的寄存器对输出。
本实施例执行第一修正处理模式(A)时,按照指令的源操作数字段出口处的寄存器空闲情况和使用情况,按照上述顺序依次寻找用于替换的寄存器对,直到找到一个寄存器偶对为止。
本实施例考虑指令目标操作数中的寄存器的内容将被所在的指令覆盖,且一个寄存器只能在一条指令中作为目标操作数一次的特性,在处理指令各目标操作数的过程中挑选替换寄存器时,按优先级依次考虑空闲寄存器对、半空闲寄存器对、非空闲寄存器对的顺序来进行挑选,直至查找到一个寄存器偶对为止,并及时更新被替换寄存器的空闲状态以供剩下的待处理目标操作数使用,从而尽可能地减少对新的寄存器的需求,减少需要在指令序列中插入的数据传送指令、数据保护指令和恢复指令。
本实施例中,使用第一修正模式对目标操作数中两个寄存器进行修正的步骤包括:
Sa1.将需要修正的寄存器对中左寄存器rL和右寄存器rR都添加到错误使用寄存器ErrRegSet中;
Sa2.判断指令源操作数字段出口处是否有空闲寄存器对,如果是转入执行步骤Sa3,否则转入步骤Sa8;
Sa3.排除所有空闲寄存器对中满足包含当前指令的目标寄器存且该目标寄存器在指令的出口不空闲的空闲寄存器对,得到排除后的空闲寄存器对集合;
Sa4.判断排除后的空闲寄存器对集合是否仍有剩余寄存器对,如果有,转入执行步骤Sa5,否则转入执行步骤Sa8;
Sa5.从排除后的空闲寄存器对集合中挑选编号最大的空闲寄存器对作为用来替换的替换寄存器对,转入执行步骤Sa6;
Sa6.将Sa5确定的替换寄存器对中两个寄存器加入替换寄存器集合中,转入执行步骤Sa7;
Sa7.确定替换方案为:使用步骤Sa5确定的替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,转入进行数据更新操作;
Sa8.判断指令源操作数字段出口处是否有半空闲寄存器对SLO,半空闲寄存器对为一个寄存器空闲、另一个不空闲,如果有,转入执行步骤Sa9,否则转入执行步骤Sa14;
Sa9.获取所有半空闲对SLO构成集合SH,转到步骤Sa10;
Sa10.从集合SH中去除满足以下条件的寄存器对:两个寄存器中的任意一个是指令的目标寄存器且该寄存器在指令的出口处活跃,得到处理后的集合SH,转入执行步骤Sa11;
S a11.判断处理后的集合SH是否为非空集合,如果是,转入执行步骤S a12,否则转入执行步骤Sa15;
Sa12.取处理后的集合SH中编号最大的半闲寄存器对SLO作为当前替换寄存器对,对当前替换寄存器对中不空闲的寄存器Rx中数据进行保存,转到步骤Sa13;
Sa13.将当前替换寄存器对中两个寄存器添加至替换寄存器集合中,转入执行步骤Sa14;
Sa14.确定替换方案rep为:使用步骤Sa7确定的替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将当前替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sa15.查找指令源操作数字段出口处所有非空闲寄存器对,非空闲寄存器对两个寄存器均不空闲的寄存器对,从查找到的所有非空闲寄存器对中去除满足寄存器对中有作为当前指令目标寄存器且在出口不空闲的寄存器,得到处理后的非空寄存器集合,转入执行步骤S a16;
Sa16.取非空寄存器集合中编号最大的寄存器对作为替换寄存器候选者并保存寄存器中数据,转入执行步骤Sa13。
本实施例中,使用第二修正模式(B或C模式)对目标操作中左位或右位寄存器进行修正的步骤包括:
Sb1.根据错误寄存器R的配对寄存器PRA得到对应的替换寄存器PRB,转到步骤Sb2;
Sb2.判断替换寄存器PRB是否在指令出口处空闲,如果是,转到步骤Sb3,否则转到步骤Sb5;
Sb3.将错误寄存器R添加至错误寄存器集合中,以及将替换寄存器PRB添加至替换寄存器集合中;
Sb4.确定替换方案rep为:使用替换寄存器PRB替换错误寄存器R,并在当前指令后插入1条数据传送指令以将替换寄存器PRB中的数据传送给错误寄存器R,转入进行数据更新操作;
Sb5.判断替换寄存器PRB是否在当前指令中已经是目标寄存器,如果是转入使用第一修正模式对错误寄存器R进行修正,否则转到步骤Sb6;
Sb6.保存替换寄存器PRB中数据,将错误寄存器R添加至错误寄存器集合中,转到Sb7;
Sb7.确定替换方案rep为:使用替换寄存器PRB替换错误寄存器R,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB中的数据传送给错误寄存器R,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
本实施例执行B或C类的第二修正模式时,优先寻找在指令出口处当前状态为空闲的寄存器作为要被替换的寄存器的替换寄存器,根据寄存器是否已经是目标寄存器还可以转化为A类的第一修正模式,可以对寄存器对中左位寄存器或右位寄存器修正时,减少需要在指令序列中插入的数据传送指令、访存指令,最终得到符合寄存器对使用规则的寄存器对。
本实施例中,使用第三修正模式(D模式)对目标操作数中任意一个寄存器进行修正的步骤包括:
Sc1.根据寄存器配对规则要求选取左位寄存器rL的替换寄存器PRB_L,转到步骤Sc2;
Sc2.判断替换寄存器PRB_L是否在指令的出口处空闲,如果是转到Sc3,否则转到步骤Sc5;
Sc3.将左位寄存器rL添加至错误使用寄存器集合中,替换寄存器PRB_L添加至替换寄存器集合中;
Sc4.确定替换方案rep为:使用替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给左位寄存器rL,转入进行数据更新操作;
Sc5.根据寄存器配对规则要求选取右位寄存器rR的替换寄存器PRB_R,转到步骤Sc6;
Sc6.判断替换寄存器PRB_R是否在指令的出口处空闲,如果是转到步骤Sc7,否则转到Sc9;
Sc7.将右位寄存器rR添加至错误使用寄存器集合中,替换寄存器PRB_R添加至替换寄存器集合中.,转入执行步骤S c8;
S c8.确定替换方案rep为:使用替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给右位寄存器rR,转入进行数据更新操作;
Sc9.判断替换寄存器PRB_L是否在当前指令中已经是目标寄存器,如果是,转入执行步骤S c12,否则转入执行步骤Sc10;
Sc10.将左位寄存器rL添加至错误使用寄存器集合中,以及将替换寄存器PRB_L添加至替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤S c11;
S c11.确定替换方案rep为:使用替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给左位寄存器rL,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sc12.判断替换寄存器PRB_R是否在当前指令中已经是目标寄存器,如果是,转入使用第一修正模式对错误使用寄存器R进行修正,否则转入执行步骤S c13;
S c13.将右位寄存器rR添加至错误使用寄存器集合中,替换寄存器PRB_R添加至替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤.S c14;
S c14.确定替换方案rep为:使用替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给右位寄存器rR,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
本实施例执行D类的第三修正模式时,先寻找在指令出口处当前状态为空闲的寄存器来替换寄存器对中的左位寄存器,在找不到的情况下,再寻找在指令出口处当前状态为空闲的寄存器来替换寄存器对中的右位寄存器,可以实现寄存器对中两寄存器符号不匹配的修正,最终得到符合使用规则的寄存器对。上述左、右寄存器处理的先后顺序也可以交换。
本实施例上述分配方法,能够自动处理某个单寄存器分配候选者在某些目标操作数寄存器对中位于左位但在另外一些目标操作数寄存器对中位于右位的情况,从而提升在目标操作数中使用变量方面的灵活性。
本实施例进行寄存器对分配时,具体将目标操作数涉及的寄存器对的分配分成两个阶段,一是普通单寄存器分配阶段,二是目标操作数寄存器对检查和修正阶段;
在普通单寄存器分配阶段,将目标操作数中的成对的寄存器分配候选者中的每一个都当作对应着单个物理寄存器的普通单寄存器分配候选者,采用与普通单寄存器分配候选者相同的寄存器分配方法,让它们与普通的单寄存器分配候选者一起参与寄存器分配;
在目标操作数寄存器对检查和修正阶段,假定指令可能有任意多个目标操作数,对于每一条指令,如果它至少有一个目标操作数涉及寄存器对,则对该指令的各目标操作数进行寄存器对合法性检查,对于不满足硬件关于寄存器对的使用规则的目标操作数中的寄存器对,先确定其所需的修正处理模式(A、B、C或D),再采用启发式优化方法将它们替换成符合规则要求的寄存器对,其中为指令序列中的每条指令进行下面的处理:
a)分析系统的各个寄存器和寄存器对在指令源操作数字段出口处的空闲状况,为各个寄存器对确定空闲类型;
b)从指令的第一个目标操作数开始遍历它的各个目标操作数,如果某个目标操作数需要进行修正处理,则按上述步骤确定的目标操作数修正处理模式进行相应的修正处理,其中在第一修正模式A时,按照指令的源操作数字段出口处的寄存器空闲情况和使用情况,按照优先级依次考虑空闲寄存器对、半空闲寄存器对、非空闲寄存器对的顺序依次寻找用于替换的寄存器对,直到找到一个寄存器偶对为止;在第二修正模式B或C时,优先寻找在指令出口处当前状态为空闲的寄存器作为要被替换的寄存器的替换寄存器,在第三修正模式D时,先寻找在指令出口处当前状态为空闲的寄存器来替换寄存器对中的左位寄存器,在找不到的情况下,再寻找在指令出口处当前状态为空闲的寄存器来替换寄存器对中的右位寄存器,上述、C、D三种模式时根据目标寄存器的状态还可以转换成修正模式A。
本实施例存储有计算机程序的计算机可读存储介质,计算机程序执行时实现上述的分配方法。
以下以在具体应用实施例中基于面向对象语言采用上述方法实现上述面向指令目标操作的寄存器对修正分配为例,对本发明进行进一步说明。
本发明方法涉及的实施内容可封装成一个目标操作数寄存器对修正分配类,把进行目标操作数寄存器对修正处理所需的数据都作为这个类的数据成员,所需的各子方法都作为这个类的成员函数。由于本发明方法是针对指令目标操作数寄存器对分配优化的问题,所以假定本方法所需的基本信息都已经准备好,主要有:
处理器体系结构的寄存器资源信息保存在相应的体系结构类对象中,包括能够出现在寄存器对中的寄存器的编号构成的集合、寄存器对与寄存器的映射关系、寄存器对的编号构成的集合等等。
指令的基本信息和目标操作数信息(包括指令所有目标操作数涉及的物理寄存器变量)保存在相应的指令类对象中。
指令的源操作数字段出口处活跃向量保存在活跃向量数组中。每条指令有一个源操作数字段出口活跃向量,从该向量可以获知代码已经使用的物理寄存器中哪些寄存器在该指令的源操作数字段出口处(也就是指令的目标操作数字段入口处)是活跃的。
本实施例具体定义有:
寄存器用例(RA):一个寄存器在指令中的某一次应用。一个寄存器在一条指令的不同目标操作数中只能有一个用例。
配对寄存器(PRA):与某个寄存器写在一对中的另外一个寄存器。例如,在“Rx:Ry”中,Rx是Ry的配对寄存器,反之Ry也是Rx的配对寄存器。
错误寄存器对:位于指令的目标操作数部分中,它所包含的两个寄存器在单寄存器分配阶段得到,但它们不满足连续编号的奇偶寄存器对这个规则的要求。
替换寄存器(PRB):用于替换指令某个目标操作数中的某个寄存器的另外一个寄存器。
左位寄存器:指位于要处理的寄存器对的左边的那个寄存器。例如,在“Rx:Ry”这个寄存器对中,Rx就是左位寄存器。
右位寄存器:指位于要处理的寄存器对的右边的那个寄存器。例如,在“Rx:Ry”这个寄存器对中,Ry就是右位寄存器。
替换方案(rep):修正指令序列中的某指令的一个目标操作数所需要对该指令以及指令序列进行的操作的描述。
以及定义数据结构有:
指令中最多可能出现的RA数量:由处理器指令集所决定的值。如果不能确定,可设置为一个较大的值,例如指令的位数。
指令中各目标操作数RA对应的寄存器对位置模式数组raPosModes:数组元素的下标代表RA在指令中的序号,值为该RA在其所在的目标操作数寄存器对中的位置模式。该数组是一个一维数组。
RA在寄存器对中的可能位置模式枚举集合:rapPosForOddReg(RA在寄存器对中是左位寄存器);rapNotInPair(RA没有在一个寄存器对中);rapPosForEvenReg(RA在寄存器对中是右位寄存器)。
寄存器对修正模式枚举集合:pstUnknown(表示未确定);pstBothPosModeError(表示两个RA对应的寄存器都不符合位置模式要求);pstLeftPosModeError(表示左边的RA对应的寄存器不符合位置模式要求);pstRightPosModeError(表示右边的RA对应的寄存器不符合位置模式要求);pstIllegalPair(表示两个寄存器的编号都符合位置模式对奇偶性的要求,但两者不连号);pstBothPosModeRight(表示一种过渡状态);pstCorrect(表示正确的寄存器对)。
寄存器空闲状态数组:每个通用寄存器在数组中对应一个元素,其值可以为true或false,分别表示空闲或非空闲。
错误寄存器集合ErrRegSet:由指令的所有目标操作数中被替换的寄存器构成的集合。
被保护寄存器集合SetBeProt:替换寄存器集合中需要保护其原有数据的那些寄存器构成的集合。
指令源操作数字段出口处空闲寄存器集合IdleRegSet:由在指令源操作数字段出口处空闲的那些寄存器的编号构成的集合。
指令源操作数字段出口处空闲寄存器对集合IdleRPSet:由在指令源操作数字段出口处空闲的那些寄存器对的编号构成的集合。
指令源操作数字段出口处半闲寄存器对集合HalfIdleRPSet:由在指令源操作数字段出口处只有其中一个寄存器空闲的那些寄存器对的编号构成的集合。
指令源操作数字段出口处非空闲寄存器对集合NonIdleRPSet:由在指令源操作数字段出口处其中的两个寄存器都不空闲的那些寄存器对的编号构成的集合。
总PRB集合:在对一条指令目标操作数处理的过程中用到的所有PRB构成的集合。
ProtRegs集合:对一条指令的所有目标操作数进行修正过程中发现的要保护其内容到存储器的那些寄存器构成的集合。
每条指令中每个目标操作数的寄存器对各对应一个修正处理模式(A、B、C、D),需要分析目标操作数中的寄存器对信息并确定其修正处理模式,该步骤需要在单寄存器分配后就要先完成,本实施例中实现指令的目标操作数寄存器对信息及修正处理模式分析的步骤包括:
从指令的第一个目标操作数开始,依次遍历指令的每一个目标操作数,如果目标操作数包含1个寄存器对,按如下情况进行处理:
如果其中的两个寄存器的编号满足寄存器偶对的规则要求,则将处理模式设置为pstCorrect。
如果其中的两个寄存器的编号都不满足位置模式对寄存器编号的要求(即本来应该要奇/偶号的寄存器,但实际得到的是偶/奇号寄存器),则将处理模式设置为pstBothPosModeError。
如果仅左位寄存器的编号不满足位置模式对寄存器编号的要求,则将处理模式设置为pstLeftPosModeError。
如果仅右位寄存器的编号不满足位置模式对寄存器编号的要求,则将处理模式设置为pstRightPosModeError。
如果两个寄存器都满足位置模式对奇偶编号的要求,但两者的编号不是相连的,则将处理模式设置为pstIllegalPair。
如图3所示,本实施例中,对一条指令进行目标操作数修正的步骤包括:
1)初始化针对指令进行目标操作数寄存器对修正的相关数据,包括分析指令源操作数字段出口处的寄存器空闲状态和寄存器对的空闲状态。
2)判断指令是否还有要修正的目标操作数,如果没有跳转到第7)步执行,如果有则执行下一步。
3)切换到下一个要处理的目标操作数RA对(即寄存器对)。
4)初始化处理1个目标操作数寄存器对时所需的相关数据。
5)修正当前目标操作数,即根据目标操作数的情况,替换其中的RA对中的寄存器。具体如图2所示,图中每一条路径对应一种处理模式。
6)跳转到第2)步;
7)重新分析并更新当前指令的目标操作数涉及的变量。
8)添加将ProtRegs中的寄存器的内容保护到存储器的指令到前插指令队列首,加相应的恢复其内容的指令到原寄存器的指令到后插指令队列尾。
9)将所有的前插指令插入到当前被处理指令之前,将所有的后插指令插入到当前被处理指令之后。
指令源操作数字段出口处的寄存器空闲状态分析,目的是获取指令源操作数字段出口处的各个寄存器是否空闲的状态信息,为后续处理提供必要的空闲状态标志及空闲寄存器集合。分析过程中要用到已知数据流分析的结果中关于活跃向量的内容。在每条指令对应的源操作数字段出口活跃向量中,函数代码中用到的每个变量各占1位,如果某个变量在该指令源操作数字段出口处活跃,则对应的位的值为true,否则为false。
本实施例中,实现指令源操作数字段出口处的寄存器空闲状态分析的具体步骤为:遍历体系结构中能够出现在寄存器对中的所有的通用寄存器,对每个寄存器,进行如下处理:如果寄存器在指令源操作数字段出口活跃向量中对应了1位且这一位的值为true,则设置为不空闲,否则,设置为空闲。在遍历完成之后,将IdleRegSet清空,并将遍历过程中所确定的空闲寄存器的编号都添加到IdleRegSet中。
本实施例中,实现指令源操作数字段出口处的寄存器对空闲状态分析的步骤包括:
先将IdleRPSet、HalfIdleRPSet、NonIdleRPSet三个集合都清空,然后遍历体系结构的所有寄存器对,对每个寄存器对进行下面的处理:
如果寄存器对中的两个寄存器都空闲(即都在IdleRegSet中),则将寄存器对的编号添加到IdleRPSet中。
如果寄存器对中的两个寄存器都不空闲(即都不在IdleRegSet中),则将寄存器对的编号添加到NonIdleRPSet中。
如果寄存器对中的两个寄存器只有一个空闲(即只有一个在IdleRegSet中),则将寄存器对的编号添加到HalfIdleRPSet中。
如图4所示,本实施例中第一修正模式A的详细步骤为:
S1:将寄存器对中的两个寄存器rL和rR都添加到空集合ErrRegSet中,然后转到S2。
S2:判断IdleRPSet是否有空闲寄存器对的编号,如果有转到S3,否则转到S8;
S3:排除IdleRPSet空闲对中满足如下条件的寄存器对:包含当前指令的某个目标寄存器,且这些目标寄存器在指令的出口不空闲;
S4:判断IdleRPSet中是否仍有剩余的寄存器对,如果有转到S5,否则转到S8;
S5:从IdleRPSet中挑选编号最大空闲对作为用来替换的RP,转到S6;
S6:将RP内的两个寄存器的编号添加到集合SetPrb中,转到S7;
S7:确定替换方案rep为:用RP中的寄存器替换被处理目标操作数中的寄存器对ERP,并在当前指令后要插入2条数据传送指令用于将RP中寄存器的数据传送给ERP中相应的寄存器,转到R7对应的过程去继续处理;
S8:判断HalfIdleRPSet是否有半空闲寄存器对的编号,如果有转到S9,否则转到S16;
S9:用所有SLO半空闲对集合构成SH,转到S10;
S10:从SH中删除这样的寄存器对:两个寄存器中的任意一个是指令的目标寄存器,且该寄存器在指令的出口处活跃,转到S11;
S11:判断SH是否为非空集合,如果是转到S12,否则转到S16;
S12:取SH中编号最大的半闲对为RP,令其中不空闲的那个为Rx,转到S13;
S13:将Rx添加到集合NeedProtSet中,转到S14;
S14:将RP中的两个寄存器的编号添加到集合SetPrb中,转到S15;
S15:确定替换方案rep为:用RP中的寄存器替换被处理目标操作数中的寄存器对ERP,并在当前指令后要插入2条数据传送指令用于将RP中寄存器的数据传送给ERP中相应的寄存器,转到R6对应的子过程去继续处理;
S16:用NonIdleRPSet中的内容构成集合SH,转到S17;
S17:从SH中删除这样的寄存器对的编号:寄存器对中有作为当前指令目标寄存器,且在出口不空闲的寄存器,转到S18;
S18:取SH中编号最大的对作为RP.转到S19;
S19:将RP中的两个寄存器的编号添加到集合NeedProtSet中,转到S14。
如图5所示,本实施例中执行第二修正模式B或C的详细步骤为:
S1:令错误寄存器为R,如果是处理模式2,则R为左位寄存器,如果是处理模式3,则R为右位寄存器,根据R的配对寄存器PRA得到R的替换寄存器PRB,转到S2;
S2:判断PRB是否在指令出口处空闲,如果是转到S3,否则转到S5;
S3:将R添加到集合ErrSet,将PRB添加到集合SetPrb,转到S4;
S4:确定替换方案rep为:用PRB替换R,并在当前指令后要插入1条数据传送指令用于将PRB中的数据传送给R,转到R7对应的子过程去继续处理。
S5:判断PRB是否在本指令中已经是目标寄存器,如果是修改为第一袖子模式A,转到R1对应的子过程去继续处理,否则,转到S6;
S6:将PRB添加到要保护现场的寄存器集合NeedProtSet中,将R添加到ErrSet中,将PRB添加到集合SetPrb,转到S7;
S7:确定替换方案rep为:用PRB替换R,并在当前指令后要插入1条数据传送指令用于将PRB中的数据传送给R,转到R6对应的子过程去继续处理。
如图6所示,本实施例中执行第三修正模式D下的详细步骤为:
S1:根据寄存器配对规则要求,分析左位寄存器rL的PRB,并令该PRB为PRB_L,然后转到S2。
S2:判断是否PRB_L在指令的出口处空闲,如果是转到S3,否则转到S5;
S3:将rL添加到集合ErrSet,将PRB_L添加到集合SetPrb,转到S4;
S4:确定替换方案rep为:用PRB_L替换rL,并在当前指令后要插入1条数据传送指令用于将PRB_L中的数据传送给rL,转到R7对应的子过程去继续处理。
S5:根据寄存器配对规则要求,分析右位寄存器rR的PRB,并令该PRB为PRB_R,然后转到S6;
S6:判断是否PRB_R在指令的出口处空闲,如果是转到S7,否则转到S9;
S7:将rR添加到集合ErrSet,将PRB_R添加到集合SetPrb,转到S8;
S8:确定替换方案rep为:用PRB_R替换rR,并在当前指令后要插入1条数据传送指令用于将PRB_R中的数据传送给rR,转到R7对应的子过程去继续处理。
S9:判断PRB_L是否在本指令中已经是目标寄存器,如果是转到S12,否则,转到S10;
S10:将rL添加到集合ErrSet,将PRB_L添加到集合SetPrb和集合NeedProtSet,转到S11;
S11:确定替换方案rep为:用PRB_L替换rL,并在当前指令后要插入1条数据传送指令用于将PRB_L中的数据传送给rL,转到R6对应的子过程去继续处理;
S12:判断PRB_R是否在本指令中已经是目标寄存器,如果是修改为第一修正模式A,转到R1对应的子过程去继续处理,否则转到S13;
S13:将rR添加到集合ErrSet,将PRB_R添加到集合SetPrb和集合NeedProtSet,转到S14;
S14:确定替换方案rep为:用PRB_R替换rR,并在当前指令后要插入1条数据传送指令用于将PRB_R中的数据传送给rR,转到R6对应的子过程去继续处理。
如图7所示,上述R6代表的子过程步骤为:在S1步骤中将NeedProtSet集合中的内容添加到ProtRegs中,然后转到R7对应的过程去继续处理。
在寄存器替换方案生成之后,本实施例还要进行数据的更新(R7),如图8所示,进行数据更新的R7子过程的步骤如下:
S1:修改ErrRegSet内的各寄存器在指令源操作数字段出口处的空闲状态,对于ErrRegSet中的任意一个寄存器,如果在指令中不再把它作为目标数据,并且在指令的出口处它也不活跃,则将其在指令源操作数字段出口处的活跃向量中所对应的位的值改成false,ErrRegSet内的所有寄存器处理完毕后,转到S2;
S2:在指令源操作数字段出口处的活跃向量中将SetPrb内的各寄存器设置为活跃,并将它们添加到指令的总PRB集合,然后转到S3;
S3:根据更新后的指令源操作数字段出口处活跃向量,更新所有寄存器和寄存器对的空闲状态,然后转到S4;
S4:按rep的内容,添加数据传送指令到前插指令队列尾,记录各要被替换的RA对应的PRB,然后转到S5;
S5:按rep的内容,在指令中替换相应的RA,记录各要被替换的RA对应的PRB。设置RA相应的标识为已替换状态。:
上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。
Claims (10)
1.一种面向指令目标操作数的寄存器对分配方法,其特征在于,步骤包括:
S1.初始分配:分别将待处理指令中包括成对寄存器的所有目标操作数所包含的两个符号寄存器均作为单寄存器分配候选者进行独立的寄存器分配;
S2.修正分配:依次获取各条指令进行寄存器修正分配,如果指令中存在至少一个以上的目标操作数涉及寄存器对,对指令中各目标操作数依次进行寄存器对合法性检查,并根据检查结果将寄存器对中不符合使用规则的错误使用寄存器使用替换寄存器进行替换,所述替换寄存器根据各寄存器、寄存器对在指令操作数字段出口处的空闲状态进行选取,并使得每个所述替换寄存器使用后不再作为相同指令中其他目标操作数的替换寄存器候选者,以及被替换出来的寄存器不作为其他被替换寄存器的替换寄存器候选者。
2.根据权利要求1所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述步骤S1中,具体将目标操作数中成对的寄存器分配候选者中的每一个都当作对应着单个物理寄存器的独立单寄存器分配候选者,并与其他单寄存器分配候选者一起采用相同的寄存器分配方式分配各自的物理寄存器。
3.根据权利要求1所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述步骤S2的步骤包括:
S21.在每条指令处理前获取各寄存器以及寄存器对在指令操作数字段出口处的空闲状态;
S22.对每条指令进行处理时,从指令的第一个目标操作数开始遍历各个目标操作数,如果目标操作数包含一个寄存器对,对该寄存器对进行合法性检查,判断该寄存器对中两个寄存器是否符合寄存器对使用规则,若不符合,判定需要修正,转入执行步骤S23;
S23.判断需要修正的寄存器对中错误使用寄存器的位置,根据所述错误使用寄存器的位置以及各寄存器在指令操作数字段出口处的空闲状态选取替换寄存器对当前各所述错误使用寄存器进行修正,优先选取在指令操作数字段出口处空闲的寄存器作为所述替换寄存器。
4.根据权利要求3所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述步骤S23的步骤包括:判断目标操作数中寄存器对是否是由两个连号的奇偶号寄存器构成,如果目标操作数寄存器对中两个寄存器序号均不符合,则判定为需要全部替换目标操作数寄存器对的两个寄存器,使用第一修正模式对目标操作数中两个寄存器进行修正;如果目标操作数寄存器对中的左位寄存器或右位寄存器序号不符合,则判定需要替换目标操作数寄存器对中的左位寄存器或右位寄存器,使用第二修正模式对目标操作中左位或右位寄存器进行修正;如果目标操作数寄存器对中的两个寄存器序号不匹配,则判定需要替换目标操作数寄存器对中的任意一个寄存器,使用第三修正模式对目标操作数中任意一个寄存器进行修正。
5.根据权利要求4所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述步骤S23中对每条指令的处理步骤具体包括:
S231.对指令进行目标操作数寄存器对修正的数据进行初始化,包括获取指令源操作数字段出口处的寄存器空闲状态和寄存器对的空闲状态;
S232.判断指令是否还有要修正的目标操作数,如果没有转到步骤S236,否则执行步骤S233;
S233.切换到下一个要处理的目标操作数寄存器对;
S234.初始化处理1个目标操作数寄存器对时所需的数据;
S235.选取所需替换寄存器修正当前目标操作数;
S236.更新当前指令的目标操作数涉及的变量;
S237.添加将所有需要保护数据的替换寄存器中的内容保护到寄存器的指令到前插指令队列首,加恢复内容的指令到原寄存器的指令到后插指令队列尾;
S238.将所有的前插指令插入到当前被处理指令之前,将所有的后插指令插入到当前被处理指令之后。
6.根据权利要求4所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述使用第一修正模式对目标操作数中两个寄存器进行修正时,根据指令的源操作数字段出口处的寄存器空闲状态以及使用状态查找一个用于替换的寄存器对,使用查找到的寄存器对分别替换目标操作数中两个错误使用寄存器;所述查找一个用于替换的寄存器对的步骤包括:
a)从所有满足使用规则的合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口处寄存器对中的两个寄存器都空闲,若查找到转入执行步骤d),若未查找到转入执行步骤b);
b)从所述合法寄存器对构成的集合中查找一个寄存器对满足:在指令的源操作数字段出口上寄存器对中的一个寄存器不空闲、另外一个空闲,若查找到转入执行步骤d),若未查找到转入执行步骤c);
c)从所述合法寄存器对构成的集合中查找一个寄存器对:在指令的源操作数字段出口处寄存器对中的两个寄存器都不空闲,查找到后转入执行步骤d);
d)由当前查找到的寄存器对作为所述用于替换的寄存器对输出。
7.根据权利要求4所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述使用第一修正模式对目标操作数中两个寄存器进行修正的步骤包括:
Sa1.将需要修正的寄存器对中左寄存器rL和右寄存器rR都添加到错误使用寄存器ErrRegSet中;
Sa2.判断指令源操作数字段出口处是否有空闲寄存器对,如果是转入执行步骤Sa3,否则转入步骤Sa8;
Sa3.排除所有空闲寄存器对中满足包含当前指令的目标寄器存且该目标寄存器在指令的出口不空闲的空闲寄存器对,得到排除后的空闲寄存器对集合;
Sa4.判断所述排除后的空闲寄存器对集合是否仍有剩余寄存器对,如果有,转入执行步骤Sa5,否则转入执行步骤Sa8;
Sa5.从所述排除后的空闲寄存器对集合中挑选编号最大的空闲寄存器对作为用来替换的替换寄存器对,转入执行步骤Sa6;
Sa6.将所述Sa5确定的替换寄存器对中两个寄存器加入所述替换寄存器集合中,转入执行步骤Sa7;
Sa7.确定替换方案为:使用步骤Sa5确定的所述替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将所述替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,转入进行数据更新操作;
Sa8.判断指令源操作数字段出口处是否有半空闲寄存器对SLO,所述半空闲寄存器对为一个寄存器空闲、另一个不空闲,如果有,转入执行步骤Sa9,否则转入执行步骤Sa14;
Sa9.获取所有半空闲对SLO构成集合SH,转到步骤Sa10;
Sa10.从所述集合SH中去除满足以下条件的寄存器对:两个寄存器中的任意一个是指令的目标寄存器且该寄存器在指令的出口处活跃,得到处理后的集合SH,转入执行步骤Sa11;
Sa11.判断所述处理后的集合SH是否为非空集合,如果是,转入执行步骤S a12,否则转入执行步骤Sa15;
Sa12.取所述处理后的集合SH中编号最大的半闲寄存器对SLO作为当前替换寄存器对,对当前替换寄存器对中不空闲的寄存器Rx中数据进行保存,转到步骤Sa13;
Sa13.将当前替换寄存器对中两个寄存器添加至所述替换寄存器集合中,转入执行步骤Sa14;
Sa14.确定替换方案rep为:使用所述步骤Sa7确定的替换寄存器对替换需要修正的目标操作数中的寄存器对,并在当前指令后插入2条数据传送指令以将当前替换寄存器对中寄存器的数据传送给需要修正的寄存器对中相应的寄存器,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sa15.查找指令源操作数字段出口处所有非空闲寄存器对,所述非空闲寄存器对两个寄存器均不空闲的寄存器对,从查找到的所有非空闲寄存器对中去除满足寄存器对中有作为当前指令目标寄存器且在出口不空闲的寄存器,得到处理后的非空寄存器集合,转入执行步骤S a16;
Sa16.取所述非空寄存器集合中编号最大的寄存器对作为替换寄存器候选者并保存寄存器中数据,转入执行步骤Sa13。
8.根据权利要求4~7中任意一项所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述使用第二修正模式对目标操作中左位或右位寄存器进行修正的步骤包括:
Sb1.根据错误寄存器R的配对寄存器PRA得到对应的替换寄存器PRB,转到步骤Sb2;
Sb2.判断所述替换寄存器PRB是否在指令出口处空闲,如果是,转到步骤Sb3,否则转到步骤Sb5;
Sb3.将错误寄存器R添加至错误寄存器集合中,以及将所述替换寄存器PRB添加至所述替换寄存器集合中;
Sb4.确定替换方案rep为:使用所述替换寄存器PRB替换所述错误寄存器R,并在当前指令后插入1条数据传送指令以将所述替换寄存器PRB中的数据传送给所述错误寄存器R,转入进行数据更新操作;
Sb5.判断所述替换寄存器PRB是否在当前指令中已经是目标寄存器,如果是转入使用第一修正模式对所述错误寄存器R进行修正,否则转到步骤Sb6;
Sb6.保存所述替换寄存器PRB中数据,将错误寄存器R添加至错误寄存器集合中,转到Sb7;
Sb7.确定替换方案rep为:使用所述替换寄存器PRB替换所述错误寄存器R,并在当前指令后要插入1条数据传送指令以将所述替换寄存器PRB中的数据传送给所述错误寄存器R,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
9.根据权利要求4~7中任意一项所述的面向指令目标操作数的寄存器对分配方法,其特征在于,所述使用第三修正模式对目标操作数中任意一个寄存器进行修正的步骤包括:
Sc1.根据寄存器配对规则要求选取左位寄存器rL的替换寄存器PRB_L,转到步骤Sc2;
Sc2.判断所述替换寄存器PRB_L是否在指令的出口处空闲,如果是转到Sc3,否则转到步骤Sc5;
Sc3.将所述左位寄存器rL添加至错误使用寄存器集合中,所述替换寄存器PRB_L添加至所述替换寄存器集合中;
Sc4.确定替换方案rep为:使用所述替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给所述左位寄存器rL,转入进行数据更新操作;
Sc5.根据寄存器配对规则要求选取右位寄存器rR的替换寄存器PRB_R,转到步骤Sc6;
Sc6.判断所述替换寄存器PRB_R是否在指令的出口处空闲,如果是转到步骤Sc7,否则转到Sc9;
Sc7.将所述右位寄存器rR添加至错误使用寄存器集合中,所述替换寄存器PRB_R添加至所述替换寄存器集合中.,转入执行步骤S c8;
S c8.确定替换方案rep为:使用所述替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给所述右位寄存器rR,转入进行数据更新操作;
Sc9.判断所述替换寄存器PRB_L是否在当前指令中已经是目标寄存器,如果是,转入执行步骤Sc12,否则转入执行步骤Sc10;
Sc10.将所述左位寄存器rL添加至错误使用寄存器集合中,以及将所述替换寄存器PRB_L添加至所述替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤Sc11;
Sc11.确定替换方案rep为:使用所述替换寄存器PRB_L替换需要修正的左位寄存器rL,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_L中的数据传送给所述左位寄存器rL,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作;
Sc12.判断所述替换寄存器PRB_R是否在当前指令中已经是目标寄存器,如果是,转入使用所述第一修正模式对错误使用寄存器R进行修正,否则转入执行步骤S c13;
S c13.将所述右位寄存器rR添加至错误使用寄存器集合中,所述替换寄存器PRB_R添加至所述替换寄存器集合以及需要保护寄存器数据的集合中,转入执行步骤.S c14;
S c14.确定替换方案rep为:使用所述替换寄存器PRB_R替换需要修正的右位寄存器rR,并在当前指令后要插入1条数据传送指令以将替换寄存器PRB_R中的数据传送给所述右位寄存器rR,对其中需要保护的寄存器进行数据保存后,转入进行数据更新操作。
10.一种存储有计算机程序的计算机可读存储介质,所述计算机程序执行时实现如权利要求1~9中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910411700.2A CN110187883B (zh) | 2019-05-17 | 2019-05-17 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910411700.2A CN110187883B (zh) | 2019-05-17 | 2019-05-17 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110187883A CN110187883A (zh) | 2019-08-30 |
CN110187883B true CN110187883B (zh) | 2022-12-06 |
Family
ID=67716610
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910411700.2A Active CN110187883B (zh) | 2019-05-17 | 2019-05-17 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110187883B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111324354B (zh) * | 2019-12-27 | 2023-04-18 | 湖南科技大学 | 一种融合寄存器对需求的寄存器选择方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0649085A1 (en) * | 1993-10-18 | 1995-04-19 | Cyrix Corporation | Microprocessor pipe control and register translation |
CN105912304A (zh) * | 2016-03-31 | 2016-08-31 | 中国人民解放军国防科学技术大学 | 向量vliw体系结构图着色寄存器分组分配方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103268223B (zh) * | 2013-04-26 | 2016-06-29 | 深圳中微电科技有限公司 | 在编译过程中改善乘加类指令执行性能的方法 |
-
2019
- 2019-05-17 CN CN201910411700.2A patent/CN110187883B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0649085A1 (en) * | 1993-10-18 | 1995-04-19 | Cyrix Corporation | Microprocessor pipe control and register translation |
CN105912304A (zh) * | 2016-03-31 | 2016-08-31 | 中国人民解放军国防科学技术大学 | 向量vliw体系结构图着色寄存器分组分配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110187883A (zh) | 2019-08-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9697004B2 (en) | Very-long instruction word (VLIW) processor and compiler for executing instructions in parallel | |
US20080141229A1 (en) | Processor, program conversion apparatus, program conversion method, and computer program | |
US7028286B2 (en) | Methods and apparatus for automated generation of abbreviated instruction set and configurable processor architecture | |
US20080005722A1 (en) | Compiling device, compiling method and recording medium | |
JP2500079B2 (ja) | プログラムの最適化方法及びコンパイラ・システム | |
US6925639B2 (en) | Method and system for register allocation | |
US5577256A (en) | Data driven type information processor including a combined program memory and memory for queuing operand data | |
US7376818B2 (en) | Program translator and processor | |
CN110187883B (zh) | 一种面向指令目标操作数的寄存器对分配方法及存储介质 | |
EP0947922B1 (en) | Compiler | |
CN110187882B (zh) | 一种面向指令源操作数的寄存器对分配方法及存储介质 | |
US7130989B2 (en) | Processor adapted to receive different instruction sets | |
US20220113972A1 (en) | Microprocessor, and operation method therefor | |
US8146063B2 (en) | Translation of a series of computer instructions | |
CN111324354B (zh) | 一种融合寄存器对需求的寄存器选择方法 | |
US20040025151A1 (en) | Method for improving instruction selection efficiency in a DSP/RISC compiler | |
JP2020077333A (ja) | 演算処理装置および演算処理装置の制御方法 | |
EP0180077B1 (en) | A data processing machine for compiling computer programs | |
US6801995B1 (en) | Method for optimally encoding a set of instruction codes for a digital processor having a plurality of instruction selectable resource types and an associated optimized set of instruction codes | |
JP2002073346A (ja) | コンパイラ,記録媒体,プログラム変換装置,プログラム変換方法及びマイクロコンピュータ | |
US20040162965A1 (en) | Information processing unit | |
US20230367570A1 (en) | Information processing device and compiler method | |
CN109189477B (zh) | 一种面向多上下文粗粒度数据流结构的指令发射控制方法 | |
US7200739B2 (en) | Generation of modified command sequence from original command by feeding back for subsequent modification based on decode control signal | |
CN117492836A (zh) | 一种针对可变长向量体系结构的数据流分析方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |