CN1223402A - 在优化中能减少中断处理的编译器及其优化方法 - Google Patents
在优化中能减少中断处理的编译器及其优化方法 Download PDFInfo
- Publication number
- CN1223402A CN1223402A CN 99100114 CN99100114A CN1223402A CN 1223402 A CN1223402 A CN 1223402A CN 99100114 CN99100114 CN 99100114 CN 99100114 A CN99100114 A CN 99100114A CN 1223402 A CN1223402 A CN 1223402A
- Authority
- CN
- China
- Prior art keywords
- function
- register
- called
- mentioned
- controlled table
- 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.)
- Pending
Links
Images
Abstract
一种编译器,包括:函数使用寄存器控制表(50),函数使用寄存器提取单元(60),用于汇总被中断函数所调用的被调用函数的使用寄存器及将汇总的寄存器重新寄存在函数使用寄存器控制表(50)中作为中断函数使用寄存器的函数使用寄存器汇总单元(70)、和用于参照函数使用寄存器控制表(50)、在中间代码中加入中断函数使用寄存器保存/返回代码以生成和提供汇编程序文件的输出单元(80)。
Description
本发明涉及一种将源程序翻译成目标程序的编译器及其优化方法,更具体地,涉及一种能减少中断处理的编译器及其优化方法。
对于要设计成在其体系中具有中断处理功能的编译器来说,它必须能在编译时间内处理以上中断。通常,在器件的中断事件中的例程分支亦即中断功能被设计为在源程序中描述,因此,该器件能够处理上述中断处理功能。
在源程序执行过程中,中断功能的分支并不规律。为保护在分支前已被使用的寄存器中的内容,可能被用到的寄存器中的全部内容都必须在开始中断功能前保存起来,并且在完成中断功能后,被保存的寄存器的内容必须返回。
关于这类常规技术,例如在日本专利未决公开(kokai)号为Heisei2-257224中公开的器件“连接编辑处理器”(Linkage Edit Processor)。所公开的一连接编辑处理器当用于功能调用部分的寄存器(调用寄存器)与用于功能被调用部分的寄存器(被调用寄存器)彼此不相符时,在没有递归调用的情况下,删除用于指示寄存器保存/返回的冗余指令。这样,编辑处理器便减少了代码数量,缩短了源程序执行时间,即进行了优化。
在正常功能调用时,这种编辑处理器优化方法要求有一代码,它在功能调用指令前提供一调用寄存器的保存指令,以及在功能调用指令后提供一被保存寄存器的返回指令,以便在被调用部分不损坏调用寄存器中的内容。借助一寄存调用函数信息和使用寄存器信息的表,这种方法删除了不必要的、在被调用部分未被使用的寄存器保存/返回代码,也参照上表,删除了在调用部分函数的被保存/返回的寄存器代码。
图7显示了一常规编译器的结构实例,它与公开号为2-257224的专利公开的编辑处理使用同样的优化方法删除不必要寄存器中的保存/返回代码。图7所示的编译器由以下组成:输入单元701,用于接收源程序来完成词法分析;句法分析单元702,用于在由词法阵列分析出句法之后生成句法树;优化单元703,用于优化句法树;代码生成单元704,用于基于优化的句法树生成中间代码712;函数使用寄存器控制表705,用于寄存调用函数和使用寄存器的信息;函数使用寄存器提取单元706,在分析中间代码712后,在函数使用寄存器控制表705中寄存每个函数调用函数名和使用寄存器;和输出单元708,用于提供汇编程序文件713,该文件具有在被调用部分未被使用的、且以后被删除的寄存器的保存/返回代码。
参照图7,将易于理解在公开号为2-257224的专利中公开的常规的编译器优化方法能在编译器中被实现,即在通用编译器的代码生成单元704之后额外提供输出单元708,参照函数使用寄存器控制表705和向该表提供信息的寄存器函数提取单元706,以删除在被调用部分未使用的寄存器的保存/返回代码,删除在调用部分函数的被保存/返回寄存器。
现在,参照图7和图6来描述编译器的常规优化方法,图6显示了源程序711的一实例。参照相应于由代码生成单元704所提供的中间代码712的部分,在图6所示的源程序中,在调用存在于函数f6中的函数f5之前,有一被函数f6所用的寄存器“g”、“h”的保存代码;在调用函数f5之后,有一被函数f6所用的寄存器“g”、“h”的返回代码。
根据输入中间代码712,函数使用寄存器提取单元706识别函数f6的定义,并将由函数f6所调用的函数名f5、被函数f6所使用的寄存器名“g”、“h”寄存到函数使用寄存器控制表705中。接下来,它识别函数f5的定义,并将被函数f5所使用的寄存器名“f”寄存到函数使用寄存器控制表705中。
参照函数使用寄存器控制表705,输出单元708识别在被函数f6所使用的寄存器“g”、“h”和被函数f5所使用的寄存器“f”之间没有重复的寄存器名。然后,在函数f5的调用指令之前的寄存器“g”、“h”的保存代码和在函数f5的调用指令之后的寄存器“g”、“h”的返回代码被删除,然后提供汇编程序文件713。
然而,上述编译器的常规优化方法不能删除来自一程序某一地址函数分支所用的寄存器的保存/返回代码,比如一中断函数。
这就是在调用部分不具有函数的中断函数在设备中断发生时不会损坏所用寄存器内容的原因。尽管在相应于函数被调用部分的中断函数头处必须提供寄存器保存指令,并在中断函数的结尾处提供其返回指令,在调用部分还必须提供函数使用寄存器信息,以便删除这些保存/返回代码。因此,不能删除不必要的已保存/返回寄存器。
再回到图6和图7,由于函数f6是一个中断函数,保存寄存器和返回寄存器分别在函数f6的开头和结尾处完成,并且在一个非常中断发生时所使用的寄存器未被清零。因此,所有的寄存器都在函数f6的开头被保存,所有的寄存器都在函数f6的结尾返回。
根据函数使用寄存器控制表705,常规的输出单元708从调用寄存器保存/返回代码中删除在被调用部分未使用的寄存器保存/返回代码。因此,在函数f6的开头所有的寄存器保存代码和在函数f6的结尾所有的寄存器返回代码不能被删除。
如上所述,常规的编译器和常规的优化方法存在着缺陷,即在程序某一地址的函数分支(如中断函数)中,不能删除寄存器的保存/返回代码。
为解决上述常规技术中的缺陷,本发明的一个目的就是提供一编译器及其优化方法,它通过在中断函数代码输出时删除不必要的寄存器保存/返回代码来提高处理效率。
根据本发明的第一方面,读源程序以便完成词法分析和句法分析、产生中间代码、增加函数所用寄存器的保存/返回代码、由此产生汇编程序文件的编译器由以下构成:
函数使用寄存器控制表,用于寄存在源程序内部的每一函数所用寄存器信息和被函数调用的调用函数信息;
函数使用寄存器提取装置,用于在分析中间代码后提取在每个函数中所用的寄存器和调用函数名,并将使用寄存器和调用函数名寄存在函数使用寄存器控制表中;
函数使用寄存器汇总装置,用于参照含有函数使用寄存器提取装置所寄存信息的函数使用寄存器控制表,汇总被中断函数所调用的函数所用的寄存器,并在函数使用寄存器控制表中重新寄存汇总后的寄存器作为中断函数使用寄存器;和
输出装置,用于参照含有函数使用寄存器汇总装置汇总的寄存器的函数使用寄存器控制表,在中间代码中增加中断函数使用寄存器的保存/返回代码,以便产生和提供汇编程序文件。
在优选的结构中,函数使用寄存器控制表包括用于寄存函数名的函数名空间、用于寄存函数使用寄存器名的使用寄存器空间、以及用于寄存函数所调用的被调用函数名的被调用函数空间。
在另一优选的结构中,使用寄存器函数汇总装置在每个函数中顺序读出已被寄存在函数使用寄存器控制表中的信息,以便判断是否存在被函数所调用的被调用函数,并在存在被函数所调用的被调用函数时,该装置从函数使用寄存器控制表中删除被调用函数,从函数使用寄存器控制表中读出被调用函数寄存器信息,并将被调用函数使用寄存器与调用函数使用寄存器结合起来。
在另一优选的结构中,使用寄存器函数汇总装置在每个函数中顺序读出己被寄存在函数使用寄存器控制表中的信息,以便判断是否存在被函数所调用的被调用函数,并在存在被函数所调用的被调用函数时,该装置从函数使用寄存器控制表中删除该被调用函数,从函数使用寄存器控制表中读出被调用函数寄存器信息,并判断是否存在被这一函数进一步调用的被调用函数,当存在被这一被调用函数所进一步调用的被调用函数时,该装置递归式地重复删除被调用函数和读出这一被调用函数中信息的操作,当不再存在被所提及的函数所调用的被调用函数时,该装置将所提及函数的使用寄存器与调用函数(即所提及函数的调用部分)的使用寄存器结合起来。
在另一优选的结构中,对于在中间代码内的中断函数,输出装置提供中断函数本身,在中断函数本身之前提供中断函数使用寄存器保存代码,并在中断函数本身之后提供中断函数使用寄存器返回代码,而
对于除中断函数之外的别的函数,该装置提供函数本身。
根据本发明的第二方面,在编译器中读源程序以便完成词法分析和句法分析、产生中间代码、并加入在函数中使用寄存器的保存/返回代码、由此产生一汇编程序文件的优化方法由以下步骤构成:
在分析中间代码后提取使用寄存器和被调用函数名,并将每一函数的使用寄存器和调用函数名寄存于函数使用寄存器控制表中;
参照在使用寄存器寄存步骤中在函数使用寄存器控制表里所寄存的信息,汇总被中断函数所调用的函数中使用的寄存器,并将汇总的寄存器作为中断函数使用寄存器重新寄存在函数使用寄存器控制表中;和
参照在使用寄存器汇总步骤中已将使用寄存器汇总的函数使用寄存器控制表,在中间代码中加入中断函数使用寄存器的保存/返回代码,以便生成和提供汇编程序文件。
在优选的结构中,每个函数使用寄存器汇总步骤进一步包括:第一步,在每个函数中顺序读出在函数使用寄存器控制表中已被寄存的信息,以便判断是否存在被函数调用的被调用函数;第二步,当存在被函数调用的被调用函数时,从函数使用寄存器控制表中删除被调用函数,从函数使用寄存器控制表中读出被调用函数的寄存器信息,并将被调用函数的使用寄存器和调用函数的使用寄存器结合起来。
在另一优选的结构中,每个函数使用寄存器汇总步骤进一步包括:第一步,在每个函数中顺序读出在函数使用寄存器控制表中已被寄存的信息,以便判断是否存在被函数调用的被调用函数;第二步,当存在被函数调用的被调用函数时,从函数使用寄存器控制表中删除被调用函数,并判断是否存在被该被调用函数所进一步调用的被调用函数;第三步,当存在被上面提及的被调用函数所进一步调用的被调用函数时,递归地重复删除被调用函数和读出关于该被调用函数信息的操作;第四步,当不再存在被所提及的函数所调用的被调用函数时,将所提及函数的使用寄存器与调用函数(即对所提及函数的调用部分)的使用寄存器结合起来。
在另一优选的结构中,输出步骤包括判断在中间代码内的函数是否为中断函数这一步;和
对于中断函数,输出步骤还包括:在中断函数本身之前提供中断函数使用寄存器的保存代码的步骤;提供中断函数本身的步骤;和在中断函数本身之后提供中断函数使用寄存器返回代码的步骤。
通过以下给出的详细描述,本发明的其它目的、特征和优点将更为清楚。
通过以下给出的描述和本发明优选实施例的附图,本发明将被更完全地理解。然而,该优选实施例不能作为对本发明的限定,而只是为了用作解释和理解本发明。
在附图中:
图1是一方框图,显示了根据本发明实施例的编译器的结构;
图2是一流程图,显示了根据本实施例的操作;
图3A是一流程图,显示了根据本实施例进行优化的详细操作,以及函数使用寄存器提取单元的操作;
图3B是一流程图,显示了根据本实施例进行优化的详细操作,以及函数使用寄存器汇总单元的操作;
图3C是一流程图,显示了根据本实施例进行优化的详细操作,以及由函数使用寄存器汇总单元进行的函数使用寄存器汇总处理的操作;
图4是一流程图,显示了根据本实施例进行优化的详细操作,以及一输出单元的操作;
图5显示了函数使用寄存器控制表中内容的一例子;
图6显示了源程序的一例子;
图7显示了常规编译器的结构。
以下将参照附图对本发明优选的实施例给予详细讨论。在以下描述中,给出了许多具体的细节,以便对本发明有一个完全的理解。可是,很显然,对于那些精通本技术的人来说,不依靠这些具体的细节,也可以实施本发明。在另一些例子中,众所周知的一些结构未被详细列出,以避免不必要地使本发明含义模糊。
图1是一方框图,显示了根据本发明实施例的编译器的结构。参照图1,该实施例形式的编译器由以下构成:输入单元10;句法分析单元20;优化单元30;代码生成单元40;用于寄存被调用函数和使用寄存器的信息的函数使用寄存器控制表50;函数使用寄存器汇总单元70,以及在分析中间代码112后,用于在函数使用寄存器控制表50中寄存每一函数中的被调用函数名及其使用寄存器的函数使用寄存器提取单元60;和提供汇编程序文件113的输出单元80。函数使用寄存器控制表50包括用于寄存函数名的函数名空间51、用于寄存使用寄存器名的使用寄存器空间52和用于寄存被调用函数名的被调用函数空间53。图1仅显示了本实施例的典型部件,而省略了关于其它通用部件的描述。
在上述部件中,输入单元10、句法分析单元20、优化单元30、代码生成单元40、函数使用寄存器控制表50、函数使用寄存器提取单元60都分别与图7所示的常规编译器中的输入单元701、句法分析单元702、优化单元703、代码生成单元704、函数使用寄存器控制表705、函数使用寄存器提取单元706相同。更具体地,输入单元10接收源程序111,进行词法分析,生成一词法阵列,并将之提供给句法分析单元20。句法分析单元20由输入单元10所生成的词法阵列分析句法,生成一句法树,并将之提供给优化单元30。优化单元30优化句法单元20所生成的句法树,并将之提供给代码生成单元40。代码生成单元40在优化单元30所优化的句法树的基础上生成中间代码112。函数使用寄存器提取单元60分析中间代码112,并将函数名、其使用寄存器名和被调用函数名寄存于函数使用寄存器控制表50中。
参照函数使用寄存器控制表50,函数使用寄存器汇总单元70汇总被中断函数所调用函数所用的寄存器。这些寄存器又被当作中断函数使用寄存器被寄存于函数使用寄存器控制表50中。更具体地,在相应于所有被中断函数所调用的函数的函数使用寄存器控制表50的使用寄存器空间52中的寄存器名和在相应于所有被这些函数所调用的函数的函数使用寄存器控制表50的使用寄存器空间52中的寄存器名都被结合在一起,并被寄存在中断函数的函数使用寄存器控制表50的使用寄存器空间52中。
参照中间代码112和函数使用寄存器控制表50,输出单元80删除在调用部分未使用的寄存器保存/返回代码,并提供包括中断函数使用寄存器保存/返回代码的汇编程序文件113。
图2是一个流程图,显示了图1所示实施例编译器的操作。参照图2,在本实施例的编译器中,输入单元10接收源程序111,并生成句法阵列(步骤201)。接着,句法分析单元20使用生成的词法阵列完成句法分析(步骤202)。优化单元30优化句法树(步骤203)。代码生成单元40在优化的句法树基础上生成中间代码112(步骤204)。随后,函数使用寄存器提取单元60和函数使用寄存器汇总单元70分析中间代码112,并在函数使用寄存器控制表50中寄存函数名、其使用寄存器名和被调用函数名(步骤205和206)。输出单元80生成汇编程序文件并提供之(步骤207)。
参照图3A到3C和图4,将对205步到207步中函数使用寄存器提取单元60、函数使用寄存器汇总单元70和输出单元80的操作给予详细描述。
参照图3A,当函数使用寄存器提取单元60读出中间代码112并在源程序111内识别出函数定义时,它将该函数名f1寄存到函数使用寄存器控制表50的函数名空间51中(步骤301和302)。接着,它将该函数的寄存器名寄存到函数使用寄存器控制表50的使用寄存器空间52中(步骤303)。然后,它将被调用函数的函数名寄存到函数使用寄存器控制表50的被调用函数空间53中(步骤304)。然后判断正执行的函数是否为文件的最后一个函数。当它不是最后一个函数时,下一函数的定义被检测;当它是最后一个函数时,处理结束(步骤305)。
参照图3B,函数使用寄存器汇总单元70首先判断信息是否已在函数使用寄存器控制表50中寄存。若信息已被寄存,则函数名空间51中的每个函数名被从第一行起顺序读出(步骤311和312),并判断每个函数名是否已在被调用函数空间53中寄存。当单元70识别出函数名已被寄存时,该函数名被从被调用函数空间53中删除(步骤313和314),并且函数使用寄存器汇总过程被调用(步骤315)。
参照图3C,函数使用寄存器汇总单元70在函数使用寄存器汇总过程中从第一行开始顺序读出函数名空间51的每个函数名(步骤321),并判断每个函数名是否在被调用函数空间53中被寄存。当它识别出某个函数名已在被调用函数空间53中被寄存时,该函数名从被调用函数空间53中删除(步骤322和323),且函数使用寄存器汇总过程将进一步继续(步骤324)。另一方面,当它识别出某个函数名未在被调用函数空间53中被寄存时,在被调用部分的函数使用寄存器被调用,并且它将与调用函数使用寄存器一起被寄存在调用函数使用寄存器空间52中,然后函数使用寄存器汇总过程将会结束(步骤325)。
参照图4,输出单元80读出中间代码112,并检测源程序111中的中断函数。当判断出一函数为中断函数时,输出单元80提供已在相应的函数使用寄存器控制表50的使用寄存器空间52中寄存的寄存器保存代码(步骤401和402)。它也提供函数本身的输出代码(步骤403)和保存寄存器的返回代码(步骤404)。另一方面,当判断出一函数不是中断函数时,它立即提供函数本身的输出代码(步骤405)。以上处理将重复直到文件的结尾,并在文件结尾被处理后结束(步骤406)。
以上提及实施例的编译器可由诸如在工作站、个人计算机之类的计算机系统中被程序控制的CPU和内部RAM之类的内存来实现。控制CPU的计算机程序通过存贮在磁盘、光盘、半导体存储器或是其它通用存贮介质中来提供,上述部件的每个函数都是通过将程序调入计算机系统内部的内存来执行的,以控制CPU。
以下,将联系图6所示源程序的处理,更具体地描述该实施例的操作。
输入单元10接收源程序111,句法分析单元20生成句法树,优化单元30进行优化,代码生成单元40生成中间代码112(参照图2中步骤201到204)的操作都与常规编译器中的操作相同,故省略对它们的描述。
参照图3A的流程图和图6,对函数使用寄存器提取单元60的操作给予描述。函数使用寄存器提取单元60接收中间代码112,并检测每个函数的定义。在图6所示的源程序中识别出函数f1的定义后,单元60将函数名f1寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。然后,它将函数f1使用寄存器名“a”、“b”寄存在函数使用寄存器控制表50中相应的使用寄存器空间52中(步骤303)。它也将被调用部分的函数名f2、f3寄存在函数使用寄存器控制表50中相应的被调用函数空间53中(步骤304)。
判断函数f1的定义是否文件结尾。由于它不是文件的结尾,操作返回到步骤301,单元60检测下一函数的定义(步骤305)。此处函数f2的定义被认作是下一函数。
函数使用寄存器提取单元60将函数名f2寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。它将函数f2使用寄存器的寄存器名“c”寄存在函数使用寄存器控制表50相应的使用寄存器空间52中(步骤303),还将被调用部分的函数名f4寄存在函数使用寄存器控制表50相应的被调用函数空间53中(步骤304)。
接着判断函数f2的定义是否为文件结尾。由于它不是文件结尾,操作返回到步骤301,单元60检测下一函数的定义(步骤305)。此处函数f3的定义被认作是下一函数。
单元60将函数名f3寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。它将函数f3使用寄存器的寄存器名“d”寄存在函数使用寄存器控制表50相应的使用寄存器空间52中(步骤303),还将被调用部分的函数名f5和f2寄存在函数使用寄存器控制表50相应的被调用函数空间53中(步骤304)。
判断函数f3的定义是否文件结尾。由于它不是文件结尾,操作返回到301步,单元60检测下一函数的定义(步骤305)。此处函数f4的定义被认作是下一函数。
单元60将函数名f4寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。它将函数f4使用寄存器的寄存器名“e”寄存在函数使用寄存器控制表50相应的使用寄存器空间52中(步骤303),还将被调用部分的函数名f3寄存在函数使用寄存器控制表50相应的被调用函数空间53中(步骤304)。
判断函数f4的定义是否文件结尾。由于它不是文件结尾,操作返回到步骤301,单元60检测下一函数的定义(步骤305)。此处函数6的定义被认作是下一函数。
单元60将函数名f5寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。它将函数f5使用寄存器的寄存器名“f”寄存在函数使用寄存器控制表50相应的使用寄存器空间52中(步骤303)。参照图6,由于函数f5不调用函数,在被调用函数空间53中不寄存任何东西(步骤304)。
接着,判断函数f5的定义是否文件结尾。由于它不是文件结尾,操作返回到步骤301,单元60检测下一函数的定义(步骤305)。此处函数f6的定义被认作是下一函数。
单元60将函数名f6寄存在函数使用寄存器控制表50的函数名空间51中(步骤301和302)。它将函数f6使用寄存器的寄存器名“g”、“h”寄存在函数使用寄存器控制表50相应的使用寄存器空间52中(步骤303),还将被调用部分的函数名f5寄存在函数使用寄存器控制表50相应的被调用函数空间53中(步骤304)。
判断函数f6的定义是否文件结尾。由于它是文件结尾,函数使用寄存器提取单元60的操作结束(步骤305)。如上生成的函数使用寄存器控制表50如图5(A)所示。
参照图3B和3C中的流程图及图5(A),以下描述函数使用寄存器汇总单元70的操作。函数使用寄存器汇总单元70参照图5(A)所示的函数使用寄存器控制表50判断信息是否已被寄存。由于信息处理已被寄存如图5(A)所示,单元70读出第一个字符串,即函数f1的字符串(步骤311和312)。它识别出在被调用函数空间53中寄存的函数名f2,并从该被调用函数空间53中删除函数名f2(步骤313和314)。然后,它调用函数使用寄存器汇总过程(步骤315)。
参照图3C,函数使用寄存器汇总单元70在函数使用寄存器汇总过程中从函数使用寄存器控制表50中读出被函数f1调用的函数名f2的字符串(步骤321)。它识别出在被调用函数空间53中寄存的函数名f4并从该空间53中删除函数名f4(步骤322和323),递归调用函数使用寄存器汇总过程(步骤324)。
函数使用寄存器汇总单元70从函数使用寄存器控制表50中读出被函数f2调用的函数名f4的字符串(步骤321)。它识别出在被调用函数空间53中寄存的函数名f3并在空间53中将函数名f3删除(步骤322和323),递归调用函数使用寄存器汇总过程(步骤324)。
同样地,函数使用寄存器汇总单元70从函数使用寄存器控制表50中读取函数f4所调用的函数名f3的字符串(步骤321)。它识别出寄存在被调用函数空间53中的函数名f5并将其从该空间53中删除(步骤322和323)。它递归调用函数使用寄存器汇总过程(步骤324)。
同样地,函数使用寄存器汇总单元70从函数使用寄存器控制表50中读出被函数f3调用的函数名f5的字符串(步骤321)。当它识别出在被调用函数空间53中没有寄存的函数名时,它将函数f5的使用寄存器“f”与在函数f3的使用寄存器空间52中的调用函数f3(即对函数f5的调用部分)的使用寄存器放在一起(步骤322和325)。然后,对于函数f5的函数使用寄存器汇总过程便结束了。
此时,操作返回到对于函数f3的函数使用寄存器汇总过程。单元70读出在被调用函数空间53中寄存的其它函数名f2,并从该被调用函数空间53中删除函数名f2(步骤322和323),递归调用函数使用寄存器汇总过程(步骤324)。
函数使用寄存器汇总单元70从函数使用寄存器控制表50中读出被函数f3调用的函数名f2的字符串(步骤321)。当它识别出在被调用函数空间53中没有其它寄存的函数名时,它将函数f2的使用寄存器“c”与在函数f3的使用寄存器空间52中的调用函数f3(即对函数f2的调用部分)的使用寄存器放在一起(步骤322和325)。然后,对于函数f2的函数使用寄存器汇总过程便结束了。
此时,操作返回到对于函数f3的函数使用寄存器汇总过程。当它识别出在被调用函数空间53中没有其它寄存的函数名时,它将函数f3的使用寄存器“d”和在上述处理中已被结合在一起的使用寄存器“f”、“c”与在函数f4的使用寄存器空间52中的函数f4(即对函数f3的调用部分)的使用寄存器放在一起(步骤322和325)。然后,对于函数f3的函数使用寄存器汇总过程便结束了。
此时,操作返回到对于函数f4的函数使用寄存器汇总过程。当它识别出在被调用函数空间53中没有更多寄存的函数名时,它将函数f4的使用寄存器“e”和在上述处理中已被结合在一起的使用寄存器“d”、“f”、“c”在函数f2(即对函数f4的调用部分)的使用寄存器空间52中放在一起(步骤322和325)。然后,对于函数f4的函数使用寄存器汇总过程便结束了。
操作返回到对于函数f2的函数使用寄存器汇总过程。当它识别出在被调用函数空间53中没有更多的寄存的函数名时,它将函数f2的使用寄存器“c”和在上述处理中已被结合在一起的使用寄存器“e”、“d”、“f”在函数f1(即对函数f2的调用部分)的使用寄存器空间52中放在一起(步骤322和325)。然后,对于函数f2的函数使用寄存器汇总过程便结束了。
当对于被调用函数的所有使用寄存器汇总过程都结束时,操作返回到图3B所示的操作。其中,单元70识别在被调用函数空间53中寄存的下一函数名f3,并从被调用函数空间53中删除函数名f3(步骤313和314)。然后,它调用函数使用寄存器汇总过程(步骤315)。
函数使用寄存器汇总单元70从函数使用寄存器控制表50中读出被函数f1调用的函数f3的字符串(步骤321)。当它识别出在被调用函数空间53中没有其它寄存的函数名时,它将函数f3的使用寄存器“d”、“f”、“c”与在函数f1(即对函数f3的调用部分)的使用寄存器空间52中函数f1的使用寄存器放在一起(步骤322和325)。然后,对于函数f3的函数使用寄存器汇总过程便结束了。
当函数使用寄存器汇总过程结束后,操作返回到图3B所示的操作。当单元70识别出在被调用函数空间53中没有寄存的其它函数名时,操作返回步骤311(步骤313)。然后,它读取下一字符串,即函数名f2的字符串(步骤311和312)。当它识别出在被调用函数空间53中没有寄存的其它函数名时,操作返回步骤311(步骤313)。同样地,它读取下一字符串,即函数名f3的字符串(步骤311和312)。当它识别出在被调用函数空间53中没有寄存的其它函数名时,操作返回步骤311(步骤313)。同样地,它读取下一字符串,即函数名f4的字符串(步骤311和312)。当它识别出在被调用函数空间53中没有寄存的其它函数名时,操作返回步骤311(步骤313)。同样地,它读取下一字符串,即函数名f5的字符串(步骤311和312)。当它识别出在被调用函数空间53中没有寄存其它函数名时,操作返回311步(313步)。
以同样方式,它读取下一字符串,即函数名f6的字符串(步骤311和312)。它识别出在被调用函数空间53中寄存的函数名f5,并从其被调用函数空间53中删除函数名f5(步骤313和314)。由于在被调用部分有一函数,函数使用寄存器汇总过程被调用(步骤315)。
参照图3C,函数使用寄存器汇总单元70从函数使用寄存器控制表50中读出被函数f6调用的函数名6的字符串(步骤321)。当它识别出在被调用函数空间53中没有更多寄存的函数名时,它将函数f5的使用寄存器“f”与在函数f6(即对函数f5的调用部分)的使用寄存器空间52中函数f6的使用寄存器放在一起(步骤322和325)。然后,对于函数f5的函数使用寄存器汇总过程便结束了。
当函数使用寄存器汇总过程结束后,操作返回到图3B所示的操作。当单元70识别出在被调用函数空间53中没有更多寄存的函数名时,操作返回步骤311(步骤313)。当它判断出在函数使用寄存器控制表50中函数f6后不再有字符串时,函数使用寄存器汇总单元70的所有处理便完成了(步骤311)。上述过程生成的函数使用寄存器控制表50如图5(B)所示。
参照图4、图5(B)和图6,对输出单元80的操作给予描述。输出单元80接收中间代码112,并检测中断函数。当检测到如图6所示源程序的函数f1是一中断函数时,输出单元80参照函数使用寄存器控制表50的函数名f1的字符串,提供已在使用寄存器空间52中寄存的寄存器“a”、“b”、“c”、“e”、“d”和“f”的保存代码(步骤401和402)。
然后,输出单元80提供函数f1本身的代码(步骤403)。此后,再次参照函数使用寄存器控制表50的函数名f1的字符串,它提供已在使用寄存器空间52中寄存的寄存器“a”、“b”、“c”、“e”、“d”和“f”的返回代码(步骤404)。
输出单元80判断函数f1是否文件的结尾。由于f1不是文件的结尾,输出单元80检测下一中断函数(步骤406和401)。对于不是中断函数的其它函数,它仅提供函数本身的代码(步骤401、405和406)。
当判断出图6所示源程序的函数f6是一中断函数时,输出单元80参照函数使用寄存器控制表50的函数名f6的字符串,提供已在使用寄存器空间52中寄存的寄存器“g”、“h”和“f”的保存代码(步骤401和402)。
输出单元80提供函数f6本身的代码(步骤403)。此后,再次参照函数使用寄存器控制表50的函数名f6的字符串,它提供已在使用寄存器空间52中寄存的寄存器“g”、“h”和“f”的返回代码(步骤404)。
输出单元80判断函数f6是否文件的结尾。由于f6是文件的结尾,输出单元80的处理完成。
如上所述,根据本发明的编译器及其优化方法,函数使用寄存器汇总单元汇总被中断函数所调用函数所用的寄存器。由于该中断函数是在以上函数使用寄存器控制表中作为调用部分的中断函数使用寄存器而重新寄存的,因此有可能仅保存和返回使用寄存器。于是,使得能以最小数量的寄存器来保存和返回中断函数。在减少中断函数的大小和代码、缩短执行时间以改善汇编程序文件的执行效率方面,它是有效的。
尽管本发明被以示例性实施例的方式而加以讲解和说明,那些精通此技术者应理解,在不脱离本发明精神和范围的情况下可对本发明作出进一步和各种各样的变化、省略和附加更改。因此,应理解本发明并不局限于以上论述的特定实施例,而是包括与在附属权利要求中提出特征相等效和包括范围之内的所有可能代表的实施例。
Claims (9)
1.编译器,其读源程序以便完成语句分析和句法分析、产生中间代码、增加函数所用寄存器的保存/返回代码、由此产生汇编程序文件,所述编译器由以下构成:
函数使用寄存器控制表(50),用于对源程序之内的每个函数寄存函数使用寄存器信息和被函数调用的被调用函数信息;
函数使用寄存器提取装置(60),用于在分析中间代码并将使用寄存器和被调用函数名寄存在上述的函数使用寄存器控制表(50)之后,提取在每个函数中的使用寄存器和被调用函数名;
函数使用寄存器汇总装置(70),用于参照上述的函数使用寄存器控制表(50)汇总被中断函数调用的函数所用的寄存器,上述的函数使用寄存器控制表(50)中装有上述函数使用寄存器提取装置(60)所寄存的信息,并将汇总后的寄存器作为中断函数使用寄存器重新寄存在上述函数使用寄存器控制表(50)中;和
输出装置(80),用于参照含有上述的函数使用寄存器汇总装置(70)所汇总的使用寄存器的上述函数使用寄存器控制表(50),在中间代码中增加中断函数使用寄存器的保存/返回代码,以产生和提供汇编程序文件。
2.权利要求1中所述之编译器,其特征在于:
上述的函数使用寄存器控制表(50)包括:用于寄存函数名的函数名空间;用于寄存函数使用寄存器名的使用寄存器空间;用于寄存被函数调用的被调用函数名的被调用函数空间。
3.权利要求1中所述之编译器,其特征在于:
上述的函数使用寄存器汇总装置(70)在每个函数中顺序读取已在上述函数使用寄存器控制表(50)中寄存的信息,以判断是否存在被函数调用的被调用函数;和
当存在被函数所调用的被调用函数时,上述单元(70)从上述函数使用寄存器控制表(50)中删除被调用函数,从上述函数使用寄存器控制表(50)中读取被调用函数的寄存器信息,并将被调用函数的使用寄存器与调用函数的使用寄存器结合起来。
4.权利要求1中所述之编译器,其中:
上述的函数使用寄存器汇总装置(70)在每个函数中顺序读取已在上述函数使用寄存器控制表(50)中寄存的信息,以判断是否存在被函数调用的被调用函数;并且
当存在被函数所调用的被调用函数时,上述单元(70)从上述函数使用寄存器控制表(50)中删除该被调用函数,从上述函数使用寄存器控制表(50)中读取被调用函数的寄存器信息,并判断是否存在进一步被该函数所调用的被调用函数;
当存在被该函数进一步调用的被调用函数时,上述单元(70)递归重复进行删除被调用函数和读取该被调用函数信息的操作;
当不再有被该被提及函数所调用的被调用函数时,上述单元(70)将该函数的使用寄存器与作为对该被提及函数调用部分的调用函数的使用寄存器结合起来。
5.权利要求1中所述之编译器,其中:
上述的输出装置(80)对于中间代码之内的中断函数提供中断函数本身,在中断函数本身之前提供中断函数使用寄存器的保存代码,并在中断函数本身之后提供中断函数使用寄存器的返回代码;
对不是中断函数的其它函数,上述装置(80)提供函数本身。
6.编译器的优化方法,该方法读源程序以便完成语句分析和句法分析、产生中间代码、并加入在函数中使用寄存器的保存/返回代码、由此产生汇编程序文件,所述优化方法由以下步骤构成:
在分析中间代码之后,提取每一函数的使用寄存器和调用函数名,并将该使用寄存器和调用函数名寄存于上述的函数使用寄存器控制表(50)中;
参照在上述的使用寄存器寄存步骤中寄存在上述的函数使用寄存器控制表(50)的信息,汇总被中断函数所调用的函数中使用的寄存器,并在上述的函数使用寄存器控制表(50)中重新寄存汇总的寄存器作为中断函数使用寄存器;和
参照在上述的使用寄存器汇总步骤中己将使用寄存器汇总的上述函数使用寄存器控制表(50),在中间代码中加入中断函数使用寄存器的保存/返回代码,以便生成和提供汇编程序文件。
7.权利要求6所述的编译器优化方法,其特征在于:
上述每个函数使用寄存器汇总步骤进一步包括:
在每个函数中顺序读取已在上述函数使用寄存器控制表(50)中寄存的信息,以便判断是否存在被函数所调用的被调用函数;和
当存在被函数所调用的被调用函数时,从上述函数使用寄存器控制表(50)中删除该被调用函数,从上述函数使用寄存器控制表(50)中读取该被调用函数寄存器信息,和将该被调用函数的使用寄存器与调用函数使用寄存器结合。
8.权利要求6所述的编译器优化方法,其中
上述每个函数使用寄存器汇总步骤进一步包括:
在每个函数中顺序读取已在上述函数使用寄存器控制表(50)中寄存的信息,以便判断是否存在被函数所调用的被调用函数;
当存在被函数所调用的被调用函数时,从上述函数使用寄存器控制表(50)中删除该被调用函数,从上述函数使用寄存器控制表(50)中读取该被调用函数寄存器信息,并判断是否存在被该函数进一步调用的被调用函数;
当存在被上述的被调用函数所进一步调用的被调用函数时,递归式地重复删除被调用函数和读取该被调用函数信息的操作;和
当不再有被上述被提及函数调用的被调用函数时,将该被调用函数使用寄存器与调用函数即对该被提及函数的调用部分的使用寄存器结合。
9.权利要求6所述的编译器优化方法,其中
上述的输出步骤包括:
判断在中间代码内的函数是否为中断函数;且
对于中断函数,上述的步骤包括:
在中断函数本身之前提供中断函数使用寄存器保存代码;
提供所述中断函数本身;和
在所述中断函数本身之后提供所述中断函数使用寄存器返回代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 99100114 CN1223402A (zh) | 1998-01-12 | 1999-01-12 | 在优化中能减少中断处理的编译器及其优化方法 |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP003760/98 | 1998-01-12 | ||
CN 99100114 CN1223402A (zh) | 1998-01-12 | 1999-01-12 | 在优化中能减少中断处理的编译器及其优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1223402A true CN1223402A (zh) | 1999-07-21 |
Family
ID=5269802
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 99100114 Pending CN1223402A (zh) | 1998-01-12 | 1999-01-12 | 在优化中能减少中断处理的编译器及其优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1223402A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1312582C (zh) * | 2002-08-02 | 2007-04-25 | 松下电器产业株式会社 | 编译装置和编译方法 |
CN100382028C (zh) * | 2001-10-31 | 2008-04-16 | 亚普公司 | 中间代码预处理、执行装置及执行系统及计算机程序产品 |
CN1853164B (zh) * | 2003-09-30 | 2010-10-13 | 英特尔公司 | 用于开发dsp编译器构件块的组合方法 |
WO2012101530A1 (en) * | 2011-01-28 | 2012-08-02 | International Business Machines Corporation | Dynamic binary optimization |
CN105117269A (zh) * | 2015-10-09 | 2015-12-02 | 天津国芯科技有限公司 | 基于向量中断的编译器的优化方法 |
CN117472388A (zh) * | 2023-12-28 | 2024-01-30 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
-
1999
- 1999-01-12 CN CN 99100114 patent/CN1223402A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100382028C (zh) * | 2001-10-31 | 2008-04-16 | 亚普公司 | 中间代码预处理、执行装置及执行系统及计算机程序产品 |
CN1312582C (zh) * | 2002-08-02 | 2007-04-25 | 松下电器产业株式会社 | 编译装置和编译方法 |
CN1853164B (zh) * | 2003-09-30 | 2010-10-13 | 英特尔公司 | 用于开发dsp编译器构件块的组合方法 |
WO2012101530A1 (en) * | 2011-01-28 | 2012-08-02 | International Business Machines Corporation | Dynamic binary optimization |
GB2501442A (en) * | 2011-01-28 | 2013-10-23 | Ibm | Dynamic binary optimisation |
GB2501442B (en) * | 2011-01-28 | 2019-12-11 | Ibm | Dynamic binary optimization |
CN105117269A (zh) * | 2015-10-09 | 2015-12-02 | 天津国芯科技有限公司 | 基于向量中断的编译器的优化方法 |
CN105117269B (zh) * | 2015-10-09 | 2018-07-24 | 天津国芯科技有限公司 | 基于向量中断的编译器的优化方法 |
CN117472388A (zh) * | 2023-12-28 | 2024-01-30 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
CN117472388B (zh) * | 2023-12-28 | 2024-04-05 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1294486C (zh) | 多重处理环境中透明动态优化的方法和系统 | |
CN1304941C (zh) | 用于自主硬件辅助的线程栈跟踪的装置与方法 | |
CN1153142C (zh) | 通过事务对多个文件实现原子更新的事务文件系统 | |
CN1752934A (zh) | 编译器、编译方法以及编译程序 | |
CN1613058A (zh) | 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备 | |
CN1167014C (zh) | 文件处理方法和数据处理装置 | |
CN1214325C (zh) | 用于通过存储器管理提高引用局部性的方法和装置 | |
CN100339830C (zh) | 一种更新软件的方法 | |
CN1862475A (zh) | 磁盘阵列缓存的管理方法 | |
CN1818868A (zh) | 嵌入式操作系统多任务并行启动优化实现方法 | |
CN1744045A (zh) | 改善数据高速缓存性能的方法和设备 | |
CN1892602A (zh) | 一种二进制翻译中库函数调用的处理方法 | |
CN1949169A (zh) | 电视机软件升级方法 | |
CN1492361A (zh) | 嵌入式数据库查询的处理方法 | |
CN1750018A (zh) | 文档处理装置、文档处理方法和记录相关程序的存储介质 | |
CN1614563A (zh) | 模板编译方法 | |
CN1223402A (zh) | 在优化中能减少中断处理的编译器及其优化方法 | |
CN1601519A (zh) | 文档变换系统 | |
CN112307478A (zh) | 一种脚本病毒检测方法、系统及电子设备和存储介质 | |
CN1313925C (zh) | 构件自描述封装方法及运行的方法 | |
CN1172986A (zh) | 实时控制系统 | |
CN1900910A (zh) | 二进制翻译中经由跳转表的多目标分支语句的识别方法 | |
CN1542616A (zh) | 编译装置、编译方法、通信终端设备、编译程序以及程序产品 | |
CN1245685C (zh) | 基于构件的操作系统动态设备驱动的方法 | |
CN1834911A (zh) | 实现程序加载运行的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C06 | Publication | ||
PB01 | Publication | ||
ASS | Succession or assignment of patent right |
Owner name: NEC ELECTRONICS TAIWAN LTD. Free format text: FORMER OWNER: NIPPON ELECTRIC CO., LTD. Effective date: 20030328 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20030328 Address after: Kanagawa, Japan Applicant after: NEC Corp. Address before: Tokyo, Japan Applicant before: NEC Corp. |
|
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |