专利名称:编译程序、编译程序装置和编译方法
技术领域:
本发明涉及一种将以诸如C++语言的高级程序语言描述的源程序编译成机器语言的编译程序,尤其涉及编译程序的优化。
背景技术:
随着处理器的功能在近些年来被极大地提高,强烈地寻求可以高效地开发处理器所具有的高度功能的高性能编译程序。换句话说,需要高效地产生由目标处理器执行的高级和专用指令的编译程序。
例如,开发了执行媒体处理、例如数字信号处理所需的各种定点格式的运算指令的处理器和执行SIMD(单指令多数据)类型指令的高性能处理器。需要以这样一个处理器为目标的编译程序通过高效地产生各种定点格式的运算指令和SIMD类型指令来优化代码大小和执行速度。
然而,无须说明的是,一个常规编译程序高效地产生处理器执行的关于以诸如C++语言的高级程序语言描述的源程序的高级和专用指令。因此,在用于媒体处理的应用和在代码大小和执行速度方面需要严格条件的其他应用的开发中,用户在当前条件下别无选择地只能描述汇编程序指令中的临界点。但存在一个问题,汇编程序指令的程序设计不仅需要更多的工时,在可维护性和可移植性上与采用诸如C++语言的高级程序语言的开发相比还非常低级。
另外,常规编译程序在其自身中具有用于产生处理器执行的高级和专用指令等的优化处理。换句话说,高效利用目标处理器的特征来用于优化的处理模块被包括在编译程序自身内并集成。因此,当编译程序的功能被扩展或目标编译程序的说明书改变时,需要重新配置整个编译程序。这存在一个问题,必须每次重复编译程序的版本的升级等。
发明内容
考虑到上述问题,本发明的第一个目的是提供一个可以高效地产生处理器执行的高级和专用指令的编译程序。
此外,本发明的第二个目的是提供一个可以在不频繁地重复编译程序自身的版本的升级的情况下通过扩充功能等作出改进的编译程序。
依据本发明的编译程序将一个源程序翻译成一个机器语言程序,该程序包括运算定义信息,其中定义了对应于一个专用于一个目标处理器的机器语言指令的运算,编译程序包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,其中,中间编码变换步骤包括检测子步骤,检测中间编码中的一个是否引用(refer to)在运算定义信息中定义的运算;以及,替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。
例如,依据本发明的程序由源程序中包括的主文件(header file)和将源程序翻译成机器语言程序的编译程序组成;在主文件中,定义了一个由数据和方法组成的类;编译程序包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,其中,中间编码变换步骤包括检测子步骤,检测中间编码中的一个是否引用在主文件中定义的类;以及,替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。
从而,当有一个语句引用在源程序中的主文件中定义的类时,在中间编码被变换成机器语言指令之后对应于该语句的中间编码变成优化处理的目标,因此,中间编码可以与附近的机器语言指令一起被优化。另外,由于编译程序不仅由编译程序自身的功能性能执行优化(优化处理)而且与主文件中的定义相结合来执行优化,所以编译程序可以增加作为优化目标的语句并提高优化水平。
这里,可接受的是该类定义一个定点类型,并且,在检测子步骤中,检测使用定点类型数据的中间编码,并且,仍然可接受的是在类中的方法定义了以定点类型数据为目标的运算符,在检测子步骤中,检测是基于以一个运算为目标的一个运算符和数据类型集合是否适合方法中的定义来执行的,以及,在替代步骤中,其运算符和数据类型的集合适合定义的中间编码被用一个对应的机器语言指令来替代。
从而,由于由主文件定义的定点类型和运算符通过编译程序与普通类型类似地通过简单地在源程序中包括主文件而与普通类型类似地被变换成对应的中间编码和机器语言指令,所以用户可以声明和使用对应于专用于目标处理器的定点模式的类型。
此外,依据本发明的编译程序包括在源程序中包括的主文件和将源程序翻译成机器语言程序的编译程序;在主文件中定义一个函数(function);编译程序包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,其中,中间编码变换步骤包括检测子步骤,检测中间编码中的一个是否引用在主文件中定义的函数;以及,替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。
从而,当有一个语句引用在源程序中的主文件中定义的函数(内置函数)时,在中间编码被变换成由主文件定义的机器语言指令之后,对应于该语句的中间编码变成优化处理的目标,因此,中间编码可以与附近的机器语言指令一起被优化。另外,当用户想要使用专用于处理器的高函数指令(high-functional)时,他仅仅需要描述出主文件被包括在源程序中并且在源程序中调用所需要的内置函数。换句话说,将他从利用汇编程序指令编码中释放出来。
如上所述,采用依据本发明的编译程序,高效地产生目标处理器所执行的高函数和专用指令;以高水平执行优化;以及,通过主文件的灵活响应、例如函数扩展变为可能,因此,编译程序的实用价值非常高,尤其是作为用于需要代码大小和执行速度上的严格说明的媒体处理应用的开发工具。
应该注意,本发明不仅可以实现为类似这个的编译程序,也可以实现为采用在用于编译程序的程序中包括的步骤作为步骤的编译程序装置和其中记录有特征化的编译程序或主文件的计算机可读记录介质。然后,无须说明的是,类似这些的程序和数据文件可以通过诸如CD-ROM的记录介质或诸如因特网的传输媒介被广泛地分布。
作为关于这个申请的技术背景的进一步的信息,在2002年8月2日申请的日本专利申请No.2002-33668在这里被包含来作为参考。
从下面结合附图的描述中,本发明的这些和其他目的、优点和特征将变得明显,其中附图显示了本发明的一个具体实施例。在附图中图1是显示依据本发明的编译程序的目标处理器的示意方框图。
图2是显示处理器的算术和逻辑/比较运算单元的示意图。
图3是显示处理器的桶形移位器的配置的方框图。
图4是显示处理器的变换器的配置的方框图。
图5是显示处理器的除法器的配置的方框图。
图6是显示处理器的乘积运算单元的乘法/求和的配置的方框图。
图7是显示处理器的指令控制单元的配置的方框图。
图8是显示处理器的通用寄存器(R0~R31)的配置的方框图。
图9是显示处理器的连接寄存器(LR)的配置的示意图。
图10是显示处理器的分支寄存器(TAR)的配置的示意图。
图11是显示处理器的程序状态寄存器(PSR)的配置的示意图。
图12是显示处理器的条件标志寄存器(CFR)的配置的示意图。
图13A和13B是显示处理器的累加器(M0,M1)的配置的示意图。
图14是显示处理器的程序计数器(PC)的配置的示意图。
图15是显示处理器的PC保存寄存器(IPC)的配置的示意图。
图16是显示处理器的PSR保存寄存器(IPSR)的配置的示意图。
图17是显示处理器的流水线行为的时序图。
图18是显示在执行一个指令时的处理器的流水线行为的每个阶段的时序图。
图19是显示处理器的并行行为的示意图。
图20是显示由处理器执行的指令的格式的示意图。
图21是解释一个属于类别“ALUadd(加法)系统”的指令的示意图。
图22是解释一个属于类别“ALUsub(减法)系统”的指令的示意图。
图23是解释一个属于类别“ALUlogic(逻辑运算)系统等”的指令的示意图。
图24是解释一个属于类别“CMP(比较运算)系统”的指令的示意图。
图25是解释一个属于类别“mul(乘法)系统”的指令的示意图。
图26是解释一个属于类别“mac(乘积和运算)系统”的指令的示意图。
图27是解释一个属于类别“msu(乘积差)系统”的指令的示意图。
图28是解释一个属于类别“MEMld(从存储器装入)系统”的指令的示意图。
图29是解释一个属于类别“MEMstore(存储在存储器中)系统”的指令的示意图。
图30是解释一个属于类别“BRA(分支)系统”的指令的示意图。
图31是解释一个属于类别“BSasl(算术桶形移位)系统等”的指令的示意图。
图32是解释一个属于类别“BSlsr(逻辑桶形移位)系统等”的指令的示意图。
图33是解释一个属于类别“CNVvaln(算术变换)系统”的指令的示意图。
图34是解释一个属于类别“CNV(普通变换)系统”的指令的示意图。
图35是解释一个属于类别“SATvlpk(饱和处理)系统”的指令的示意图。
图36是解释一个属于类别“ETC(等等)系统”的指令的示意图。
图37是显示依据本发明的编译程序的配置的功能方框图。
图38是显示在运算符定义文件中的清单的一部分的示意图。
图39是显示在运算符定义文件中的清单的一部分的示意图。
图40是显示在运算符定义文件中的清单的一部分的示意图。
图41是显示在运算符定义文件中的清单的一部分的示意图。
图42是显示在运算符定义文件中的清单的一部分的示意图。
图43是显示在运算符定义文件中的清单的一部分的示意图。
图44是显示在运算符定义文件中的清单的一部分的示意图。
图45是显示在运算符定义文件中的清单的一部分的示意图。
图46是显示在运算符定义文件中的清单的一部分的示意图。
图47是显示在运算符定义文件中的清单的一部分的示意图。
图48是显示在运算符定义文件中的清单的一部分的示意图。
图49是显示在运算符定义文件中的清单的一部分的示意图。
图50是显示在运算符定义文件中的清单的一部分的示意图。
图51是显示在运算符定义文件中的清单的一部分的示意图。
图52是显示在运算符定义文件中的清单的一部分的示意图。
图53是显示在运算符定义文件中的清单的一部分的示意图。
图54是显示在运算符定义文件中的清单的一部分的示意图。
图55是显示在运算符定义文件中的清单的一部分的示意图。
图56是显示在运算符定义文件中的清单的一部分的示意图。
图57是显示在运算符定义文件中的清单的一部分的示意图。
图58是显示在运算符定义文件中的清单的一部分的示意图。
图59是显示在运算符定义文件中的清单的一部分的示意图。
图60是显示在运算符定义文件中的清单的一部分的示意图。
图61是显示在运算符定义文件中的清单的一部分的示意图。
图62是显示在运算符定义文件中的清单的一部分的示意图。
图63是显示在运算符定义文件中的清单的一部分的示意图。
图64是显示在运算符定义文件中的清单的一部分的示意图。
图65是显示在运算符定义文件中的清单的一部分的示意图。
图66是显示在运算符定义文件中的清单的一部分的示意图。
图67是显示在运算符定义文件中的清单的一部分的示意图。
图68是显示在运算符定义文件中的清单的一部分的示意图。
图69是显示在内置函数定义文件中的清单的一部分的示意图。
图70是显示在内置函数定义文件中的清单的一部分的示意图。
图71是显示在内置函数定义文件中的清单的一部分的示意图。
图72是显示在内置函数定义文件中的清单的一部分的示意图。
图73是显示机器语言指令替代单元的行为的流程图。
图74是显示优化单元的变元优化单元的行为的流程图。
图75是显示一个算术树以解释优化单元的类型变换优化单元的行为的示意图。
图76是显示一个样本程序的例子以解释等待时间(latency)优化单元的行为的示意图。
图77是解释分析程序单元的定点模式切换单元的行为的示意图。
图78是解释采用一个类库(class library)的行为验证技术的示意图。
具体实施例方式
下面采用附图详细解释依据本发明的本实施例的编译程序。
依据本实施例的编译程序是一个将以诸如C/C++语言的高级程序语言描述的源程序翻译成特定处理器(目标)可以执行的机器语言程序的交叉编译程序,其特征是它可以指定要产生的机器语言程序的代码大小和执行时间精密相关的优化的命令。
(处理器)首先,采用图1到图36解释依据本实施例的编译程序的目标处理器的一个例子。
作为依据本实施例的编译程序的目标的处理器例如是一个已经开发的用在AV媒体信号处理技术领域的通用处理器,并且可执行指令与普通微计算机相比具有更高的并行性。
图1是显示本处理器的示意方框图。处理器1是一个运算(opentional)装置,其字长度是32位(一个字),由指令控制单元10、译码单元20、寄存器文件30、运算单元40、I/F单元50、指令存储器单元60、数据存储器单元70、扩充寄存器单元80和I/O接口单元90组成。运算单元40包括算术和逻辑/比较运算单元41~43、乘法/乘积和运算单元44、桶形移位器45、除法器46和变换器47来用于执行SIMD指令。乘法/乘积和运算单元44能够处理最大65位的累加以使得不降低位精度。乘法/乘积和运算单元44还能够与在算术和逻辑/比较运算单元41~43的情况中一样执行SIMD指令。此外,处理器1能够在最大三个数据单元上并行执行算术和逻辑/比较运算指令。
图2是显示算术和逻辑/比较运算单元41~43的示意图。算术和逻辑/比较运算单元41~43中的每一个由ALU单元41a、饱和处理单元41b和标志单元41c组成。ALU单元41a包括算术运算单元、逻辑运算单元、比较器和TST组成。要支持的运算数据的位宽度是8位(一个字节。此时,并行使用四个运算单元)、16位(半个字。此时,并行使用两个运算单元)和32位(一个字。此时,使用所有运算单元处理32位数据)。对于算术运算的结果,标志单元41c等检测一个溢出并产生一个条件标志。对于运算单元、比较器和TST中的每一个的结果,执行算术右移、由饱和处理单元41b进行的饱和、最大/最小值的检测、绝对值产生处理。
图3是显示桶形移位器45的配置的方框图。桶形移位器45由选择器45a和45b、高位移位器45c、低位移位器45d和饱和处理单元45e组成执行数据的算术移位(在2的补数系统中的移位)或数据的逻辑移位(无符号移位)。通常,32位或64位数据被输入到桶形移位器45或从桶形移位器45输出。存储在寄存器30a和30b中的目标数据的移位量由另一个寄存器指定或根据其立即值指定。对于数据执行左63位和右63位的范围中的算术或逻辑移位,然后以输入位长度输出。
桶形移位器45能够响应于一个SIMD指令移动8-、16-、32-和64-位数据。例如,桶形移位器45可以并行移位四条8位数据。
执行在2的补数系统中移位的算术移位来用于在加法和减法时对准小数点,以及用于乘以2的幂(2,2的2nd次幂,2的-1st次幂)和其他目的。
图4是显示变换器47的配置的方框图。变换器47由饱和块(SAT)47a、BSEQ块47b、MSKGEN块47c、VSUMB块47d、BCNT块47e和IL块47f组成。
饱和块(SAT)47a对输入数据执行饱和处理。具有用于32位数据的饱和处理的两个块使得能够支持一个对两个数据元素并行执行的SIMD指令。
BSEQ块47b从MSB开始对连续的0或1计数。
MSKGEN块47c将一个指定的位段输出为1,将其他位输出为0。
VSUMB块47d将输入数据分成指定位宽度,并输出其总和。
BCNT块47e对输入数据中指定为1的位数计数。
IL块47f将输入数据分成指定位宽度,并输出从交换每个数据块的的位置产生的值。
图5是显示除法器46的配置的方框图。使一个被除数是64位,一个除数是32位,除法器46输出32位分别作为商和模数。涉及34个周期来用于获得商和模数。除法器46可以处理有符号的和无符号的数据。然而,应该注意,对于用作被除数和除数的数据的符号的存在/不存在作出相同的设置。并且,除法器46具有输出一个溢出标志和一个0除法标志的能力。
图6是显示乘法/乘积和运算单元44的配置的方框图。乘法/乘积和运算单元44由两个32位乘法器(MUL)44a和44b、三个64位加法器(加法器)44c~44e、选择器44f和饱和处理单元(饱和)44g组成,执行下面的乘法和乘积和32×32位有符号乘法、乘积和与乘积差;32×32位无符号乘法;在两个数据元素上并行执行的16×16位有符号乘法、乘积和与乘积差;以及在两个数据元素上并行执行的32×16位有符号乘法、乘积和与乘积差;
在以整数和定点格式的数据(h1、h2、w1和w2)上执行上面的运算。并且,对这些运算的结果进行四舍五入和饱和。
图7是显示指令控制单元10的配置的方框图。指令控制单元10由指令高速缓存10a、地址管理单元10b、指令缓冲器10c~10e、跳转缓冲器10f和旋转单元(旋转)10g组成,在平常时间和在分支点发出指令。具有三个128位指令缓冲器(指令缓冲器10c~10e)使得能够支持最大数目的并行指令执行。关于分支处理,指令控制单元10通过跳转缓冲器10f和其他在执行一个分支(settar指令)之前事先在下面描述的TAR寄存器中存储一个分支目的地址。分支采用存储在TAR寄存器中的分支目的地址来执行。
应该注意,处理器1是一个采用VLIW体系结构的处理器。VLIW体系结构是一种允许多个指令(例如,装入,存储,运算和分支)被存储在一单个指令字中并且这样的指令将在一次全部执行的体系结构。通过由程序员将可以并行执行的一组指令描述为一单个发行组(issue group),这种发行组可以被并行执行。在这个说明书中,发行组的分隔符由“;;”指示。下面描述了符号例子。
(例子1)mov r1,0x23;;这个指令描述指示只有一个指令“mov”应该被执行。
(例子2)mov r1,0x38add r0,r1,r2
sub r3,r1,r2;;这些指令描述指示三个指令“mov”、“add”和“sub”应该被并行执行。
指令控制单元10识别一个发行组并将其发送到译码单元20。译码单元20对发行组中的指令译码,并控制用于执行这样的指令所需的资源。
接着,对于在处理器1中包括的寄存器给出解释。
下面的表1列出了处理器1的一组寄存器。
下面的表2列出了处理器1的一组标志(在后面描述的条件标志寄存器等中管理的标志)。
图8是显示通用寄存器(R0~R31)30a的配置的示意图。通用寄存器(R0~R31)30a是构成一个要执行的任务的上下文的主要部分并存储数据或地址的一组32位寄存器。应该注意,通用寄存器R30和R31分别通过硬件用作全局指针和堆栈指针。
图9是显示连接寄存器(LR)30c的配置的示意图。与这个连接寄存器(LR)30c相连,处理器1还具有一个在图中未显示的保存寄存器(SVR)。连接寄存器(LR)30c是一个用于在函数调用时存储返回地址的32位寄存器。应该注意,保存寄存器(SVR)是一个用于在函数调用时保存条件标志寄存器的条件标志(CFR.CF)的16位寄存器。与在后面将解释的分支寄存器(TAR)的情况中一样,连接寄存器(LR)30c还被用于提高循环速度的目的。作为较低的1位总是读出0,但在写操作时必须写入0。
例如,在执行“调用”(brl,jmpl)指令时,处理器1将一个返回地址保存在连接寄存器(LR)30c中,并将一个条件标志(CFR.CF)保存在保存寄存器(SVR)中。在执行“jmp”指令时,处理器1从连接寄存器(LR)30c取出返回地址(分支目的地址),并返回一个程序计数器(PC)。此外,在执行“ret(jmpr)”指令时,处理器1从连接寄存器(LR)30c取出分支目的地址(返回地址),并将其存储到程序计数器(PC)。此外,处理器1从保存寄存器(SVR)取出条件标志,以便将其存储(再存入)到条件标志寄存器(CFR)32中的条件标志区域CFR.CF。
图10是显示分支寄存器(TAR)30d的配置的示意图。分支寄存器(TAR)30d是一个用于存储分支目标地址的32位寄存器,主要用于提高循环速度的目的。作为较低的1位总是读出0,但在写操作时必须写入0。
例如,当执行“jmp”和“jloop”指令时,处理器1从分支寄存器(TAR)30d取出一个分支目的地址,并将其存储在程序计数器(PC)中。当由存储在分支寄存器(TAR)30d中的地址所指示的指令被存储在分支指令缓冲器中时,分支损失(penalty)将为0。通过将一个循环的顶端地址存储在分支寄存器(TAR)30d中,可以实现循环速度的提高。
图11是显示程序状态寄存器(PSR)31的配置的示意图。程序状态寄存器(PSR)31构成一个要执行的任务的上下文的主要部分,是一个用于存储下面的处理器状态信息的的32位寄存器位SWE指示VMP(虚拟多处理器)到LP(逻辑处理器)的切换是被允许还是禁止。“0”指示到LP的切换被禁止,“1”指示到LP的切换被允许。
位FXP指示一个定点模式。“0”指示模式0(在其中在假设在MSB和从MSB开始的第一位之间有小数点的情况下执行一个算术运算的模式。此后,也称为“1系统”),“1”指示模式1(在其中在假设在从MSB开始的第一位和从MSB开始的第二位之间有小数点的情况下执行一个算术运算的模式。此后,也称为“2系统”)。
位IH是一个中断处理标志,指示可屏蔽的中断处理是否是正在进行的。“1”指示有一个正在进行的中断处理,“0”指示没有正在进行的中断处理。在一个中断出现时这个标志被自动设置。这个标志用于对在程序中的处理器响应于“rti”指令而返回的一点处正在进行中断处理还是程序处理作出区分。
位EH是一个指示错误或NMI是否正在被处理的标志。“0”指示错误/NMI中断处理不是正在进行的,“1”指示错误/NMI中断处理是正在进行的。如果在EH=1时出现不同步错误或NMI,这个标志被屏蔽。同时,当VMP被允许时,VMP的板切换被屏蔽。
位PL[10]指示一个特权级。“00”指示特权级0,即处理器抽象级,“01”指示特权级1(不可设置),“10”指示特权级2,即系统程序级,“11”指示特权级3,即用户程序级。
位LPIE3指示LP专用中断3是被允许还是禁止。“1”指示一个中断被允许,“0”指示一个中断被禁止。
位LPIE2指示LP专用中断2是被允许还是禁止。“1”指示一个中断被允许,“0”指示一个中断被禁止。
位LPIE1指示LP专用中断1是被允许还是禁止。“1”指示一个中断被允许,“0”指示一个中断被禁止。
位LPIE0指示LP专用中断0是被允许还是禁止。“1”指示一个中断被允许,“0”指示一个中断被禁止。
位AEE指示一个未对准异常是被允许还是禁止。“1”指示一个未对准异常被允许,“0”指示一个未对准异常被禁止。
位IE指示一个级别中断是被允许还是禁止。“1”指示一个级别中断被允许,“0”指示一个电平中断被禁止。
位IM[70]指示一个中断屏蔽,并且范围是从级0~7,每个都能够在其自己的级别被屏蔽。级0是最高级。在未由任何IM屏蔽的中断请求中,只有具有最高级别的中断请求被处理器1接受。当一个中断请求被接受时,在所接受的级别之下的级别被硬件自动屏蔽。IM
代表级0的屏蔽,IM[1]代表级1的屏蔽,IM[2]代表级2的屏蔽,IM[3]代表级3的屏蔽,IM[4]代表级4的屏蔽,IM[5]代表级5的屏蔽,IM[6]代表级6的屏蔽,IM[7]代表级7的屏蔽。
保留指示一个保留位。总是读出0。在写入时必须写0。
图12是显示条件标志寄存器(CFR)32的配置的示意图。条件标志寄存器(CFR)32构成一个要执行的任务的上下文的主要部分,是一个由条件标志、运算标志、向量条件标志、运算指令位位置说明字段和SIMD数据对准信息字段组成的32位寄存器。
位ALN[10]指示一个对准模式。设置“valnvc”指令的对准模式。
位BPO[40]指示一个位位置。它用在需要位位置说明的指令中。
位VC0~VC3是向量条件标志。从LSB侧上的一个字节或半个字开始到MSB侧,每个对应于从VC0到VC3的范围内的一个标志。
位OVS是一个溢出标志(总计)。它是在饱和和溢出的检测基础上设置的。如果未检测到,保持在执行指令之前的一个值。这个标志的清除需要由软件实现。
位CAS是一个进位标志(总计)。它当在“addc”指令下出现一个进位时或当在“subc”指令下出现一个借位时被设置。如果在“addc”指令下未出现进位时或在“subc”指令下未出现借位,保持在执行指令之前的一个值。这个标志的清除需要由软件实现。
位C0~C7是条件标志,指示一个带有条件的执行指令中的条件(TRUE/FALSE)。带有条件的执行指令的条件和位C0~C7之间的对应关系由指令中包括的判定位来决定。应该注意,标志C7的值总是1。对标志C7作出的FALSE条件的反映(写入0)被忽略。
保留指示一个保留位。总是读出0。在写入时必须写入0。
图13A和13B是显示累加器(M0,M1)30b的配置的示意图。这种累加器(M0,M1)30b构成一个要执行的任务的上下文的主要部分,由图13A所示的32位寄存器MHO-MH1(用于乘法和除法/乘积和(高32位)的寄存器)和图13B所示的32位寄存器MLO-ML1(用于乘法和除法/乘积和(低32位)的寄存器)组成。
寄存器MHO-MH1在一个乘法指令时用于存储运算结果的高32位,而在一个乘积和指令时用作累加器的高32位。此外,在处理一个位流的情况下,寄存器MHO-MH1可以与通用寄存器结合使用。同时,寄存器MLO-ML1在一个乘法指令时用于存储运算结果的低32位,而在一个乘积和指令时用作累加器的低32位。
图14是显示程序计数器(PC)33的配置的示意图。这个程序计数器(PC)33构成一个要执行的任务的上下文的主要部分,是一个保存要执行的指令的地址的32位计数器。
图15是显示PC保存寄存器(IPC)34的配置的示意图。这个PC保存寄存器(IPC)34构成一个要执行的任务的上下文的主要部分,是一个32位寄存器。
图16是显示PSR保存寄存器(IPSR)35的配置的示意图。这个PSR保存寄存器(IPSR)35构成一个要执行的任务的上下文的主要部分,是一个用于保存程序状态寄存器(PSR)31的32位寄存器。作为对应于一个保留位的一部分总是读出0,但在写入时必须写入0。
接着,对于处理器1的存储空间给出解释,这是依据本实施例的编译程序的目标。例如,在处理器1中,带有4GB容量的线性存储空间被分成32段,并将一个指令SRAM(静态RAM)和一个数据SRAM分配给128MB段。采用一个128MB段用作一个块,在SAR(SRAM区域寄存器)中设置要访问的目标块。当所访问的地址是SAR中设置的段时,对指令SRAM/数据SRAM作出直接访问,但当这样的地址不是在SAR中设置的段时,访问请求应该被发到总线控制器(BCU)。片上存储器(OCM)、外部存储器、外部设备、I/O端口等连接到BUC。从这些设备的数据读取和向这些设备的数据写入是可能的。
图17是显示处理器1的流水线行为的时序图,这是依据本实施例的编译程序的目标。如图所示,处理器1的流水线基本上包括下面五个阶段指令取出;指令分配(调度);译码;执行和写入。
图18是显示在执行一个指令时的处理器1的流水线行为的每个阶段的时序图。在指令取出阶段,对由程序计数器(PC)33所指定的地址所指示的指令存储器作出访问,并将指令传送到指令缓冲器10c~10e等。在指令分配阶段,实现响应于分支指令的分支目的地址信息的输出、输入寄存器控制信号的输出、可变长度指令的分配,随后将指令传送到指令寄存器(IR)。在译码阶段,将IR输入到译码单元20,并输出一个运算单元控制信号和一个存储器访问信号。在执行阶段,执行一个运算,运算的结果被输出到数据存储器或通用寄存器(R0~R31)30a。在写入阶段,将作为数据传送的结果而获得的值以及运算结果存储在通用寄存器中。
作为依据本实施例的编译程序的目标的处理器1的VLIW结构允许在最多三个数据元素上并行执行上面的处理。因此,处理器1以图19所示的定时并行执行图18所示的行为。
接着,对于由具有上述配置的处理器1执行的一组指令给出解释。
表3~5列出了要由作为依据本实施例的编译程序的目标的处理器1执行的分类的指令。[表3]
应该注意,上面的表中的“运算单元”指的是用在各个指令中的运算单元。更具体地,“A”代表ALU指令,“B”代表分支指令,“C”代表变换指令,“DIV”代表除法指令,“DBGM”代表调试指令,“M”代表存储器访问指令,“S1”和“S2”代表移位指令,“X1”和“X2”代表乘法指令。
图20是显示由处理器1执行的指令的格式的示意图。
下面描述图中的首字母缩写词代表什么含义“P”是判定(执行条件指定八个条件标志C0~C7中的一个);“OP”是运算代码字段;“R”是寄存器字段;“I”是立即字段;“D”是位移字段。
图21~36是解释由处理器1执行的指令的概略功能的示意图。更具体地,图21解释一个属于类别“ALUadd(加法)系统”的指令;图22解释一个属于类别“ALUsub(减法)系统”的指令;图23解释一个属于类别“ALUlogic(逻辑运算)系统等”的指令;图24解释一个属于类别“CMP(比较运算)系统”的指令;图25解释一个属于类别“mul(乘法)系统”的指令;图26解释一个属于类别“mac(乘积和运算)系统”的指令;图27解释一个属于类别“msu(乘积差)系统”的指令;图28解释一个属于类别“MEMld(从存储器装入)系统”的指令;图29解释一个属于类别“MEMstore(存储在存储器中)系统”的指令;图30解释一个属于类别“BRA(分支)系统”的指令;图31解释一个属于类别“BSasl(算术桶形移位)系统等”的指令;图32解释一个属于类别“BSasl(逻辑桶形移位)系统等”的指令;图33解释一个属于类别“CNVvaln(算术变换)系统”的指令;图34解释一个属于类别“CNV(普通变换)系统”的指令;图35解释一个属于类别“SATvlpk(饱和处理)系统”的指令;图36解释一个属于类别“ETC(等等)系统”的指令。
图20是显示由处理器1执行的指令的格式的示意图。
下面描述图中的首字母缩写词代表什么含义“P”是判定(执行条件指定八个条件标志C0~C7中的一个);“OP”是运算代码字段;“R”是寄存器字段;“I”是立即字段;“D”是位移字段。
图21~36是解释由处理器1执行的指令的概略功能的示意图。更具体地,图21解释一个属于类别“ALUadd(加法)系统”的指令;图22解释一个属于类别“ALUsub(减法)系统”的指令;图23解释一个属于类别“ALUlogic(逻辑运算)系统等”的指令;图24解释一个属于类别“CMP(比较运算)系统”的指令;图25解释一个属于类别“mul(乘法)系统”的指令;图26解释一个属于类别“mac(乘积和运算)系统”的指令;图27解释一个属于类别“msu(乘积差)系统”的指令;图28解释一个属于类别“MEMld(从存储器装入)系统”的指令;图29解释一个属于类别“MEMstore(存储在存储器中)系统”的指令;图30解释一个属于类别“BRA(分支)系统”的指令;图31解释一个属于类别“BSasl(算术桶形移位)系统等”的指令;图32解释一个属于类别“BSasl(逻辑桶形移位)系统等”的指令;图33解释一个属于类别“CNVvaln(算术变换)系统”的指令;图34解释一个属于类别“CNV(普通变换)系统”的指令;图35解释一个属于类别“SATvlpk(饱和处理)系统”的指令;图36解释一个属于类别“ETC(等等)系统”的指令。
下面描述这些图中的每列的含义“SIMD”指示一个指令的类型(在SISD(SINGLE)和SIMD之间区分);“大小”指示要作为运算目标的单个运算数的大小;“指令”指示一个运算的运算代码;“运算数”指示一个指令的运算数;“CFR”指示条件标志寄存器中的改变;“PSR”指示处理器状态寄存器中的改变;“典型行为”指示一个行为的概述;“运算单元”指示一个要使用的运算单元;以及,“3116”指示一个指令的大小。
下面解释涉及用在后面将描述的具体例子中的主要指令的处理器1的行为。andn Rc,Ra,Rb实现Ra和Rb之间的反转逻辑AND并将其存储在Rc中。asl Rb,Ra,I5执行向Ra左移立即值(I5)中的位数的算术移位。and Rb,Ra,I8实现Ra和值(I8)之间的逻辑AND并将其存储在Rb中。bseq0 Rb,Ra对从Ra的MSB开始的连续的0计数并将其存储在Rb中。bseq1 Rb,Ra对从Ra的MSB开始的连续的1计数并将其存储在Rb中。bseq Rb,Ra对从Ra的MSB之下1位开始的连续的符号位计数并将其存储在Rb中。当Ra是0时,输出0。bcnt1 Rb,Ra对Ra的1的个数计数并将其存储在Rb中。extr Rc,Ra,Rb由Rb指定一个位的位置,提取Ra的内容一部分,符号扩展并将其存储在Rc中。extru Rc,Ra,Rb由Rb指定一个位的位置,提取Ra的内容一部分,不带符号扩展地将其存储在Rc中。fmulhh Mm,Rc,Ra,Rb
将Ra、Rb和Rc作为16位值来处理,将Mm(用于乘法的累加数)作为32位值来处理。将Ra和Rb与一定点相乘。将结果存储在Mm和Rc中。当结果不能由有符号的32位表示时,使其饱和。fmulhw Mm,Rc,Ra,Rb将Ra和Rb作为16位值来处理,将Mm和Rc作为32位值来处理。通过一定点将Ra和Rb相乘。将结果存储在Mm和Rc中。当结果不能由有符号的32位表示时,使其饱和。mul Mm,Rc,Ra,Rb将Ra和Rb与一整数相乘。将结果存储在Mm和Rc中。mac Mm,Rc,Ra,Rb,Mn将Ra和Rb与一整数相乘并将其加到Mn。将结果存储在Mm和Rc中。mov Rb,Ra将Ra传送到Rb。or Rc,Ra,Rb实现Ra和Rb之间的逻辑OR并将其存储在Rc中。rde C0C1,Rb,(Ra)让Ra是一个外部寄存器数,将外部寄存器的值读入Rb。将读取的成功和失败分别输出到C0和C1(条件标志)。在失败的情况下,出现一个扩展寄存器错误的异常。wte C0C1,(Ra),Rb让Ra是一个外部寄存器数,将Rb的值写入外部寄存器。将写入的成功和失败分别输出到C0和C1。在失败的情况下,出现一个扩展寄存器错误的异常。vaddh Rc,Ra,Rb以半个字向量格式对待每个寄存器。将Ra和Rb相加(SIMD直接)。(一个编译程序)接着,解释依据本实施例的、其目标是上述处理器1的一个编译程序。
图37是显示依据本实施例的编译程序100的配置的功能方框图。这个编译程序100是一个将以诸如C/C++语言的高级程序语言描述的源程序101翻译成其目标处理器是上述处理器1的机器语言程序105的交叉编译程序,由一个在诸如个人计算机的计算机上执行的程序实现,并主要被分成并带有分析程序单元110、中间编码变换单元120、优化单元130和代码产生单元140。
应该注意,有效地产生专用于上面提到的处理器1的专用指令的主文件(运算符定义文件102和内置函数定义文件103)在当前编译程序100中是准备好的。用户可以通过将这些主文件包括在源程序101中来获取为处理器1专门做(优化)的机器语言程序105。
如图38到图68中的清单例子所示,运算符定义文件102是一个定义了定义以定点和SIMD类型数据为目标的运算符的类的主文件。在该主文件中,图38~图40是定义了一个其目标主要是模式0(1系统)的16位定点的数据的运算符的部分的清单;图41和图42是定义了一个其目标主要是模式0(1系统)的32位定点的数据的运算符的部分的清单;图43~图45是定义了一个其目标主要是模式1(2系统)的16位定点的数据的运算符的部分的清单;图45~图47是其目标主要是模式1(_2系统)的32位定点的数据的运算符的部分的清单;图48~图68是定义了其他函数的部分的清单。
如图69~图72中的清单例子所示,内置函数定义文件103是一个定义了执行各种运算来以专用于处理器1的机器语言指令代替函数的函数的主文件。在该主文件中,图69~图71是定义了一个以一个机器语言指令代替函数的函数的部分的清单;图72是定义了一个以两个或更多机器语言指令(机器语言指令序列)代替函数的函数的部分的清单。
应该注意,这些定义文件102和103中的asm(…){…}(…)是一个被称为优化asm的内置汇编程序指令,其处理如下。换句话说,优化asm语句的描述格式是asm(《装入表达式的清单》){《优化控制信息》《指令指定单元》}(《存储表达式的清单》);。
这里,“装入表达式的清单”是一个描述装入表达式的部分;“装入表达式”是一个存储C语言中的变量和诸如四个运算的表达式的结果的表达式;它被描述为类似“寄存器指定标识符=赋值表达式”;以及,它意味着在右边指示的值被传送到在左边指示的标识符。“存储表达式的清单”是一个描述存储表达式的部分;“存储表达式”被描述为类似“单项式=寄存器指定标识符”;以及,它意味着将左边的由单项式表示的值赋给由寄存器指定标识符表示的寄存器的值。
分析程序单元110是一个提取保留字(关键字)等的前处理单元;实现作为编译的目标的(包含要包括的主文件的)源程序101的词汇分析;以及,除了普通编译程序具有的分析函数之外,还具有一个支持在定点上的模式的切换的定点模式切换单元111。当定点模式切换单元111在源程序101中检测到一个保存和恢复定点模式的编译指示说明(例如,“pragma_save_fxpmode func”)时,它产生一个保存和恢复处理器1的PSR31的位FXP的机器语言指令。这实现了定点的模式0和模式1中的运算混合的程序设计。
应该注意,“编译指示(或编译指示说明)”是用户可以在源程序101中任意指定(放置)的对编译程序100的指示,是以“#pragma”开始的字符序列。
中间编码变换单元120是一个将从分析程序单元110传送的源程序101中的每个语句变换到中间编码的处理单元,由中间编码产生单元121和机器语言指令替代单元122组成。中间编码产生单元121根据一个预定规则变换源程序101中的每个语句。这里,中间编码典型地是以函数调用的格式表示的代码(例如,指示“+(int a,intb)”;指示“将一个整数a加到整数b”的代码)。但中间编码不仅包含具有函数调用格式的代码,还包含处理器1的机器语言指令。
机器语言指令替代单元122将由中间编码产生单元121产生的中间编码中的具有函数调用格式的中间编码变换成引用运算符定义文件102和内置函数定义文件103的对应的机器语言指令(或机器语言指令序列),将匹配由这些定义文件或内置函数定义的运算符(包括运算的目标数据的类型)的中间编码变换成遵循(follow)机器语言指令替代单元122在其自身内部具有的一个替代表122a或由这些定义文件定义的汇编程序指令变换成对应的机器语言指令(或机器语言指令序列),并将变换的机器语言指令输出到优化单元130。这允许优化单元130对这些中间编码执行各种优化,因为它们不是以内置函数的格式而是以机器语言指令的格式传到优化单元130。
附带地,替代表122a是一个存储对应于事先保留的运算符的运算和函数的机器语言指令(机器语言指令序列)的表。另外,机器语言指令替代单元22输出来自从中间编码产生单元121传送的中间编码的机器语言指令而不经过优化单元130。
优化单元130是一个处理单元,通过执行诸如合并指令、去除冗余、分类指令和分配寄存器的处理,对来自从中间编码变换单元120输出的中间编码的机器语言指令执行由用户选择的下面提到的三种类型的优化中的一种(1)提高执行速度具有更高优先级的优化;(2)减小代码大小具有更高优先级的优化;以及(3)提高执行速度和减小代码大小的优化。优化单元130具有一个除了普通优化之外还执行对本编译程序100的特有优化(例如“循环展开”、“如果变换”和“成对存储器访问指令的产生”)的处理单元(变元优化单元131、类型变换优化单元132和等待时间优化单元133)。
变元优化单元131是一个根据内置函数(例如,extr,extru)的变元产生适当的指令或序列(算法)的处理单元。例如,当所有变元是常数时,变元优化单元131产生其运算数是通过保持在常数而获得的常数值的机器语言指令;当变元的一部分是常数时,产生其运算数是立即值的机器语言指令;当所有变元是变量时,产生其运算数是寄存器的一个指令序列。
类型变换优化单元132是一个基于在源程序101中的一个特定记号使得在不同类型之间的运算更有效的处理单元。例如,当希望一个16位数据和另一个16位数据的乘法结果被保持为一个32位数据时,如果在源程序101中有特定记号,类型变换优化单元132产生一个以这样一种类型的变换执行乘法的机器语言指令(“fmulhw”等)。
等待时间优化单元133基于在源程序101中结合的一个汇编程序指令中的关于等待时间的指示(周期数的指定),对准机器语言指令,以便一特定部分或一特定行动只花费指定周期数的执行时间。这使得一个程序员不必要完成他插入所需数目的“nop(空操作)”指令的常规工作,并使得能够通过插入其他机器语言指令而不是“nop”指令来执行优化。
附带地,“循环展开”是通过扩展循环的迭代(重复)并产生一对存储器访问指令(ldp/stp/ldhp/sthp等)以便同时执行多个迭代来提高并行执行循环的可能性的优化。另外,“如果转换”是通过为一个带有条件的执行机制产生一个指令(只有在指令中包括的条件(判定)匹配处理器1的状态(条件标志)时才执行的指令)来去除分支结构的优化。此外,“一对存储器访问指令的产生”是以一对寄存器(两个连续的寄存器)作为目标产生所述一对存储器访问指令(ldp/stp/ldhp/sthp等)的优化。
此外,优化单元130输出来自函数调用格式的中间编码的、不能被扩展的中间编码,而不经过代码产生单元140,因为不可能在上述机器语言指令级执行优化处理。
代码产生单元140参考内部保存的翻译表等产生机器语言程序105,代替从优化单元130输出的所有中间编码(包括函数调用格式的代码和优化的机器语言指令)。
接着,解释指示具体例子的如上所述配置的编译程序100的特征行为。
图73是显示机器语言指令替代单元122的行为的流程图。机器语言指令替代单元122重复下面的过程(1)判断来自由中间编码产生单元121产生的中间编码的函数调用格式的代码是否匹配由运算符定义文件102定义的运算符(包括运算目标的数据类型)和由内置函数定义文件103定义的函数(步骤S102),以及,当它们匹配时(在步骤S102为是),(2)遵循由机器语言指令替代单元122a在其自身内部具有的替代表122a定义的汇编程序指令和这些定义文件102和103(步骤S100~S103),用机器语言指令替代运算符和函数(步骤S102)。
更具体地,不同类型之间的类型变换的隐含规则等由运算符定义文件102的定义(由构造符的定义)来规定;定义了下面四种类型的定点“FIX16_1”有符号的16位,小数点在第14位和第15位(MSB)之间,“FIX16_2”有符号的16位,小数点在第13位和第14位之间,“FIX32_1”有符号的32位,小数点在第30位和第31位(MSB)之间,“FIX32_2”有符号的32位,小数点在第29位和第30位之间。因此,机器语言指令替代单元122例如将一个源程序FIX16_1 a,b,c;c=a*b;用一个机器语言指令fmulhh m0,Rc,Ra,Rb(定点乘法运算指令)来替代。
因此,用户可以声明四种类型FIX16_1、FIX16_2、FIX32_1和FIX32_2与一个普通编译程序的标准类型类似并使用它们。然后,产生的包括相邻代码的机器语言指令变为优化单元130中的诸如合并指令、去除冗余、分类指令和分配寄存器的优化的目标,并且可以被优化。
类似地,不同类型之间的类型转换的隐含规则等由运算符定义文件102的定义(由构造符的定义)来规定;定义了下面四种类型的SIMD指令
“VINT8×4”;4个并行的8位整数数据,“VINT16×2”;2个并行的16位整数数据,“VFIX161×2”;2个并行的模式0(1系统)的16位定点数据,以及“VFIX162×2”;2个并行的模式1(2系统)的16位定点数据。因此,机器语言指令替代单元122例如将一个源程序VINT16×2 a,b,c;c=a+b;用一个机器语言指令vaddh Rc,Ra,Rb(SIMD加法指令)替代。
从而,用户可以声明四种类型“VINT8×4”、“VINT16×2”、“VFIX161×2”和“VFIX162×2”与一个普通编译程序的标准类型类似并使用它们。然后,产生的包括相邻代码的机器语言指令变为优化单元130中的诸如合并指令、去除冗余、分类指令和分配寄存器的优化的目标,并且可以被优化。
另外,在内置函数定义文件103中,定义一个可以使用处理器1执行的高级指令的函数(例如,“_abs(a)”等)及其对应的高级指令(例如,一个机器语言指令“abs Rb,Ra”等)。因此,机器语言指令替代单元122例如将一个源程序b=_abs(a);用一个机器语言指令abs Rb,Ra来替代。
从而,用户可以通过不以C++语言和汇编程序指令生成而是仅仅调用一个实现准备好的内置函数来实现一个复杂处理。然后,产生的包括相邻代码的机器语言指令变为优化单元130中的诸如合并指令、去除冗余、分类指令和分配寄存器的优化的目标,并且可以被优化。
类似地,在内置函数定义文件103中,定义一个可以使用处理器1执行的高级指令的函数(例如,“_div(a,b)”等)及其对应的高级指令(例如,一个机器语言指令序列“extw,aslp,div”等)。因此,机器语言指令替代单元122例如将一个源程序c=_div(a,b);用一个机器语言指令序列extw Mn,Rc,Raaslp Mn,Rc,Mn,Rc,15div MHm,Rc,MHn,Rc,Rb.
来替代。
从而,用户可以通过不以C++语言和汇编程序指令生成而是仅仅调用一个实现准备好的内置函数来实现一个复杂处理。然后,产生的包括相邻代码的机器语言指令变为优化单元130中的诸如合并指令、去除冗余、分类指令和分配寄存器的优化的目标,并且可以被优化。
应该注意,在内置函数定义文件103中列出的内置函数中,(1)被变换成一个机器语言指令的函数,(2)被变换成两个或更多机器语言指令(一个机器语言指令序列)的函数,以及(3)可以指定不是寄存器分配的目标的资源(例如累加器)的函数的代表性例子如下(1)被变换成一个机器语言指令的内置函数“_bseq1(x)”这是检测从输入的MSB开始有多少个连续的位0的函数。其格式如下int_bseq1(FIX16_1 val)∥count 1int_bseq1(FIX16_2 val)∥count 1int_bseq1(FIX32_1 val)∥count 1int_bseq1(FIX32_2 val)∥count 1这些函数返回在要计数的“val”中的连续的0的个数(位数)的值。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_bseq0(x)”这是检测从输入的MSB开始有多少个连续的位0的函数。其格式如下int_bseq0(FIX16_1 val)∥count 0int_bseq0(FIX16_2 val)∥count 0int_bseq0(FIX32_1 val)∥count 0int_bseq0(FIX32_2 val)∥count 0这些函数返回在要计数的“val”中的连续的0的个数(位数)的值。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_bseq1(x)”这是检测从输入的MSB开始有多少个连续的位1的函数。其格式如下int_bseq1(FIX16_1 val)∥count 1int_bseq1(FIX16_2 val)∥count 1int_bseq1(FIX32_1 val)∥count 1int_bseq1(FIX32_2 val)∥count 1这些函数返回在要计数的“val”中的连续的1的个数(位数)的值。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_bseq(x)”这是检测从输入的MSB的下一位开始有多少个连续的与MSB具有相同值的位的函数。其格式如下int_bseq(FIX16_1 val)int_bseq(FIX16_2 val)int_bseq(FIX32_1 val)int_bseq(FIX32_2 val)这些函数返回“val”中的标准化的位的个数。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_bcnt1(x)”
这是检测在输入的所有位中包括多少位1的函数。其格式如下int_bcnt1(FIX16_1 val)int_bcnt1(FIX16_2 val)int_bcnt1(FIX32_1 val)int_bcnt1(FIX32_2 val)这些函数返回在要计数的“val”中的1的个数的值。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_extr(a,i1,i2)”这是提取输入的预定位位置并进行符号扩展的函数。其格式如下int_extr(FIX16_1 val1,int val2,int val3)int_extr(FIX16_2 val1,int val2,int val3)int_extr(FIX32_1 val1,int val2,int val3)int_extr(FIX32_2 val1,int val2,int val3)这些函数返回从位位置val2到位位置val3所指示的val1的位字段被提取和符号扩展的结果。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。“_extru(a,i1,i2)”这是提取输入的预定位位置并进行零扩展的函数。其格式如下unsigned int_extru(FIX16_1 val,int val2,int val3)unsigned int_extru(FIX16_2 val,int val2,int val3)unsigned int_extru(FIX32_1 val,int val2,int val3)unsigned int_extru(FIX32_2 val,int val2,int val3)这些函数返回从位位置val2到位位置val3所指示的val1的位字段被提取和零扩展的结果。对应于这些函数的机器语言指令被定义在内置函数定义文件103中。
(2)被变换成两个或更多机器语言指令(一个机器语言指令序列)的内置函数“_modulo_add()”这是执行模数寻址的地址更新的函数。其格式如下_modulo_add(void*addr,int imm,int mask,size_t_size,void*base)这里,每个变元的含义如下addr更新之前的地址或低位地址(模数部分)imm相加值(数据的个数)mask屏蔽的宽度(模数的宽度)size数据的大小(2的幂)base基地址(阵列的首部地址)这个函数返回由模数寻址只从地址addr加上相加值imm的结果。
对应于这个函数的机器语言指令被定义在内置函数定义文件103中。换句话说,这个函数使用用第二输入的预定位字段替代第一输入的预定位字段的指令(addmsk)来计算模数寻址。一个用法例子如下int array[MODULO];p=array;for(i=0;i<100;i++){*q++=*p;p=(int*)_modulo_add(p,1,N,sizeof(int),array);}这里,变量MODULO是2的幂(2^N)。在这个用法例子中,阵列的100个单元由MODULO*SIZE字节的对准来定位。“_brev_add()”这是执行位反转寻址的地址更新的函数。其格式如下_brev_add(void*addr,int cnt,int imm,int mask,size_t_size,void*base)这里,每个变元的含义如下addr更新之前的地址cnt位反转计数器mm相加值(数据的个数)mask屏蔽的宽度(反转的宽度)size数据的大小(2的幂)base基地址(阵列的首部地址)这个函数返回由位反转寻址只从对应于位反转计数器cnt的地址addr加上相加值mm的结果。
对应于这个函数的机器语言指令被定义在内置函数定义文件103中。换句话说,这个函数使用执行到第一输入的预定位字段的逐位的位置反转的指令(mskbrvh)来计算位反转寻址。一个用法例子如下int array[BREV];p=array;for(i=0;i<100;i++){*q++=*p;p=(int*)_brev_add(p,i,1,N,sizeof(int),array);}这里,变量BREV是2的幂(2^N)。在这个用法例子中,阵列的100个单元用BREV*SIZE字节的对准来定位。
(3)可以指定不是寄存器分配的目标的资源(例如累加器)的函数在内置函数定义文件103中,除了作为优化中的寄存器分配的目标资源的通用寄存器之外,还准备了(i)是更新不是寄存器分配的目标(是隐含资源)的累加器的运算(乘法和乘积和运算)的以及(ii)可以用一个累加器作为基准类型指定一个临时变量的内置函数(乘法“mul”和乘积和运算“mac”)。具体格式分别如下_mul(long &mh,long &ml,FIX16_1 &c,FIX16_1 a,FIX16_1 b);这个函数将变量a和变量b一起相乘,将作为结果的64位数据的高32位设置到用于乘法的高位累加器MH,将64位数据的低32位设置到用于乘法ML的低位累加器ML,并且,进一步,将组合累加器MH的低16位和累加器ML的高16位的32位数据设置到变量c。_mac(long &mh,long &ml,FIX16_1 &c,FIX16_1 a,FIX16_1 b);这个函数将用于乘法的高位累加器MH和用于乘法的低位累加器ML的64位数据与通过将变量a和变量b相乘而获得的结果相加,并将作为结果的64位数据的高32位设置到用于乘法的高位累加器MH,将64位数据的低32位设置到用于乘法ML的低位累加器ML,并且,进一步,将组合累加器MH的低16位和累加器ML的高16位的32位数据设置到变量c。
一个用法例子如下机器语言指令替代单元122遵循在内置函数定义文件103中的定义将下面的源程序long mh,ml;_mul(mh,ml,dummy,a,b);_mac(mh,ml,e,c,d);用下面的机器语言指令mul m0,Rx,Ra,Rbmov r0,mh0mov r1,mh1mov mh0,r0mov mh1,r1mac m0,Re,Rc,Rd,m0来替代。
应该注意,在上面提到的机器语言指令序列中,第一到第三行对应于函数mul,第四到第六行对应于函数mac。通过在优化单元130中去除冗余来删除象这样的第二到第五行机器语言指令序列,机器语言指令被优化到下面的机器语言指令序列mul m0,Rx,Ra,Rbmac m0,Re,Rc,Rd,m0。
如上所述,当使用可以指定不是寄存器分配的目标的资源(例如累加器)的函数时,通过编译程序(优化单元130)内的优化删除一组定义(值的存储)和使用(对该值的引用)是非常可能的,因此,象这样的内置函数在优化方面也是有效的。
接着,解释本编译程序100的特征行为中的优化单元130的行为。
图74是显示优化单元130的变元优化单元131的行为的流程图。为了依赖变元产生一个合适的指令或一个合适的序列(算法),变元优化单元131产生(1)当所有函数变元是常数时(步骤S110的左边),使用通过在下面设置的常数中折叠(fold)而获得的常数值作为运算数的机器语言指令(步骤S111);(2)当变元的一部分是常数时(步骤S110的中间),立即值运算数的机器语言指令(步骤112);以及(3)当所有变元是变量时(步骤S110的右边),寄存器运算数的机器语言指令序列(步骤113)。
例如,当所有变元是常数时,象d=_extru(0xfff,7,4);产生一个具有通过在常数中折叠而获得的常数值的机器语言指令,象mov Rd,oxf。
另一方面,当变元的一部分是常数时,象d=_extru(a,7,4);产生一个立即运算数的机器语言指令,象extru Rd,Ra,7,4。
进一步,当所有变元是变量时,象d=_extru(a,b,c);产生一个机器语言指令序列,象aslRe,Rb,8andRf,Rc,0x1forRg,Re,RfextmRd,Ra,Rg。
如刚才所描述的,从一个内置函数,不总是固定地产生相同的机器语言指令,而是由变元优化单元131产生依赖于变元性质而优化的机器语言指令(或机器语言指令序列)。
图75是显示一个算术树以解释优化单元130的类型变换优化单元132的行为的示意图。类型变换优化单元132对源程序中的特定记号的运算产生一个带有类型变换的机器语言指令(诸如fmulhw),以执行不同类型之间的有效运算。
在普通C语言中,16位×16位的结果的类型是16位。存在16位×16位→32位的指令,但如下所述产生两个不同的机器语言指令。例如,对于f32=f16*f16;的描述,产生两个指令fmulhh//16bit×16bit→16bitasl //16bit→32bit的类型变换因此,当在源程序中描述(FIX32)16位*(FIX32)16位时,类型变换优化单元132平常产生如图75A所示的算术树(产生类型变换的线-cord),但通过将这个算术树变换成图75B中所示的算术树产生一个16位×16位→32位的指令(fmulhw)。
图76是显示一个采样程序的例子以解释等待时间优化单元133的行为的示意图。等待优化单元133基于一个关于在源程序101中建立的汇编程序指令(优化的asm语句)中的等待时间(周期数的指定)的命令执行对机器语言指令的时间调度(schedule),以便在特定部分中的行为或特定行为中只花费指定周期数的执行时间。
用户可以用两种类型的指定方法设置等待时间。
一种方法是指定附连在特定指令上的标号之间的等待时间,就象图76A所示的程序中的指定(LATENCY L1,L2,2;)。在图76A的例子中,等待时间优化单元133执行对机器语言指令序列的分配的时间调度,以使得从处理器1执行指令wte开始直到执行指令rde只经过2个周期。
另一种方法是指定在访问扩展寄存器单元80的指令(rd,wt,rde,wte)上的直到指令下一次访问扩展寄存器单元80的等待时间,就象图76B所示的程序中的指定(指令wte内的LATENCY(2))。在图76B的例子中,等待时间优化单元133执行对机器语言指令序列的分配的时间调度,以便从处理器1执行指令wte和访问扩展存储器单元80开始直到再次访问扩展存储器单元80只经过2个周期。
采用象这样的等待时间的配置,可以在已经被成行(in-line)扩展的代码和还未被成行扩展的代码之间执行优化(合并指令,去除冗余,分类指令和分配寄存器),并保证所指定的指令或访问的等待时间。换句话说,常规上,用户必须明确地插入一个nop指令,而当用户使用编译程序100时,他所必须做的只是为一个必要的指令或一个必要的访问指定一个必要的等待时间。
图77是解释分析程序单元110的定点模式切换单元111的行为的示意图。
当定点模式切换单元111在源程序101中检测到一个编译指示来保存和返回定点模式(例如,“#pragma_save_fxpmode func”)时,定点模式切换单元111产生一个机器语言指令来保存和返回处理器1的PSR 31的位FXP。
应该注意,作为关于作为前提的定点的说明,存在1系统(FIX16_1,FIX32_1)类型和_2系统(FIX16_2,FIX32_2)类型;模式通过硬件(处理器1)中的PSR 31的一位(FXP)切换;以及,进一步,存在在一个函数中只能使用一单个系统的条件。
因此,作为用于切换和使用程序上的这两个系统的方法,给出一个规则来指定一个编译指示(“#pragma_save_fxpmode”函数名)作为可以由其他系统调用的函数。从而,定点模式切换开关单元111将对应于FIX类型的模式的保存和返回的代码插入到函数的头部和尾部。另外,搜索每个函数的FIX类型声明;决定通过哪一FIX类型声明来编译函数;以及,插入设置模式的代码。
图77A显示了一个带有编译指示的函数的例子。在图77A的右边写的注释是定点模式切换单元111的插入处理,其具体处理如图77B所示。
象这样的编译指示的一个应用例子如图77C所示。例如,关于四个函数f11、f21、f22和f23,当函数f11_1系统调用函数f21_2系统;函数f21_2系统调用函数f22_2系统;函数f22_2系统调用函数f23_2系统时,由于可以由其他模式调用的唯一的函数是f21,所以可以通过只对这个函数执行编译指示指定来切换到一个正常模式。
如上所述,采用依据本实施例的编译程序100,通过在运算符定义文件102、内置函数定义文件103和机器语言指令替代单元122之间的协作处理,用户可以声明和使用定点类型的模式0和模式1作为普通类型并有效产生处理器1通过在高级语言级调用内置函数执行的高功能机器语言指令。
另外,利用变元优化单元131对内置函数的变元的优化,产生带有有效运算数的机器语言指令。此外,利用类型变换优化单元132对类型变换的优化,将一个带有类型变换的运算变换成处理器1执行的一个高功能机器语言指令。此外,利用等待时间优化单元133对机器语言指令的时间调度,用户可以在不插入nop指令的情况下保证在特定指令之间的或到扩展寄存器的访问中的等待时间。
至此,已经根据实施例解释了依据本发明的编译程序,但本发明并不限于这个实施例。
例如,在本实施例中,定点的类型是16位或32位,小数点被放在MSB或其低数位,但本发明并不限于这样的格式,其定点是8位或64位并且其小数点被放在另一个数位的类型作为目标也是可以接受的。
另外,提供一个使用类库作为用于用户的开发支持工具的行为验证技术也是可以接受的。换句话说,如图78A所示,通常,依据本实施例对于目标机器(处理器1)采用交叉编译程序(编译程序100)来编译测试源和定义文件102和103;通过为带有专用模拟器的处理器1执行所获得的机器语言程序执行行为验证。作为替换,如图78B所示,准备一个其目标是用于开发的主机(例如,由英特尔公司制造的处理器)的类库(将运算符定义文件102和内置函数定义文件103分别与主机而非处理器1的机器语言指令联系起来的定义文件)并与测试源、定义文件102和103一起由本机编译程序(诸如Visual C++(R))编译并且主机执行所获得的机器语言程序as-is是可接受的。从而,可以在类似环境中高速执行一个模拟并执行行为验证。
此外,在本实施例中,与专用于目标处理器的机器语言指令相联系的运算符和内置函数被作为主文件(定义文件102和103)提供,但依据本发明的编译程序可以被配置为在编译程序本身中结合象这样的定义文件的信息。换句话说,依据本发明的编译程序是一个将上述定义文件102和103结合在其中的整体类型(integral-type)的程序,将编译程序配置为使得编译程序将源程序翻译成机器语言程序,该程序包括其中定义了对应于专用于一个目标处理器的机器语言指令的运算的运算定义信息,编译程序包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,其中,中间编码变换步骤包括检测子步骤,检测中间编码中的一个是否引用在运算定义信息中定义的运算;以及,替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。从而,用户不需要在源程序中包括定义文件。
权利要求
1.一种将一个源程序翻译成一个机器语言程序的编译程序,所述机器语言程序包括其中定义了对应于一个专用于一个目标处理器的机器语言指令的运算的运算定义信息,编译程序包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,其中,中间编码变换步骤包括检测子步骤,检测任何中间编码是否引用在运算定义信息中定义的运算;以及,替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。
2.如权利要求1所述的编译程序,其中,运算定义信息是要在源程序中包括的主文件,在主文件中,运算由一个由数据和方法组成的类定义,以及在中间编码变换步骤中,通过检测任何中间编码是否引用由主文件定义的类来检测任何中间编码是否引用运算。
3.如权利要求2所述的编译程序,其中,所述类定义一个定点类型,以及在检测子步骤中,检测使用定点类型数据的中间编码。
4.如权利要求3所述的编译程序,其中,所述类中的方法定义以定点类型数据为目标的运算符,在检测子步骤中,检测是基于以一个运算为目标的运算符和数据类型的一个集合是否适合所述方法中的定义来执行的,以及在替代步骤中,其运算符和数据类型的集合适合该定义的中间编码被用一个对应的机器语言指令来替代。
5.如权利要求2所述的编译程序,其中,所述类定义一个SIMD类型,以及在检测子步骤中,检测使用SIMD类型数据的中间编码。
6.如权利要求5所述的编译程序,其中,所述类中的方法定义了以SIMD类型数据为目标的运算符,在检测子步骤中,检测是基于以一个运算为目标的运算符和数据类型的一个集合是否适合所述方法中的定义来执行的,以及在替代步骤中,其运算符和数据类型的集合适合该定义的中间编码被用一个对应的机器语言指令来替代。
7.如权利要求2所述的编译程序,其中,所述类与实现对应的处理的一个机器语言指令相联系,以及,在替代子步骤中,中间编码被用与所述类相联系的一个机器语言指令替代。
8.如权利要求2所述的编译程序,其中,所述类与实现对应的处理的两个或更多机器语言指令相联系,以及,在替代子步骤中,中间编码被用与所述类相联系的两个或更多机器语言指令替代。
9.如权利要求1所述的编译程序,其中,运算定义信息是在源程序中包括的主文件,在主文件中,运算由所述函数定义,以及在中间编码变换步骤,通过检测任何中间编码是否引用由主文件定义的函数来检测任何中间编码是否引用运算。
10.如权利要求9所述的编译程序,其中,所述函数描述实现对应处理的一个机器语言指令,以及在替代子步骤中,中间编码被用在函数中描述的一个机器语言指令替代。
11.如权利要求10所述的编译程序,其中,所述函数包括一个返回被表示为从输入数据的最高有效位开始的一系列0的位的个数的函数,以及在所述函数中描述的机器语言指令对被表示为从存储在第一寄存器中的一个值的最高有效位开始的一系列0的位的个数进行计数,并将结果存储在第二寄存器中。
12.如权利要求10所述的编译程序,其中,所述函数包括一个返回被表示为从最高有效位开始的一系列1的位的个数的函数,以及,在所述函数中描述的机器语言指令对关于存储在第一寄存器中的值的被表示为从最高有效位开始的一系列1的位的个数进行计数,并将结果存储在第二寄存器中。
13.如权利要求10所述的编译程序,其中,所述函数包括一个返回与输入数据的最高有效位相同的值连续的位的个数的函数,以及,在所述函数中描述的机器语言指令对由一系列与存储在第一寄存器中的值的最高有效位相同的值表示的位的个数进行计数,并将结果存储在第二寄存器中。
14.如权利要求13所述的编译程序,其中,所述函数返回被表示为从最高有效位的下一位开始的一系列与输入数据的最高有效值相同的值的位的个数,以及,在所述函数中描述的机器语言指令对被表示为从存储在第一寄存器中的值的最高有效位的下一位开始的一系列与最高有效位相同的值的位的个数进行计数,并将结果存储在第二寄存器中。
15.如权利要求10所述的编译程序,其中,所述函数包括一个返回在输入数据中包括的位1的个数的函数,以及,在所述函数中描述的机器语言指令对存储在第一寄存器中的值的位1的个数进行计数,并将结果存储在第二寄存器中。
16.如权利要求10所述的编译程序,其中,所述函数包括一个基于从输入数据在指定位位置提取的位来返回一个符号扩展值的函数,以及,在所述函数中描述的机器语言指令从存储在第一寄存器中的值取出在由第二寄存器指定的位位置的位,对所述位进行符号扩展,并将符号扩展后的位存储在第三寄存器中。
17.如权利要求10所述的编译程序,其中,所述函数包括一个基于从输入数据在指定位位置提取的位来返回一个零扩展值的函数,以及,在所述函数中描述的机器语言指令从存储在第一寄存器中的值取出在由第二寄存器指定的位位置的位,对所述位进行零扩展,并将零扩展后的位存储在第三寄存器中。
18.如权利要求9所述的编译程序,其中,所述函数描述一个包括实现对应的处理的两个或更多机器语言指令的机器语言指令序列,以及在替代子步骤中,中间编码被用机器语言指令序列替代。
19.如权利要求18所述的编译程序,其中,所述函数包括一个更新模数寻址的地址的函数。
20.如权利要求19所述的编译程序,其中,在所述函数中描述的机器语言指令序列包括一个在第三寄存器中存储一个通过用一个存储在第二寄存器中的值替代存储在第一寄存器中的值的预定位字段而获得的值的机器语言指令。
21.如权利要求18所述的编译程序,其中,所述函数包括一个更新位反转寻址的地址的函数。
22.如权利要求21所述的编译程序,其中,在所述函数中描述的机器语言指令序列包括一个在第三寄存器中存储一个通过逐位反转存储在第一寄存器中的值的预定位字段的位置而获得的值的机器语言指令。
23.如权利要求9所述的编译程序,其中,所述函数包括一个可以用累加器作为基准类型来指定一个临时变量的函数,所述函数是一个同时更新不以优化中的分配为目标的累加器和以优化中的分配为目标的通用寄存器的操作。
24.如权利要求23所述的编译程序,其中,所述函数执行一个乘法并可以用累加器作为基准类型来指定一个临时变量,累加器存储乘法的结果。
25.如权利要求23所述的编译程序,其中,所述函数执行一个乘积和并可以用累加器作为基准类型来指定一个临时变量,累加器存储乘积和的结果。
26.如权利要求9所述的编译程序,其中,在替代子步骤,引用所述函数的中间编码被一个具有对应于所述函数的各种变元的各种运算数的机器语言指令替代。
27.如权利要求26所述的编译程序,其中,在替代子步骤,一个引用所述函数的中间编码(i)在所有变元是常数时被一个其运算数是通过保持在常数而获得的常数值的机器语言指令所替代;(ii)在变元的一部分是常数时被一个具有立即值运算数的机器语言指令所替代;以及(iii)在所有变元是变量时被一个具有寄存器运算数的机器语言指令所替代。
28.如权利要求1所述的编译程序,其中,优化步骤包括类型变换子步骤,在不同类型之间执行一个操作的多个中间编码或机器语言指令被执行所述操作的一个机器语言指令所替代。
29.如权利要求28所述的编译程序,其中,在类型变换子步骤中,执行一个乘以两个n位变量并将结果存储在一个2n位变量中的操作的多个中间编码或机器语言指令被执行所述操作的一个机器语言指令所替代。
30.如权利要求29所述的编译程序,其中,在类型变换子步骤中,当向两个变量作出实现从n位到2n位的类型变换的显式说明时,运算被机器语言指令所替代。
31.如权利要求1所述的编译程序,其中,编译程序以一个具有两个或更多个执行一个以两个或更多定点类型为目标的运算的定点模式的处理器为目标,在分析程序步骤,在源程序中检测一个切换定点模式的描述,以及,编译程序进一步包括定点模式切换步骤,当在分析程序步骤检测到所述描述时插入一个机器语言指令以遵循切换定点模式的描述来切换定点模式。
32.如权利要求31所述的编译程序,其中,切换定点模式的描述与一个目标函数相联系,以及在定点模式切换步骤,用于保存和返回定点模式的机器语言指令被分别插入到对应的函数的头部和尾部。
33.如权利要求1所述的编译程序,其中,优化步骤包括检测源程序中的描述的等待时间优化子步骤,所述描述指定其中在特定位置的执行时间只被保证预定数目的周期的等待时间,并调度一个机器语言指令以使得等待时间是依据所检测的指定被保证的。
34.如权利要求33所述的编译程序,其中,在等待时间优化子步骤,当检测到以带有第一标号的第一机器语言指令和带有第二标号的第二机器语言指令之间的间隔为目标的指定预定周期的等待时间的描述时,执行时间调度以使得从执行第一机器语言指令开始直到执行第二机器语言指令只花费所述数目的周期的执行时间。
35.如权利要求33所述的编译程序,其中,在等待时间优化子步骤,当检测到以对一个规定寄存器的访问为目标的指定预定周期的等待时间的描述时,执行时间调度以使得从执行访问寄存器的机器语言指令开始直到下一次执行访问所述寄存器的机器语言指令只花费所述数目的周期的执行时间。
36.如权利要求1所述的编译程序,其中,编译程序进一步包括一个类库,以便将用在运算定义信息中的机器语言指令以不同于所述编译程序作为目标的第一处理器的第二处理器的机器语言指令替代。
37.一种计算机可读记录介质,在其上记录了在要编译的源程序中包括的主文件,其中,其中定义了对应于专用于目标处理器的机器语言指令的运算的运算定义信息是在源程序中包括的主文件,在主文件中,运算由一个由数据和方法组成的类来定义。
38.一种计算机可读记录介质,在其上记录了在要编译的源程序中包括的类库,其中,编译程序进一步包括一个类库,以便将用在运算定义信息中的机器语言指令以不同于所述编译程序作为目标的第一处理器的第二处理器的机器语言指令替代。
39.一种计算机可读记录介质,在其上记录了要编译的包括主文件或类库中的至少一个的源程序,其中,其中定义了对应于一个专用于目标处理器的机器语言指令的运算的运算定义信息是在源程序中包括的主文件,在主文件中,运算由一个由数据和方法组成的类来定义,以及编译程序进一步包括一个类库,以便将用在运算定义信息中的机器语言指令以不同于所述编译程序作为目标的第一处理器的第二处理器的机器语言指令替代。
40.一种将一个源程序翻译成一个机器语言程序的编译程序装置,编译程序装置包括可用于保存其中事先定义了对应于一个专用于一个目标处理器的机器语言指令的运算的运算定义信息的单元,分析程序单元,可用于分析源程序;中间编码变换单元,可用于将分析的源程序变换成中间编码;优化单元,可用于优化变换的中间编码;代码产生单元,可用于将优化的中间编码变换成机器语言指令,其中,中间编码变换单元包括检测单元,可用于检测任何中间编码是否引用在运算定义信息中定义的运算;以及,替代单元,当检测到中间编码时,可用于用一个对应的机器语言指令替代中间编码,以及,优化单元用包括在替代单元中替代的机器语言指令的中间编码执行优化。
41.一种将一个源程序翻译成一个机器语言程序的编译方法,包括分析程序步骤,分析源程序;中间编码变换步骤,将分析的源程序变换成中间编码;优化步骤,优化变换的中间编码;以及,代码产生步骤,将优化的中间编码变换成机器语言指令,以及其中,中间编码变换步骤包括检测子步骤,检测中间编码中的任一个是否引用在其中事先定义了对应于一个专用于一个目标处理器的机器语言指令的运算的运算定义信息中定义的运算;替代子步骤,当检测到中间编码时,用一个对应的机器语言指令替代中间编码,以及,在优化步骤中,优化中间编码,中间编码包括在替代子步骤中替代中间编码的机器语言指令。
全文摘要
提供了在源程序101中包括的运算符定义文件102等和将源程序101翻译成机器语言程序105的编译程序100。运算符定义文件102包括由类定义对各种定点类型运算符的定义。编译程序100可以有效地产生处理器执行的高级和专用指令,并通过扩展函数等来作出改进,而不频繁地重复编译程序本身的版本的更新。编译程序100由产生中间编码的中间编码产生单元121、用机器语言指令替代引用由运算符定义文件102定义的类的中间编码的机器语言指令替代单元122和执行以包括替代的机器语言指令的中间编码为目标的优化的优化单元130组成。
文档编号G06F9/42GK1482540SQ0315225
公开日2004年3月17日 申请日期2003年8月1日 优先权日2002年8月2日
发明者瓶子岳人, 坂田俊幸, 小川一, 宫地凉子, 宫阪修二, 石川智一, 一, 二, 子, 幸 申请人:松下电器产业株式会社