CN1138172A - 高速实现子程序返回的处理器及产生能高速从子程序返回的机器语言程序的程序翻译装置 - Google Patents

高速实现子程序返回的处理器及产生能高速从子程序返回的机器语言程序的程序翻译装置 Download PDF

Info

Publication number
CN1138172A
CN1138172A CN96103716A CN96103716A CN1138172A CN 1138172 A CN1138172 A CN 1138172A CN 96103716 A CN96103716 A CN 96103716A CN 96103716 A CN96103716 A CN 96103716A CN 1138172 A CN1138172 A CN 1138172A
Authority
CN
China
Prior art keywords
instruction
subroutine
return
register
address
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.)
Granted
Application number
CN96103716A
Other languages
English (en)
Other versions
CN1140870C (zh
Inventor
山本和司
高山秀一
桧垣信生
富永宣辉
宫地信哉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Godo Kaisha IP Bridge 1
Original Assignee
松下电器产业株式会社
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by 松下电器产业株式会社 filed Critical 松下电器产业株式会社
Publication of CN1138172A publication Critical patent/CN1138172A/zh
Application granted granted Critical
Publication of CN1140870C publication Critical patent/CN1140870C/zh
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • G06F9/3806Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30054Unconditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • G06F9/4486Formation of subprogram jump address

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

从程序翻译装置生成的汇编程序中,检测其函数体内无其它函数调用指令以及在函数体内返址运算兼用寄存器56的值也未发生改变。检测出后,在该函数的结束处输出一个特殊返回指令。当处理器执行到一条函数调用指令时,就将函数的返回地址同时保存于堆栈及返址/运算兼用寄存器中。从而当取出一条特殊返回指令时,不是去存取堆栈,而是从返址/运算兼用寄存器中取得返回地址来完成状态返回。

Description

高速实现子程序返回的处理器及产生能高速 从子程序返回的机器语言程序的程序翻译装置
本发明是一种有关于程序处理器以及将用程序设计语言所写的源程序编译为适宜于在该处理器上执行的机器语言程序的翻译装置。
近年来,利用内置微处理器,蓬勃地开发出了适应于多种需求的信息处理机器。在这样的信息装置的开发过程中,追求着从硬件到软件两方面的处理高速化或成本的尽可能的降低。
上述的软件,很早以来就是力求使处理子程序化。这样子程序化了的软件,成为了嵌套型的控制结构。所谓嵌套型控制结构,是指主程序中调用了子程序1,进而在子程序1中又调用了子程序2,这样地子程序的调用呈现出多重控制结构。
这样的控制结构中,在堆栈中保存有子程序被调用时调用程序的返回地址。并且在从子程序返回时,从堆栈中取出所保存的返回地址并送入程序计数器内。此处为了从堆栈中取出所保存的返回地址,就必须对堆栈进行存取。在控制结构比较简单,如前面所述的子程序调用只有两、三处时,这个存取堆栈所需时间可以忽略不计,但若控制构造很复杂,在前述构造中若子程序的调用达到10处、20处等多处的情形,因这些存取而导致的延迟则相当显著。
为了解决这样的对堆栈的存取而产生的延迟,已有技术是设置存储返回地址的专用寄存器,这样的处理器已经存在(保存返回地址的专用寄存器被称为返回地址专用寄存器。)下面参照插图,对设有返回地址专用寄存器的处理器进行说明,此外,因为在该处理器中设置了返回地址专用寄存器(以下用返址专用寄存器表示之),图1中对所示的指令进行解释和执行。
图1是先有技术的处理器的指令型式的一例的示意图。此外,本图中将处理器的堆栈指针略记为SP。对堆栈的引用略记为@SP。此处将返址专用寄存器略记为FR。在以下的说明中,若不特别指明,这些记号的意义是如上述。
jsr:
指令“jsr_f”是执行子程序调用的命令,它与一般的子程序调用命令不同之处在于,当此处进行调用时,在把调用程序的返回地址添加到堆栈中的同时,该返回地址也被保存到返址专用寄存器中。也就是说,当取出子程序调用指令时,处理器将堆栈指针的值减2,将子程序调用指令的下一条指令的地址保存到由堆栈指针所指示的堆栈中,并将子程序调用指令的下一条指令的地址保存到返址专用寄存器中。
rts:
指令“rts”是返回指令。该返回指令,与一般的处理器所具有的返回指令相同,将堆栈中所存放的返回地址送到程序计数器中,将堆栈指针加2,并从子程序返回。
rtsfr:
rtsfr指令也是与rts指令相同的返回指令,但对应于rts指令从堆栈中得到返回地址,rtsfr指令的不同之处在于从返址专用寄存器获得返回地址,并将它送入程序计数器中。此处,把这种从寄存器中得到返回地址的返回指令rtsfr指令,叫作特殊返回指令。
此外,除上述指令之外,图1中还记载有add指令、mul指令等,对这些指令,因与本发明申请的主旨无关,此处省略对它们的说明。
对如上所述的具有返回地址专用寄存器的处理器,参照图2和图3,对它们怎样进行向子程序转移,以及怎样从子程序状态返回的情形进行具体说明。
图2是现有的处理器进行子程序调用的情形以及从子程序作状态返回的情形加以表示的流程图。图3是汇编程序的输出代码的示意图。图中的_main、_f1,_f2等带有下划线“_”的标号,是函数的入口标号(并且,在C语言等程序设计语言中是把子程序称作函数,受此概念的影响,以后也将子程序称作函数)。此外,这些函数中的所有处理,也根据上述指令加以表述。在本程序中,特殊返回指令,只存在于其内部不再进行函数调用的函数的末尾。换言之,只存在于嵌套结构的最内层的函数中,这是因为对应于堆栈按先进后出的顺序来存放返回地址,而返址专用寄存器只保存一个返回地址之故。
现在,假定处理器中的程序处于图3的状态。本图中,左侧的数值“0100”“0101”...等,表示了程序中的各指令的相对地址。此外,右侧的(ex1)、(ex2)、(ex3)...等数值,是表示各指令中按顺序所作的编号。
此外,假定处理器中所具有的程序计数器被设定为(ex1)指令所在的相对地址0100。处理器取出序号为(ex1)的指令(步骤u2),并且执行之(步骤u3~u5)。执行之后,判断是否还存在下次应取出的指令(步骤u1),若存在,就取出其序号为(ex2)的指令(步u2),判定该指令是否为函数调用指令(步u3)。因为(ex2)的指令“jsr_f1”是函数调用指令,因此该(ex2)的下一指令地址0102作为返回地址,被添加到堆栈中(步u6)。与此同时,返回地址0102被保存到返址专用寄存器中,并调用函数f1(步u7)。调用后,处理器取出函数f1内的(ex6)(ex7)的指令并予执行(步u1~u5)。图3中这些指令之后,后续有(ex8)的指令“jsr_f2”。
在执行了(ex7)的指令后,处理器判断是否还存在取出的指令(步u1),若存在,就取出(ex7)的后继指令(ex8)(步u2),并判断它是否为函数调用指令(步u3)。由于(ex8)的指令是“jsr_f2”,它是一条函数调用指令,因此将该(ex8)的下一指令的地址0108作为返回地址,压入堆栈中(步u6)。与此同时,将返回地址0108保存到返址专用寄存器中,当准备好了从函数f2到函数f1的返回状态之后,调用函数f2(步u7)。
处理器在保存了返回地址0108之后,控制转到函数f2,取出函数f2中的各指令序列(ex10)~(ex12),并予执行(步u1~步u5)。图3中,在这些指令之后,排列有特殊返回指令rtsfr。在执行了(ex12)的指令后(步u5),判定是否还存在后续指令(步u1),并取出(ex13)的指令(步u2)。随后对其是否为函数调用指令进行判定(步u3),因它不是函数调用指令,而判定它是否为特殊返回指令rtsfr(步u4)。因为该指令(ex13)为特殊返回指令,处理器从返址专用寄存器取出返回地址0108,并传送给程序计数器。因而不必经由堆栈的存取,完成了向函数f1的状态返回(步u8)。
在实行这样的状态返回时,处理器取出处于返回地址的相对地址0108中的返回指令rts。返回指令rts因为是通过存取堆栈来实行状态返回的指令,处理器访问堆栈,从中弹出返回地址0102,实行状态返回(步u5)。状态返回后,从堆栈中取得相对地址0102的返回地址,执行(ex3)的指令,然后执行其后续指令(ex4)(步u1~u5)。由于后续(ex3)的(ex4)的指令是函数调用指令“jsr_f3”,与“jsr_f2”的情形相同,将返回地址0104压入堆栈中(步u6),进而,将其保存到返址专用寄存器中,然后调用函数f3(步u7)。处理器取出函数f3中的(ex14)、(ex15)的指令并予执行(步u1~u5),然后取出后续的(ex16)的特殊返回指令rtsfr,从返址专用寄存器中取出返回地址0104,并传送给程序计数器,实行状态返回(步u8)。
上述这样的设有返址专用寄存器的处理器,因为不通过堆栈,而用返址专用寄存器来实现状态返回,因此调用子程序的主例程可以高速地进行子程序处理的继续。
但是,根据上述先有技术,为了实现从子程序的高速状态返回,在处理器内部必须实现返址专用寄存器,因而存在电路的规模增大这一问题。
本发明的第1目的,就是要提供一种处理器,它在不使电路规模增大的前提下,能高速地实现从子程序的状态返回。
本发明的第2个目的,是要提供一种程序翻译装置,它把用程序设计语言所编写的程序翻译为以上述处理器为对象的机器语言程序。
本发明的第一目的,可利用下述的结构来达到。这种处理器的结构,是在具有取指装置、译码装置、特定指令运算器、专用寄存器的处理器的基础之上,再增设第一、第二、第三等三个判断部和两个返回部来构成。取指装置顺次从内存中取出指令,译码装置对取出的指令进行译码、特定指令运算器在接收到译码结果是一特定运算指令时,对该特定运算指令进行运算,专用寄存器用于保存由运算器算出的特定运算指令的计算结果。在此基础上,第一判断部对前述取指装置所取出的指令加以判断,判断是否是子程序调用指令;第二判断部对由取指装置所取出的指令加以判断,看其是否是含有从堆栈中取出返回地址进行返回的第1子程序返回指令;第三判断部对由取出装置取出的指令加以判断,看其是否含有从专用寄存器中取出返回地址进行返回的第2子程序返回指令;子程序调用装置在前述的第一判断器判断一指令为子程序调用指令时,就将该指令的下一条指令的地址作为返回地址保存到堆栈及专用寄存器中;第1返回装置在判定一指令为第1子程序返回指令时,将返回地址从堆栈中取出并恢复到程序计数器中;第2返回装置在判断一指令为第2子程序返回指令时,就从专用寄存器中取出返回地址并恢复到程序计数器中。
如上所述,根据权利要求1所记述的处理器,当在所取指令为子程序调用指令时,根据子程序调用装置,把下一指令的地址作为返回地址,保存到堆栈中和保存到用于存放特定运算的运算结果的专用寄存器中;而在取出了第2子程序返回指令时,利用第2返回装置,从用于保存特定运算的运算结果的专用寄存器中取出返回地址并恢复到程序计数器中,因此,就不必再设置保存返回地址的专用寄存器,也可以减少为了恢复状态而对堆栈的存取次数。因此就可以用较低成本制造出能高速从子程序返回的处理器。
此外,可以认为“前述专用寄存器,就是设置来保存运算器的乘法、除法、求余运算中的某一运算结果的寄存器”。
此外,根据权利要求2所记载的处理器中,由于专用寄存器用于保存乘法、除法、求余运算的运算结果,但这些运算在转移目标子程序中的使用频度很低,因此对不包含上述运算的子程序,就可以利用这一专用寄存器完成状态恢复。因而,利用专用寄存器来进行返回地址的暂存是很适宜的。
此处,可以认为“前述专用寄存器系指为了保存超过运算器长度的那部分运算结果而设置的寄存器”。
此外,根据权利要求3所记载的处理器,因为专用寄存器是为了保存超过了运算器长度的运算结果而设置的寄存器,而这些运算在作为转移目标子程序中,其使用频度很低,因此在不包含这些运算的子程序中,就可以利用这专用寄存器完成状态恢复。因此,利用专用寄存器来进行返回地址的暂存是非常适宜的。
此处,可以认为,“前述专用寄存器是指为了保存运算器的运算结果的高位数据或低位数据之中的某一方而设置的寄存器”。
此外,根据权利请求4所记述之处理器,由于其专用寄存器是为了保存运算结果的高位数据或低位数据而设置的寄存器,在处理器以程序设计语言写的经翻译得到的机器语言程序作为对象时,作为转移目标子程序中这样的寄存器使用频度非常之低,因此,大量的子程序可以使用专用寄存器进行状态恢复,因而,对堆栈的存取次数确实可以大大减少。
本发明的第二个目的,可以根据下述结构来实现。即,提供一生成由多个子程序构成的机器语言程序、并将所生成的机器语言程序加以改写的程序翻译装置上(各子程序包含有从堆栈中取得返回地址进行返回的第1子程序返回指令,在子程序中的另一部分指令中,则包含有子程序调用指令、或包含有用专用寄存器来保存运算结果的特定运算指令),在该装置上设置有子程序取指机构、判定机构、检测机构以及返回指令改写机构。取指机构用于从所生成的机器语言程序中逐一取出所含有的全部子程序;对由取指机构所取出的子程序内的所有指令,则由判定机构判定这些指令中是否含有子程序调用指令或者是否含有将运算结果保存到专用寄存器中的特定运算指令;检测机构用于从不包含上述指令的子程序中检出第1子程序返回指令;而返回指令改写机构则将由检测机构检出的第1子程序返回指令,改写为从专用寄存器中取得返回地址的第2子程序返回指令。”
此外,根据权利要求5所记载的程序翻译装置中,对于某些子程序,如果它们不包含子程序调用指令,但包含有不将特定运算结果保存到专用寄存器中的指令,因为将其中的第1类子程序返回指令改写为第2类子程序返回指令,因而可以生成只从专用寄存器中来取得返回地址的机器语言程序。因之,可以在处理器用来保存运算结果的专用寄存器中保存返回地址。从而,根据本翻译装置所产生的机器语言程序,可以使返回地址的保存和运算结果的保存使用同一个寄存器。不必再专门为保存返回地址而设置一个返址专用寄存器,也可实现从子程序的高速返回。
此处,可以认为“前述的特定运算指令,是指乘法、除法或求余指令中的某些指令”。
此外,根据权利要求6所记载的程序翻译装置,由于考虑到乘法、除法及求余运算在转移目标的子程序中使用频度较低,在这类使用频度很低的子程序内,将其第1类子程序调用指令置换为第2类子程序调用指令,在被置换了的机器语言程序中,处理器内对不含这些运算的子程序可以利用其专用寄存器来完成状态恢复。因此,使用处理器中的专用寄存器来暂存返回地址是适宜的。
此处,可以认为“前述特定运算指令,就是指超过运算器长度的运算指令”。
此外,根据权利要求7所记载的程序翻译装置,由于超过运算器长度的运算在转移目标的子程序中的使用频度很低,因为在这样的使用频度很低的子程序内的第1类子程序调用指令置换为第2类子程序调用指令,因此被置换后的机器语言程序中,对不含这些运算的子程序,可以用处理器中的专用寄存器来实现状态返回。因之,利用处理器的专用寄存器来暂存返回地址是很合适的。
图1是先有的处理器指令格式的一个例子的示意图。
图2是先有的处理器进行子程序调用以及从子程序完成状态返回的流程示意图。
图3是汇编语言程序的输出代码的示意图。
图4示出本实施例中的编译程序的结构。
图5是源程序与根据源程序所生成的汇编程序的对照图。
图6示出本实施例中的处理器指令的格式。
图7是生成代码改写装置的结构示意图。
图8是经编译后作为输出代码的汇编程序示意图。
图9是包含有特殊返回指令的机器语言程序执行情况示意图。
图10是程序翻译处理过程的流程示意图。
图11是处理器结构示意图。
图12是处理器执行子程序调用以及从子程序的状态返回的示意流程图。
图4是编译程序的构成图。如图4所示,编译程序由句法分析装置11,优化装置12,资源分配装置13和代码生成装置14所构成。
句法分析装置11对存储器(未示出)中作为文件存储的源程序,进行词汇分析、语法分析和语意分析,并将源程序变换为中间目标程序。
优化装置12为了减少最终生成的汇编程序的程序长度、以及为了加快处理速度,对中间目标程序进行优化,在该优化过程中,包括着基本分块操作、控制流分析、数据流分析等作业。此处的基本分块操作,就是将作为处理对象的中间目标程序分解为若干基本块。
现在对该分块处理作一简单说明。首先,优化装置12检测中间目标程序的最初的中间指令、无条件或条件转移目标的中间指令、以及紧接着无条件或条件转移目标的中间指令,并把这些检测出的中间指令看作前导。进而,优化装置12,从前导开始,直到碰到下一个前导之前,或者是直到程序的最后,把一系列的中间指令抽出。由这一处理过程所得到的指令序列,就称作基本块,作为下一步处理的单位。
所谓控制流分析,就是对各基本块间的控制流进行分析。
所谓数据流分析,就是对各基本块中的每一变量,分析它在何处定义,在何处被引用。通过参照这些分析结果,就可以得到变量的生存期间的信息。
资源分配装置13,为了使得适应目标机器的处理器指令集,将中间程序中的变量分配到目标机器的处理器中所拥有的寄存器或者存储器。在进行这一资源分配时,对各变量的生存期间怎样进行重迭进行调整,对于这些重迭的变量,给它们分配不同的寄存器。此外,资源分配装置13,对各变量的嵌套层数到底有多少层,或者各变量的使用频度到底有多大等进行调查,根据调查结果,给各变量分配优先级。并且按优先级的顺序来分配寄存器。最后,对没有分配到寄存器的变量,将它们分配到内存中。
代码生成装置14,包括有生成代码改写装置,把中间目标程序内的各中间指令转换为机器指令,从而将中间目标程序变换为目标机器可执行的汇编程序。此处所指源程序和汇编程序,参照图5加以说明。图5是源程序和根据源程序而产生的汇编程序的对应关系示意图。在图5(a)中,main( ),f1( ),f2( ),f3( )分别表示函数。此外,本图中“main( ){ }”中的“f1(1);”表示以参数1来调用函数的指令。另外,在“main( ){ }”中的“f3(2);”表示以参数2来调用函数的指令。
关于源程序和汇编程序的对应关系,参照图5(b)来加以说明。本图中从“mov #1,D0”“jsr_f1”“mov #2,D0”起,直到“rst”的指令为止之间的指令,本图中以符号“}”来与main函数对应。此处的main函数,本图中由“mov #1,D0”-“rst”之间的指令构成。
此外,从指令“mov #1,D1”“add D1,D0”起到“rts”之间的指令,本图中以符号“}”来与函数f1相对应。本图中表示了函数f1是由“mov #1,D1”-“rts”之间的指令构成。
进而,本图中从“mov #3,D1”“mul D0,D1”起至“rts”止的指令,以符号“}”与函数f2相对应。本图中表示出函数f2由“mov#3,D1”-“rts”之间的指令构成。
此外,本图中的源代码与汇编程序码之间相互对应的部分,在它们之间以“{”标记之。也就是说,对图中的函数调用指令“f(1);”,用符号“{”来与“mov #1,D0”“jsr_f1”相对应。这样一来,从源程序中的函数调用指令“f(1)”的代码,生成了“mov #1,D0”也就是将立即值1送入寄存器D0的指令以及“jsr_f1”亦即函数调用指令。
此外,图中的函数调用指令“f3(2)”,用“{”来表示它与“mov#2,D0”“jsr_f3”的对应关系。这也就是说,从源程序中的函数调用指令“f3(2);”生成了“mov #2,D0”也就是将立即数传送给寄存器D0的传送指令以及“jsr_f3”亦即函数调用指令。
进而,图中的乘法指令“b=a*3”,用“{”来与“mov #3,D1”“mul D0,D1”相对应。这意味着从源程序中的乘法命令“b=a*3”,生成了“mov #3,D1”也就是将立即数3送入寄存器D1的指令以及“mul D0,D1”亦即乘法指令。
此外,本图中,寄存器D0、D1全都是16位长的寄存器。进而,也指明了本图中的指令“add D1,D0”“mul D1,D0”“mulD0,D1”“add D0,D1”这样的指令,都是将16位长的运算结果存入16位长的寄存器中。这是因为本编译程序以字长16位的处理器为对象,此外,上述规格基本上是根据运算结果和运算内容是以同一长度进行处理的这一语法规定来执行的。
其次,用图6来说明本实施例的信息处理装置的指令的一部分格式。图6就是表示本实施例中的作为对象的字长16位的处理器的命令格式的示例。今参照本图,对上述处理器的指令格式加以说明。本图中Dn、Dm表示通用计算用寄存器。此外,用MR来表示既用于保存乘、除法运算的高位数据、又用来保存函数调用时的返回地址的返址/运算兼用寄存器。PC表示程序计数器的值。label(label可为任意名字)是标号名,#imm表示立即数。
jsr_f1:
这是函数调用指令。当取出了函数调用指令时,处理器的动作与现存技术所说明的基本上是一样的,但不同的是将函数调用指令的下一条指令的地址,保存到返址/运算兼用寄存器MR中。
rtsf:特殊返回指令
该指令就是实施例中的特殊返回指令。当取出特殊返回指令时处理器的动作与先有技术所说明的动作大体相同,所不同的是将返址/运算兼用寄存器MR中所保存的返回地址,送入程序计数器中。
add Dn,Dm:
该指令是加法指令,当取出此指令时,处理器将Dn和Dm之值相加,并将其和存入寄存器Dm中。
mov Dn,Dm:
这是传送指令,当取出本指令时,处理器将寄存器Dn中的数据传送到寄存器Dm中。
mov # imm,Dm:
本指令是把立即数作为操作数的传送指令,当取出本指令时,处理器将立即数(#imm)送入寄存器Dm中。
mul Dn,Dm:
这是一条乘法指令,当取出此指令时,寄存器Dn和寄存器Dm相乘,积的高位数据存放到返址/运算兼用寄存器MR中,低位数据存放到寄存器Dm中。
图7是生成代码改写装置的示意图。
生成代码改写装置由控制部101、函数检测部102、返址/运算兼用保持状态检测部103和特殊返回指令输出部104组成。
控制部101对函数检出部102,返址/运算兼用保持状态检测部103、特殊返回指令输出部104加以控制,使它们按顺序起动。
函数检测部102检出程序中设有函数调用指令的函数。
返址/运算兼用保持状态检测部103,检测下述指令,包括往运算用寄存器MR存放高位结果数据的乘法指令、除法指令、求余指令或往运算用寄存器MR中传送的传送指令,并对前述函数检测部102所检测出的函数中是否改变过返址/运算兼用寄存器的值加以确认。此外,返址/运算兼用保持状态检测部103之所以能够进行这样的确认,是因为对上述的返址/运算兼用寄存器的状态进行判断,看是否可能将它作为返回地址的保存区。
特殊返回指令输出部104把前述函数检测部102检出的函数末尾的返回指令改写为特殊返回指令。
如上那样构成的生成代码改写装置,将代码生成装置14生成的汇编语言程序进行改写的情形,以图8和图9的程序为例,参照图10的流程图进行说明。
图8表示图5(b)中的汇编语言程序的各指令被存储到相应的存储器上各存储地址的状态。
按图8的状态,函数检测部102首先检测出了表示函数main的起始位置的_main标号(步51)。检出后,顺序检索汇编程序标号_main以后所排列的指令,亦即函数_main中的指令,以判定函数main内部是否存在函数调用指令。由于函数main中存在有函数调用指令“jsr_f1”、“jsr_f3”(步2),因此,检出这些函数调用指令,检索到此处暂停,继之,对函数f1的内部进行检索(步S1,S2)。函数检测部102检索函数f1所在的相对地址0105~0108中的各指令,进一步判定函数f1中是否存在函数调用指令(步S2)。因为在函数f1中存在有对函数f2的函数调用指令“jsr_f2”,因此,检索到此暂停,转去检索下一函数f2(步S1)。函数检测部102,继续检索函数f2内部的相对地址0109~010C内的各指令,以判断是否存在函数调用指令(步S2)。在这情形,因为函数f2中已没有函数调用指令,因此起动返址/运算兼用保持状态检测部103。
返址/运算兼用保持状态检测部103对函数f2内的相对地址0109~010C中的指令进行检索,判断在函数f2内部,返址/运算兼用寄存器的值是否已被改变(步3),也就是判定“mul Dn,Dm”等将返址/运算兼用寄存器用来存放运算结果的这类运算是否存在于函数f2中。由于函数f2中,存在有“mul D0,D1”这样的把运算结果保存到返址/运算兼用寄存器的指令,检索到此暂停,转去检索下一函数f3(步S1)。
函数检测部102顺序检索函数f3内相对地址010d~010f之间的指令,判断该函数f3内是否存在函数调用指令。
在函数f3中,并未发现“jsr”这样的操作码,因为没有函数调用(步S2),就起动返址/运算兼用保持状态检测部103,对函数f3内的指令,即相对地址为010d~010f之间的指令进行检索,确认了在函数f3内并不存在有把返址/运算兼用寄存器用来保存运算结果的指令。因为函数f3中没有这样的指令存在,返址/运算兼用保持状态检测部103便起动特殊返回指令输出部104(步S4),被起动的特殊返回指令输出部104便把函数f3末尾部分的指令(ex16)改写为特殊返回指令rtsf(ex16′)。上述一系列处理的结果,图8中的汇编程序,就变成了图9左半部的状态。
下面利用图示,就本发明的一个实施例中的处理器的内部结构加以说明。
图11是本实施例中的处理器的结构图。如本图所示,处理器由下述部分组成,它们包括指令缓冲器(图中略记为IB)32,选择器34,指令寄存器(图中略记为IR)35,数据寄存器组41,地址寄存器组42,选择器43,堆栈指针44,ALU 51,选择器54和55,返址/运算兼用寄存器(MR)56,移位寄存器(图中略记为SFT)57,选择器58,移位寄存器(图中略记为SFTMD)59,程序计数器61,指令地址缓冲器(图中略记为IAB)66,选择器67,指令缓冲器(图中略记为IFB)73,操作码地址缓冲器(图中略记为OAB)74,存储缓冲器(图中略记为STB)75,加载缓冲器(图中略记为LDB)76等所构成,它们之间通过总线(图中略记为ABUS)、第1数据总线(图中略记为B1BUS),第2数据总线(图中略记为B2BUS),LDBUS,指令总线(图中略记为IBUS)等相互连接,如图中所示。
指令缓冲器(以后略记为IB)32,长度为8位,是一个三段缓冲器,在指令被执行之前,预先从内存中取出,并储存到该指令缓冲器中。例如在该IB 32中,如前所述的“jsr_f1”等函数调用指令、“mul D0,D1”等乘法指令,或多或少地以机器语言的状态存储到该缓冲器中。
选择器34,选择从IB32输入的指令或从IBUS上输入的指令中的某一个。
指令寄存器(以下略记为IR)35,保存从选择器34中所输出的指令。
数据寄存器组41,主要用来保存数据,它的长度为16位,共4个寄存器。
地址寄存器组42,主要用来保存地址,它的长度为16位,共4个寄存器。
选择器43,从ABUS和LDB76之间,选择性地向数据寄存器组41、地址寄存器组42以及堆栈指针44输出。
堆栈指针44,保持有内存RAM78中作为堆栈用的区域的首地址。
ALU 51进行16位长的数据的运算和地址运算。
选择器54、55选择应当输入到ALU中的操作数。
返址/运算兼用寄存器MR 56,是保持乘除运算结果或除法运算结果的高位字节、保存求余运算结果的余数的16位长的寄存器。此外,它也用来保存函数的返回地址。
此外,如果本发明的处理器对C语言编译器编译得到的机器语言程序进行操作,该返址/运算兼用寄存器56的使用频度很低。为什么呢?因为按C语言的一般规定,原则上“16位长的运算结果是16位长,32位长的运算结果是32位长”,运算对象和运算结果按语法规定应有相同的长度,此外,因为上述数据寄存器、地址寄存器、数据总线、地址总线均为16位长,编译程序将乘法的运算结果化为16位,从而生成机器语言程序。又,在本实施例中,以16位长为前提加以说明,当然对其它的长度也是适用的。
移位寄存器(以下略记为SFT)57在接受了ALU 51的输出时,进行移位操作。当移位结束后,SFT 57保存运算结果的高位字节。另外在ALU 51进行除法运算时,SFT 57保存计算结果的商。
选择器58,用来选择ABUS上的数据或者SFTMD 59上的数据。
移位寄存器(从下略记为SFTMD)59,在接受了选择器58的输出时,与ALU 51一起进行移位操作,当移位结束后,SFTMD59保存计算结果低位数据。此外,ALU 51在进行除法运算时,SFT 57保存其计算结果。
程序计数器61,由预取计数缓冲器(图中略记为PFCB,以后,用此略称)62,选择器63,程序计数缓冲器(图中略记为PCB,以后用此略称)64,选择器67构成。
PFC 62是一个16位长的寄存器,它保存有预取指令的地址。
程序计数缓冲器PCB 64,是一个16位长的寄存器,经常保持PFCB 62的一个时钟周期之后的值。
选择器63,用来在PCB 64和PFCB 62之间进行选择数据,并将之输出到ABUS或B1BUS上。
指令地址缓冲器(图中略记为IAB,以后使用这一略称)66,将应当取出的指令的地址发送到地址总线。
指令缓冲器(图中,略记为IFB,今后使用这一略称)73,操作数地址缓冲器(图中记为OAB,以后用此略称)74,存储缓冲器(图中略记为SB,以后用此略称)75,装入缓冲器(图中略记为LB,以后用此略称)76分别是为保存指令、保存操作数地址、保存存储数据或保存装入数据的缓冲器。
RAM 78及ROM 79分别用来保存数据和指令。
ABUS与堆栈指针44,数据寄存器组41、地址寄存器组42、SFTMD 59、选择器63、返址/运算兼用寄存器56、LDB 76、ALU51以及SFT 57的输出端相连接,根据这样的选择关系,可以知道堆栈指针44、数据寄存器组41、地址寄存器组42的值,是通过ABUS而发送给ALU 51的。此外,也可知道返址/运算兼用寄存器56的值,亦即状态返回时的返回地址,也是通过ABUS而传送给ALU 51的。更进一步还可明白,SFT 57和SFTMD 59中所保存的乘积,也是通过这个ABUS和选择器43,而传送给返址/运算兼用寄存器56及数据寄存器组42的。
B1BUS与选择器63、堆栈指针44、地址寄存器组42的输出端相连接,与选择器54的输入端相连接。根据这样的连接关系可知,选择器63对PFCB 62或PCB 64进行选择,并将被选择的值通过B1BUS传送给ALU 51。
B2BUS与IB 32,返址/运算兼用寄存器56,数据寄存器组41,LDB 76的输出端相连接,也与选择器54,选择器55以及LDB 76的输入端相连接。根据这样的连接关系可知,IB 32中保存的指令的一部分,例如jsr@(disp,pc)的disp等,经由这个B2BUS,传送给ALU 51。
参照对上述方式构成的处理器,说明在图6中所示的各指令的执行情况。
首先说明函数调用指令(jsr)执行时的动作。
在图6所示的jsr指令的(1)的动作如下,通过将堆栈指针44的值,传送到ALU 51中,计算SP-2之值并送入SP,从ALU51下方的黑点111,其右边的黑点112起,经由指向ABUS的总线,从ABUS起经由选择器43,传送计算结果到堆栈指针44。
图6中jsr指令的(2)所示的动作如下:
通过OAB 74,将堆栈指针44的值传送到地址总线,根据选择器63对PCB 64进行选择和输出,将PCB 64的值(根据INC65递增之后的下一指令的地址),经由STB 75,保存到存储器78中的由堆栈指针44所指示的位置。换言之,将返回地址压入堆栈。
图6中jsr指令(3)所示动作如下:
选择器63选择PCB 64的值,而PCB的值(下一指令的地址)经由其上的黑点114起,到其右边的黑点115,再经过选择器63,ABUS之后,传送到返址/运算兼用寄存器56中。
图6中jsr指令(4)所示的动作如下:
选择器63选择PFCB 62,PFCB 62(PC)的值,通过选择器63,从B1BUS送入ALU 51中。IB 32中所存储着的程序计数器PC的相对地址(disp)通过B2BUS送入ALU 51中。ALU 51计算出的跳转目的地址(PC+disp)从ALU 51设置到IAB 66和PCB 64中。设定之后,IB 32中的指令全被清除。
图6中rts指令(1)所示的执行动作如下:
DEC 80对返回指令译码之后,将堆栈指针44的值SP经由ALU 51以及通过ALU 51下方的黑色圆点111,以及其右的黑圆点112,从OAB 74,送入地址总线。从而,在RAM 78中的堆栈内所保存的返回地址,经过RAM 78一侧的数据总线、LDB76,从ABUS起,经由ALU 51,选择器67,被传送到PCB 64中。此外,还同时将返回地址传送给IAB 66,并随即将IB 32中的指令全部清除。
图6所示的rts指令(2)中的动作如下:当图6(1)的动作完成之后,接着根据堆栈指针44将其值SP,经由ABUS,传送到ALU51中,并计算SP+2。计算结果经过ALU 51下方的黑色圆点111、它的右边的黑圆点112,并通过从该处指向ABUS的总线,经过ABUS转向右方,再通过其上方的选择器43,被传送到栈指针44中。
图6中的特殊返回指令rtsf的(1)的动作如下:当DEC 80对返回指令(rtsf指令)译码之后,在返址/运算兼用寄存器56中所保存的返回地址,被送到ABUS上,从ABUS起,经选择器67,送入PCB 64的同时,返回地址也被传送到IAB 66中,处理控制转移到返回地址。与此同时,IB 32中的所有指令均被清除。
图6中的rtsf指令(2)的动作如下:在完成了上述(1)的动作之后,栈指针44的值经由ABUS被送到ALU 51中,在ALU 51中计算SP+2,计算的结果经ALU 51下方的黑圆点111,其右边的黑圆点112,通过从该处指向ABUS的总线,经由ABUS向右,再通过其上方的选择器43,传送到栈指针44中。
乘法指令执行时的动作如下:当DEC 80对乘法指令mul译码之后,寄存器Dn(乘数)的值被送到B2BUS上,并到达ALU51中,此外,寄存器Dm(被乘数)的值被送到B1BUS上,然后进入ALU 51中。ALU 51将乘数和被乘数相乘,其积的低位字节经过SFTMD 59移位,而高位字节被保存到SFT 57中。在SFT 57中所保存的乘积的高位字节,经过ALU 51的下方的黑圆点111,其右边的黑圆点112,被送到ABUS上,从而传送给返址/运算兼用寄存器56。而SFT 57中所保存的乘积低位字节,从SFTMD 59经过ABUS,再经过上方的选择器43,被送入寄存器DR之中。
其次,再对函数调用以及从被调用函数的状态返回的过程加以说明。图12中将处理器的处理过程用流程图来表示。图9中表示出了由生成代码改写装置改写之后的程序。本图中左侧的箭头表示了本程序中的执行顺序是怎样改变的。此外,右侧的标有stage1,stage2,stage3等字串的矩形,模拟为堆栈及返址/运算兼用寄存器56,其内的数值“0102”、“0104”,表示执行函数调用时在其内所保存的返回地址。下面,参照这些图,对前述结构的处理器进行函数调用和状态返回时的过程加以说明。
先对程序计数器的设定和指令的取出加以说明。当处理器起动之后,程序首址被置入PCB 64中,同时也设定到IAB 66中。在IAB 66中所设定的程序首地址被送到地址总线上。
程序计数器61内的程序计数器缓冲器PCB 64的值,通过INC 65,将地址每两个字节或者一个字节进行递增。将递增的结果重新去设定PCB 64,同时,设定到IAB 66中。与此同时,将递增之前PCB 64之值被传送到PFCB 62中,这样一来,程序计数器缓冲器PCB 64的值便通过INC 55,就使程序计数器的值不断更新,因而不断读入ROM 79中的机器语言程序。
当程序未开始执行或者在执行函数调用的分枝指令而IB 32为空时,指令的第一个字节从IBUS直接保存到IR 35中。因为地址总线、数据总线都是16位,而IB 32的宽是8位,每当程序计数器PC的值PCB每递增1,则一个字节长的指令便被保存到IB 32中。此外,每当程序计数器PC的值PCB被递增2时,2个字节长的指令便被保存到IB 32中(步t2)。IB 32内所保存的指令之中,其开始的部分被传送到IR 35中。在IR 35中所设置上的指令,进而被传送到DEC 80中,根据这样的传送,在DEC 80中对该指令进行译码。另一方面,在IB 32中保存的指令,以先进先出(FIFO)方式,顺次传送到IR 35之中。
此处,当设有指令的地址被送到地址总线上时,也就是没有指令存在的地址被设定到PCB 64或IAB 66时,或者是读入了表示程序结束的指令时,就认为是程序的结束,从而终止处理(步t1)。
指令“mov #1,D1”的执行过程如下:当程序开始执行后,程序的首地址0100被设定到了PCB 64和IAB 66中。被设定的IAB 66的值0100被送到地址总线上,从而取得了相对地址0100的指令“mov #1,D1”。并且,判断所取出的指令是否是函数调用指令(步t3)。因为相对地址0100的指令“mov #1,D0”是将立即数#1传送到寄存器D0的传送指令而不是函数调用指令,所以,要判断指令“mov #1,D0”是否为特殊返回指令(步t4)。由于“mov #1,D0”不是特殊返回指令,因此执行该指令(步t5)。执行后PCB 64的值增加到0101,将下一条指令,即相对地址0101的函数调用指令“jsr_f1”取出(步t2)。
相对地址0101的函数调用指令的执行过程如下:当取出了“jsr_f1”之后,IB 32中填入“jsr_f1”的3字节长的机器语言代码。这时IB 32的内容为:第一字节存放jsr指令(1字节长)的操作码,第二字节存放转移目标地址(或者PCB 64中的相对地址disp(位移))的低位字节,第三字节存放转移目标地址(或PCB 64中的相对地址(disp:即位移))的高位字节。这样一来,对DEC 80而言,jsr指令的操作码被传送到了DEC 80中。传送后,DEC 80要判断从IB 32传送过来的指令是否为函数调用指令(步t3)。由于相对地址0101的指令“jsr_f1”是一函数调用指令,因而将栈指针44的值传送到ALU 51中,在ALU 51中,根据栈指针44的SP,计算SP-2,其结果再送回栈指针44中。
继而,将栈指针44的值SP,送到地址总线上,使之指向存储器78内的区域。在该指示的区域内把PCB 64中的下一条指令的地址保存起来。因此,返回地址便被压入堆栈(步t6)。
接着,将PCB 64的值(下一条指令的地址)向返址/运算兼用寄存器56传送,保存到返址/运算兼用寄存器56中。作为其结果,堆栈和返址/运算兼用寄存器56中的存储状态如图9的stage1所示。
当DEC 80对IR 35中的1字节长的jsr指令进行译码时,IB 32中保存着jsr指令的2个字节的跳转地址。接着使用保存在此IB 32中的值与指令计数器PC的值来计算跳转地址,并将该地址设定到PCB 64和IAB 66中。这样一来,由于设定了跳转地址,因而便进行了函数调用。设定之后,由于IB 32中函数调用指令之后所列的指令已不起作用,因此将它们清除掉(步t7)。
函数f1及f2内的处理过程如下:当控制转移到函数f1之后,将函数f1中相对地址0105的指令“mov #1,D1”和相对地址0106的“add D0,D1”顺次取出和执行(步t1~t5)。跟随这些指令之后的相对地址0107的指令“jsr_f2”也被取出(步t2),并判断其是否函数调用指令(步t3)。因为该指令为函数调用指令,因而将其指令之后的下一指令的地址,即相对地址0108(PC+1=0107+1=0108)作为返回地址压入堆栈中(步t6),更进一步,将返回地址0108存放到返址/运算兼用寄存器56中。其结果,堆栈及返址/运算兼用寄存器56的存储状态如图9的Stage3所示,也就是说,返回地址被压入堆栈中,而返址/运算兼用寄存器56中保存的值,是用返回地址0108来更新过的值。当保存了返回地址0108之后,计算跳转地址(PC+disp(位移=0002))之值,并将计算结果传送到程序计数器61中(步t7)。
由于这样地将跳转地址(函数f2的首地址0109)传送到PC中,因此控制转移到函数f2。控制转移后,顺次取出相对地址0109,相对地址010a,010b,010c...的指令并予执行(步t1~t5)。取出相对地址0109的指令“mov #3,D1”并执行之后,又取出相对地址010a的指令“mul D0,D1”,将其交给DEC 80。DEC80将其译码为一乘法指令(mul指令),就将寄存器Dn(乘数之值送到B2BUS之上,进入ALU 51中。此外,寄存器Dm(被乘数)之值被送到B1BUS上,进入ALU 51中,ALU 51将乘数和被乘数相乘,将乘积的低位字节在SFTMD 59中移位,高位字节被存储到SFT 57中。保存在SFT 57中的乘积的高位字节,经由ALU51下面的黑圆点111,右边的黑圆点112,送到ABUS上,传送到返址/运算兼用寄存器56中。保存在SFT 57中的乘积的低位字节则从SFTMD 59,经由ABUS,并通过上方的选择器43,传送到寄存器DR之中。这样一来,当执行了乘法指令之后,返址/运算兼用寄存器56变为保存乘积的高位字节的状态。其结果,堆栈及返址/运算兼用寄存器56的存储状态变为如图9的Stage5所示的状态。也就是说,返回地址0108被保存在堆栈中,而返址/运算兼用寄存器56中所保存的值,被乘积结果所改写。
继而取出相对地址010b中的指令“add D0,D1”,执行该指令后,取出相对地址010c的指令(步t1,t2)。
相对地址010c中的rts指令的执行过程如下:这时,堆栈变为stage6的状态,因为取出的相对地址010c中的指令为返回指令“rts”,因而堆栈指针44的值SP经由ALU 51,再经过ALU51下面的黑圆点111,以及其右边的黑圆点112,从OAB 74送到地址总线上。据此,在RAM 78中的堆栈中所保存的返回地址0108,经由RAM 78一侧的数据总线、LDB 76、从ABUS起,经过ALU 51,选择器67,传送并保存到PCB 64中。与此同时,返回地址0108被传送到IAB 66中。在这样的传送之后,因为在IB32中的rts指令之后所列的一连串指令已无作用,因而将它们清除。并且,这样的传送过程,在图9中的stage6中,以箭头←加以表示。
清除完成后,堆栈指针44的值SP,经由ABUS,被传送到ALU 51中,并计算SP+2。计算的结果经过ALU 51下方的黑圆点111,其右边的黑圆点112,通过从该处指向ABUS的总线,经由ABUS,转向右方,再通过其上的选择器43,传送到栈指针44中。这样一来,从函数f2的处理返回,在下一步中,读出相对地址0108中的指令。
从相对地址0108的返回指令“rts”起,到相对地址010e的指令“add D0,D1”止的动作过程如下:因为相对地址0108的指令是返回指令“rts”,因而再次存取堆栈,从堆栈中取出返回地址0102,被取出的返回地址0102被传送到程序计数器61中(步t3,t4,t5)(图9的stage4)。
传送后,取出相对地址0102中的指令并予执行(步t1~t5)。
相对地址0102的指令被执行后,取出相对地址0103的指令。因为相对地址0103的指令是函数调用指令“jsr_f3”,因而下一条指令的地址,也就是相对地址0104被作为返回地址存放到堆栈和返址/运算兼用寄存器56中(stage2),计算转移目标地址(PC+disp),控制向函数_f3转移(步t6、t7)。由于控制的转移,取出相对地址010d的指令“mov #1,D1”,相对地址010e的指令“add D0,D1”,顺次执行之(步t1~t5)。接着取出相对地址010f的指令。
特殊返回指令(rtsf指令)的执行过程如下:DEC 80对相对地址010f的rtsf指令进行译码,返址/运算兼用寄存器56中所保存的返回地址0104被送到ABUS上,从ABUS经由ALU 51,选择器67传送到PCB 64中。与此同时,返回地址0104被传送到IAB 66中。这时的返址/运算兼用寄存器56的状况如图9的stage7所示。也就是说,返址/运算兼用寄存器56中保存的值被改写为0104。由于这样的传送,完成了从子程序到函数main的状态返回。在这样的处理之后,IB 32中的rtsf指令之后所列的一连串指令已没有作用,将它们予以清除。
此后,栈指针44的值SP经由ABUS,传送到ALU 51,由ALU 51计算SP+2之值,计算结果经由ALU 51之下的黑圆点111,右方的黑圆点112,并通过从该处指向ABUS的总线,再经由ABUS转向右方,通过上述的选择器43,传送到栈指针44中。这一状态在图9的Stage7,由箭头←进行表示。也就是利用从返址/运算兼用寄存器56向程序计数器PC传送返回地址,便可知道已完成了状态恢复。
如上所述,按本实施例,即使不设置保存返回地址的专用寄存器,也可以减少为进行状态恢复而对堆栈的存取次数。
此外,在不脱离本实施例的主旨的范围内,也可以变更实施。
本实施例中,运算结果的保存、返回地址的保存均由保存乘法、除法、求余运算结果高位数据的寄存器(返址/运算兼用寄存器)来担当,当然也可以用其它的寄存器来担当。
例如,可由为保存加法、减法、移位运算运算结果高位数据而设的寄存器来担当。
此外,即使没有返址/运算兼用寄存器,也可以用其它使用频度比较低的寄存器。也就是说,也可以用处理器中为保存超过运算器长度的运算的运算结果而设置的寄存器。例如,本实施例中,ALU 51的运算长度为16位,在处理器中超过这一长度的运算,也就是说,在运算长度为16位的ALU中,如果设置有为保存32位长、64位长运算的运算结果的寄存器时,大体来说,这样的寄存器的使用频度较低,因而也可使用。
更进一步,不一定非用保存运算结果高位数据的寄存器,也可以使用保存运算结果的低位数据而设置的寄存器来保存返回地址。
此外,本实施例中,返址/运算兼用寄存器只有一段,把它设置为3段、4段,使其能保存3、4个以上的返回地址也可以。这时,若返址/运算兼用寄存器若为3段,便可保存3个返回地址,如果返址/运算兼用寄存器设为4段,则可保存4个返回地址。为此,生成代码改写装置,可检测出嵌套层数小于返址/运算兼用寄存器的段数的所有函数,并将被测检出的函数中的返回指令改写为特殊返回指令。
这样一来,由于生成代码改写装置进行改写,就可以将多个返回地址保存到返址/运算兼用寄存器中。
更进一步,在本实施例中,由代码生成装置生成汇编程序之后,返回指令被改写为特殊返回指令,例如,可以如以下(a)、(b)所示那样进行变更实施。
(a)最优化装置可利用一个标志,当该标志为ON时,表示可以输出,当为OFF时,表示不能输出,将这样的标志对应于中间目标语言状态的各个函数进行记忆。然后,从中间语言程序状态的程序中,检测出可以输出特殊返回指令的所有函数,对于这些被检出的函数,将表示可以输出特殊返回指令的标志置为ON,而对未检出的函数,该标志位置为OFF。
包括有上述处理的最优化装置的处理结束后,代码生成装置参照这些标志,对于标志为ON的函数,生成一个末尾为一条rtsf指令的子程序,对于标志为OFF的函数,生成末尾为一条rts的指令。
(b)在中间语言状态中,最优化装置检测出中间语言状态的函数中可以输出特殊返回指令的函数,在被检测出的函数末尾可以写入一条表示可以输出特殊返回指令的中间语言指令。
从而,代码生成装置对末尾存在有表示可以输出特殊返回指令的中间语言指令的那些函数,生成一个末尾为rtsf指令的子程序。
对那些末尾不存在用来表示可以输出特殊返回指令的中间语言指令的那些函数,生成一个末尾为rts指令的子程序。

Claims (8)

1.一种处理器,它具有一个顺序从存储器中取出指令的装置,一个对取出的指令进行译码的译码装置,一个当所述指令的译码结果是一特殊运算指令时便进行该特殊运算的运算器,一个当运算器算出结果时能保存该结果的专用寄存器,在具有上述装置的处理器中,本发明的特征在于它包含有下述部分:
第1判定部,它判定由取指装置取出的指令是否为子程序调用指令;
第2判定部,它判定由取指装置所取出的指令是否是一条表示要从堆栈中取得返回地址进行返回的第1类子程序返回指令;
第3判定部,它判定由取指装置所取出的指令,是否是一条表示要从专用寄存器取得返回地址进行返回的第2类子程序返回指令;
前述的处理器还包括有下列装置:
调用装置,当判断是子程序调用指令时,将该指令的下一条指令的地址,作为子程序返回地址保存到堆栈和专用寄存器中,然后调用该子程序;
第1返回装置,在判定为第1类子程序返回指令时,将返回地址从堆栈中取出恢复到程序计数器中;
第2返回装置,当判定为第2类子程序返回指令时,从专用寄存器中取得返回地址,并将其恢复到程序计数器中。
2.根据权利要求1的处理器,其中的专用寄存器是一个运算器中为保存乘法、除法、求余运算之中的某一运算的运算结果而设置的寄存器。
3.根据权利要求1的处理器,其中专用寄存器是为了保存超过运算器长度的运算结果而设置的寄存器。
4.根据权利要求1的处理器,其中专用寄存器是为了保存运算器的高位或低位数据二者中的一个而设置的寄存器。
5.一种生成由多个子程序组成的机器语言程序,并将所生成
的机器语言程序进行改写的程序翻译装置,其中各子程序包含有从堆栈中取得返回地址进行返回的第1类子程序返回指令,子程序中的一部分子程序包含有调用子程序的子程序调用指令或者包含有利用专用寄存器来保存运算结果的特定运算指令,所述程序翻译装置的特征在于,它包含有以下装置:
·取指装置,它将所生成的机器语言程序中所包含的全部子程序逐一取出;
·判定装置,对由取指装置取出的子程序中所有指令进行判断,看其中是否含有子程序调用指令或将运算结果保存到专用寄存器中的特定运算指令;
·检测装置,它从判定为不包含上述指令的子程序中,检测出第1类子程序返回指令;
·改写装置,将检测装置检出的第1类子程序返回指令,改写为从专用寄存器中取得返回地址的第2类子程序返回指令;
6.根据权利要求5的程序翻译装置,前述的特定运算指令是乘法、除法、求余运算指令中的某个指令。
7.根据权利要求5的程序翻译装置,前述的特定运算指令是运算结果超过运算器长度的运算指令。
8.一种将用程序设计语言所编写的多个子程序构成的第1类程序翻译为机器语言程序的程序翻译装置,其特征在于包含下述装置:
取指装置,它将包含在第1类程序中的子程序逐一取出;
判定装置,它对取指装置所取出的子程序中的所有指令进行判定,看其是否包含有调用其它子程序的子程序调用指令,或者是否包含利用专用寄存器来保存运算结果的特定运算指令;
输出装置,它在判定为不包含上述指令的子程序尾部,输出一个特殊标志信息;
机器语言子程序翻译装置,将用程序设计语言所编写的多个子程序翻译为机器语言子程序;机器语言子程序翻译装置则包含着下述装置:
检测部,它检出用程序设计语言所编写的各子程序的尾部是否存在特殊标志信息。
翻译部,将检测出的子程序翻译为机器语言子程序,该机器语言子程序的末尾包含一条从专用寄存器中取得返回地址进行返回的特殊子程序返回指令。
CNB961037164A 1995-05-11 1996-03-22 处理器及程序翻译装置 Expired - Lifetime CN1140870C (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP113455/95 1995-05-11
JP7113455A JP2857600B2 (ja) 1995-05-11 1995-05-11 プロセッサ及びプログラム翻訳装置
JP113455/1995 1995-05-11

Publications (2)

Publication Number Publication Date
CN1138172A true CN1138172A (zh) 1996-12-18
CN1140870C CN1140870C (zh) 2004-03-03

Family

ID=14612679

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB961037164A Expired - Lifetime CN1140870C (zh) 1995-05-11 1996-03-22 处理器及程序翻译装置

Country Status (7)

Country Link
US (1) US6170998B1 (zh)
EP (1) EP0742513B1 (zh)
JP (1) JP2857600B2 (zh)
KR (1) KR100247899B1 (zh)
CN (1) CN1140870C (zh)
DE (1) DE69616867T2 (zh)
TW (1) TW405095B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100346300C (zh) * 2004-03-29 2007-10-31 居里泰尔公司 用多重加载/存储指令初始化系统全局变量的设备和方法
CN100559344C (zh) * 2005-08-23 2009-11-11 中国科学院计算技术研究所 一种支持用规则记录变量访问专用寄存器组的处理方法
CN101452395B (zh) * 2007-11-28 2013-04-24 无锡江南计算技术研究所 函数调用和返回的处理方法、二进制翻译方法和系统
CN107870780A (zh) * 2016-09-28 2018-04-03 华为技术有限公司 数据处理装置和方法

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6553426B2 (en) * 1997-10-06 2003-04-22 Sun Microsystems, Inc. Method apparatus for implementing multiple return sites
US6317796B1 (en) 1997-10-06 2001-11-13 Sun Microsystems, Inc. Inline database for receiver types in object-oriented systems
FR2779842B1 (fr) * 1998-06-15 2001-07-13 Schlumberger Ind Sa Procede de gestion de l'execution d'un programme dans un dispositif a circuit integre
US6757892B1 (en) * 1999-06-24 2004-06-29 Sarnoff Corporation Method for determining an optimal partitioning of data among several memories
US6567975B1 (en) * 1999-11-08 2003-05-20 Sun Microsystems, Inc. Method and apparatus for inserting data prefetch operations using data flow analysis
US6820193B1 (en) * 1999-12-17 2004-11-16 Koninklijke Philips Electronics N.V. Branch instructions with decoupled condition and address
US6910119B1 (en) * 2000-06-21 2005-06-21 Intel Corporation Instruction pipe and stall therefor to accommodate shared access to return stack buffer
US6857063B2 (en) * 2001-02-09 2005-02-15 Freescale Semiconductor, Inc. Data processor and method of operation
US7546451B1 (en) 2002-06-19 2009-06-09 Finisar Corporation Continuously providing instructions to a programmable device
GB2400198B (en) * 2003-04-04 2006-04-05 Advanced Risc Mach Ltd Controlling execution of a block of program instructions within a computer processing system
US7401210B2 (en) * 2005-03-30 2008-07-15 Arm Limited Selecting subroutine return mechanisms
JP5165969B2 (ja) * 2007-08-29 2013-03-21 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラムのコンパイルのために変数にレジスタを割り付ける技術
US9696975B2 (en) * 2010-09-03 2017-07-04 International Business Machines Corporation Allocating register halves independently
CN102364432B (zh) * 2011-10-25 2013-12-18 中国科学院苏州纳米技术与纳米仿生研究所 使用双程序计数器计算待处理指令地址的系统

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4399507A (en) * 1981-06-30 1983-08-16 Ibm Corporation Instruction address stack in the data memory of an instruction-pipelined processor
JPH0752390B2 (ja) * 1985-05-07 1995-06-05 株式会社日立製作所 命令処理装置
US5193205A (en) * 1988-03-01 1993-03-09 Mitsubishi Denki Kabushiki Kaisha Pipeline processor, with return address stack storing only pre-return processed address for judging validity and correction of unprocessed address
US5117498A (en) * 1988-08-19 1992-05-26 Motorola, Inc. Processer with flexible return from subroutine
JPH0769816B2 (ja) * 1988-12-07 1995-07-31 松下電器産業株式会社 データ処理装置
US5222220A (en) * 1989-11-16 1993-06-22 Mehta Hemang S Microprocessor stack built-in guards
US5106467A (en) * 1990-10-05 1992-04-21 Armco Steel Company, L.P. Alkaline leaching of galvanized steel scrap
US5598560A (en) * 1991-03-07 1997-01-28 Digital Equipment Corporation Tracking condition codes in translation code for different machine architectures
DE4211966A1 (de) * 1992-04-09 1993-10-14 Philips Patentverwaltung Anordnung zum Abspeichern und Auslesen von Rücksprungdaten
US5579520A (en) * 1994-05-13 1996-11-26 Borland International, Inc. System and methods for optimizing compiled code according to code object participation in program activities
JPH08212075A (ja) * 1995-01-31 1996-08-20 Nec Corp 情報処理装置

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100346300C (zh) * 2004-03-29 2007-10-31 居里泰尔公司 用多重加载/存储指令初始化系统全局变量的设备和方法
US8627267B2 (en) 2004-03-29 2014-01-07 Pantech Co., Ltd. Apparatus and method for initializing system global variables by using multiple load/store instructions
CN100559344C (zh) * 2005-08-23 2009-11-11 中国科学院计算技术研究所 一种支持用规则记录变量访问专用寄存器组的处理方法
CN101452395B (zh) * 2007-11-28 2013-04-24 无锡江南计算技术研究所 函数调用和返回的处理方法、二进制翻译方法和系统
CN107870780A (zh) * 2016-09-28 2018-04-03 华为技术有限公司 数据处理装置和方法
WO2018059337A1 (zh) * 2016-09-28 2018-04-05 华为技术有限公司 数据处理装置和方法
CN107870780B (zh) * 2016-09-28 2020-04-28 华为技术有限公司 数据处理装置和方法

Also Published As

Publication number Publication date
DE69616867T2 (de) 2002-04-11
KR960042424A (ko) 1996-12-21
TW405095B (en) 2000-09-11
US6170998B1 (en) 2001-01-09
EP0742513B1 (en) 2001-11-14
KR100247899B1 (ko) 2000-03-15
EP0742513A2 (en) 1996-11-13
EP0742513A3 (en) 1997-03-19
JP2857600B2 (ja) 1999-02-17
JPH08305569A (ja) 1996-11-22
CN1140870C (zh) 2004-03-03
DE69616867D1 (de) 2001-12-20

Similar Documents

Publication Publication Date Title
CN1140870C (zh) 处理器及程序翻译装置
CN100351810C (zh) 对特定指令类型的指令执行和数据访问计数的方法和系统
CN1152287C (zh) 二进制程序转换设备和转换方法
CN1613058A (zh) 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备
CN1627270A (zh) 用于对指令执行和数据访问进行计数的方法和设备
CN1302385C (zh) 编译装置
Rauchwerger et al. Run-time methods for parallelizing partially parallel loops
US7865702B2 (en) Stall prediction thread management
CN1842767A (zh) 用于多个异常处理模型的中间表示
US8250557B2 (en) Configuring a dependency graph for dynamic by-pass instruction scheduling
US20100050164A1 (en) Pipelined processor and compiler/scheduler for variable number branch delay slots
CN1513137A (zh) 使用多重指令集的数据处理
CN1278226C (zh) 模拟装置、模拟方法
CN1136184A (zh) 在数据处理系统中改进系统性能的方法和装置
JPH07234792A (ja) コンパイル処理装置
CN1752934A (zh) 编译器、编译方法以及编译程序
WO2012145992A1 (zh) 一种实现值关联间接跳转预测的方法
CN1604049A (zh) 用于自主剖析应用程序的方法和设备
US20120233445A1 (en) Multi-Thread Processors and Methods for Instruction Execution and Synchronization Therein and Computer Program Products Thereof
CN1900910A (zh) 二进制翻译中经由跳转表的多目标分支语句的识别方法
CN1138174A (zh) 高速执行子程序转移指令的程序变换装置和处理器
US7350165B2 (en) Compiler
CN1604044A (zh) 用于指令和数据访问的选择性计数的方法和装置
CN1734415A (zh) 分枝预测装置及分枝预测方法
CN1522404A (zh) 在多指令集系统中对未处理操作的处理

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
ASS Succession or assignment of patent right

Owner name: INTELLECTUAL PROPERTY BRIDGE NO. 1 CO., LTD.

Free format text: FORMER OWNER: MATSUSHITA ELECTRIC INDUSTRIAL CO, LTD.

Effective date: 20150420

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150420

Address after: Tokyo, Japan

Patentee after: GODO KAISHA IP BRIDGE 1

Address before: Osaka Japan

Patentee before: Matsushita Electric Industrial Co., Ltd.

CX01 Expiry of patent term

Granted publication date: 20040303

EXPY Termination of patent right or utility model