CN102831004A - 一种基于C*core处理器的优化编译方法及编译器 - Google Patents
一种基于C*core处理器的优化编译方法及编译器 Download PDFInfo
- Publication number
- CN102831004A CN102831004A CN2012102430433A CN201210243043A CN102831004A CN 102831004 A CN102831004 A CN 102831004A CN 2012102430433 A CN2012102430433 A CN 2012102430433A CN 201210243043 A CN201210243043 A CN 201210243043A CN 102831004 A CN102831004 A CN 102831004A
- Authority
- CN
- China
- Prior art keywords
- address
- immediately
- compiler
- access
- storage
- 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
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种基于C*core处理器的优化编译方法及与其相匹配的编译器,包括对源程序代码进行预处理,并对与处理后的源程序代码进行词法和语法的分析,按照预先确定的规则确定对前端传递过来的立即数采取怎样的处理方法。并根据这种方法尽量的产生和存储器操作不相关的汇编指令。由于采用上述技术方案,优化的编译器编译出来的汇编指令要比以前编译器编译出来的汇编指令中含有地址存储的指令的条数少很多,虽然指令条数要比原来多一些,但是这些指令都是单周期指令,并且不需要访问内存,所以这样的执行效率要比以前高很多。
Description
技术领域
本发明属于计算机技术领域,尤其是一种涉及基于C*core处理器的一种编译方法和编译器。
背景技术
编译器是现代计算机系统的重要组成部分之一。简单来讲,一个编译器就是一个语言翻译程序,它将高级语言编写的源程序等价的翻译成目标机可以识别的低级语言(汇编语言或机器语言)。这是一个复杂的过程,可以大致把它分成五个阶段:词法分析、语法分析、语义检查及中间代码生成、代码优化和目标代码生成。
通常把词法分析、语法分析和语义检查及中间代码生成统称为前端,前端主要用来读入源程序,生成分析树,这一阶段针对源程序进行工作,与目标机无关;而一旦树生成,编译器后端就可以从其中读出信息,进而转换成目标平台所能识别的汇编程序。从上述编译过程的实现中可以发现,编译器的前端主要对源程序进行处理,跟目标机无关,这使得前端无法进行和处理器相关的代码优化,从而对目标代码的优化工作主要在后端进行。优化应该针对那些最常被执行的代码段,以及那些最常被书写的代码段来进行。优化的目的是为了既要图缩短代码执行的时间,又企图减少生成的代码量,通常是在两者之间折衷。而现在许多编译器在后端的优化中,对一些地址立即数的处理方式是将其存放到存储器中,在使用的时候再将其取出来。这使得处理器频繁的访问存储器,大大的降低了处理器的性能。
C*core处理器是专为高性能和功耗敏感的嵌入式控制应用而设计的,强调降低系统的功耗。改为处理器具有32位的load/store精简指令集(RISC)架构;固定16位指定长度;16个32位通用寄存器文件;存取指令可包括4位偏移量;高效的4级执行流水线;多数指令单周期执行,分支指令访问仅需2个周期;支持字节,半字和字三种类型的存储器访问;支持向量和自动向量的中断;硬件证书乘法器阵列等结构特点。
发明内容
本发明提供一种提供一种基于C*core处理器的优化编译方法及编译器,使得编译后的目标程序能够尽可能的避免访问存储器,充分发挥处理器的性能。
为达到上述效果,本发明采用的技术方案是:一种基于C*core处理器的优化编译方法,包括对源程序代码进行预处理,并对处理后的源程序代码进行词法和语法的分析,该方法还包括:第一步骤:判断源程序是否有立即数寻址操作;
第二步骤:如果有立即数寻址操作,则对地址进行分析,将传递下来的地址进行分类,同时标记对地址进行分类时对地址进行的操作。如果没有立即数寻址操作,则直接生成最终代码;
第三步骤:将第二步骤所记录的各类地址进行检测,并判断其是否可以表示成非存/取的指令格式;
第四步骤:对第三步骤中的可以用非存/取的指令格式表示的地址或立即数进行处理,确定其表示方式;
第五步骤:将第四步骤中的地址或地址立即数利用事先定义好的方式用非存/取的指令格式表示出来;
第六步骤:利用上述过程中所产生的新的指令格式来产生最终的汇编代码。
进一步的,所述的第二步骤中对地址进行分析和标记是指对地址立即数的操作属性、操作数类型、地址、数据进行分析和标记。
进一步的,所述的判断其是否可以表示成中非存/取的指令格式是指其是否可以用不多于3条指令表示成的地址立即数。
进一步的,一种根据上述编译方法的编译器,包括前端,所述的所述的编译器还包括地址检测单元和地址立即数处理单元,立即数检测单元用于判断地址和特殊的立即数地址,地址立即数处理单元对地址或特殊立即数进行处理,确定其表示方式。
由于采用上述技术方案,优化的编译器编译出来的汇编指令要比以前编译器编译出来的汇编指令中含有地址存储的指令的条数少很多,虽然指令条数要比原来多一些,但是这些指令都是单周期指令,并且不需要访问内存,所以这样的执行效率要比以前高很多。
附图说明
图1是现有编译器前端处理流程图
图2是本发明编译方法流程图
图3是用原来的编译器和改进的编译器编译后的结果示意图
图4是判断其是否可以表示成中非存/取的指令格式的流程图
图5是对地址立即数进行各种属性的分析和标记的流程图。
具体实施方式
如图1所示,现有的编译方法主要对源程序进行处理,读入源程序,生成分析树,进而转换成目标平台所能识别的汇编程序。优化应该针对那些最常被执行的代码段,以及那些最常被书写的代码段来进行。优化的目的是为了既要图缩短代码执行的时间,又企图减少生成的代码量,通常是在两者之间折衷。而现在许多编译器在后端的优化中,对一些地址立即数的处理方式是将其存放到存储器中,在使用的时候再将其取出来。
图2为本发明编译方法流程图,由图2可以看出,该编译方法对前端生成的中间代码进行了进一步处理,按照预先确定的规则确定对前端传递过来的立即数采取怎样的处理方法。首先将对前端处理过的信息进行检测,判断其中是否有寻址操作,同时,还检测一些特殊的立即数。然后根据尽可能减少存取动作的原则对当前传递过来的信息中含有寻址操作的立即数进行处理,决定该地址立即数的实现方式。最终生成和存储器操作无关的指令。
本发明是根据32位嵌入式CPU--C*Core的处理器架构机器指令特点而生成的一套优化寻址的方法,下面来举例进一步解释本发明:
其具体的实施方案具体步骤如下:
1.在通过编译器前端的分析和处理之后,将生成的中间代码通过地址立即数检测单元进行分析。在地址检测单元中本发明主要应用函数C*core_addressing_judge(enum MDL_code code,enum machine_modemode,struct MDL insn,HOST_WIDE_INT val,struct MDL target,struct MDL source,int subtargets);
来进行寻址操作的判断。在此函数中:
enum MDL_code code是一个枚举型的变量,它用来传递编译器前端处理过后形成的中间代码的类型,比如SET、AND、XOR等等;
enum machine_mode mode是目标机器处理的数据类型比如SI(Single Integer),HI(Half Integer)等等;
struct MDL insn是一个由中间变量组成的结构体,它代表形成的中间语言中类似指令的一种结构;
WIDE_INT val是一个整型变量,用来传递中间语言中生成的整型数据(包括地址、数据等);
struct MDL target和struct MDL source都是有中间变量组成的结构体,它们分别表示在中间语言中带有数据转移的目的和源头;
int subtargets是一个整形变量,如果它为真的话表示为当前处理信息分配寄存器是安全的。
图5为该步骤的流程图,由此图可以看出,在此步中实质上根据C*core处理器的架构和指令集特点对中间代码中的地址立即数进行各种属性的分析和标记。比如某个地址立即数用来给某个寄存器进行直接的赋值,那么,则将它的操作属性标记为SET;如果该地址立即数要与其它的地址立即数进行加法操作,则应该将它标记为PLUS的操作属性,再如果,该地址立即数所要寻址的操作数为整型数据,则将它的寻址属性标记为SI(SingleInteger)型。
本单元对以上所描述的中间代码种类、目标机器处理数据类型、类指令、地址、数据分类整理记录,并将此步骤的记录结果用于后边的操作输入,判断当前处理是否含有寻址操作,并依据其结果决定继续执行下一步骤,还是跳转到步骤5;
2.此步骤的主要工作是将上一步骤传递下来的地址立即数进行粗略的分类,以便于对地址立即数进行更深层次的优化处理。其分类方法主要是根据C*core处理器的架构和指令集的特点,根据一定的算法来判断步骤1传递下来的地址立即数是否可以用非存/取的指令来表示出来,并且将可以用非存/取指令表示出来的地址立即数进行表示条数的标记。此步骤中用到的主要函数为C*core_classfy_address(WIDE_INT value,WIDE_INT*x,WIDE_INT*y)。
在此函数中:
WIDE_INT value:传递的是一个整型变量参数,一般为步骤1中所要传递的地址立即数;
WIDE_INT*x:传递的也是一个整型变量,它主要用来传递并存储在对value进行分类时对value处理过后的值;
WIDE_INT*y:和*x一样,它和x配合使用可以得到处理前的value的值。
3.此步骤将步骤1中的信息进行进一步的提取,将步骤1中传递下来的地址立即数进行分类,同时记录对地址进行分类时对地址进行的操作,以方便后面对其进行非存/取操作指令的表示。
4.对步骤2中的各类地址进行检测,并判断其是否可以表示成非存/取的指令格式这里,本发明将可以用3条及以内的指令表示成的地址立即数定义为可用非存/取指令表示的地址立即数。因为,从理论上来说,如果不限制指令条数,任何的立即数都可以用非存/取的指令表示出来,但是如果用来表示立即数的指令条数过多的话,它的开销就会比直接进行存取的开销要大,这样就使得本方法失去意义。所以,本发明以3条指令为限定义是否可以用非存/取指令来表示。另外,用3条指令已经可以表示大部分的地址立即数。本步骤主要依靠函数:
来对地址立即数进行判断分类。此函数中主要包括const_ok_for_C*core();const_ok_two_for_C*core();和const_ok_three_for_C*core();三个部分,它们分别检测当前地址立即数是否可以用一条、两条和三条指令表示,同时返回所需要指令的条数。图4是此判断过程的流程图,此外,本函数根据其判断结果来决定是否进行下一步操作或跳转到步骤5。
4.此步骤将步骤1中的信息进行进一步的提取,将步骤1中传递下来的地址立即数进行分类,同时记录对地址进行分类时对地址进行的操作,以方便后面对其进行非存/取操作指令的表示。
5.依据步骤3中的结果,将步骤3中的地址立即数利用事先定义好的方式用非存/取的指令格式表示出来;根据C*core指令集的特点,可以用movi(产生一个大于等于0,小于等于127的立即数)、bgeni(产生一个2的n次方幂的立即数,n大于等于7小于等于31,因为当n小于7的立即数,可用movi指令得到。比如256(n等于8))和bmaski(产生一个2n-1的立即数,n取0或者n大于等于8,小于等于31,同样n大于等于1小于等于7的立即数可用movi实现,比如1023(此时n等于10))三条指令来产生一个立即数,然后再利用加、减、移位等操作对这些数据进行操作,最终产生所需要的地址立即数,这样就可以通过指令组合来实现快速寻址,避免重复访问存储器所带来的消耗;比如十六进制数据0x8000_0234,利用现在的编译器只能编译出lrw rl,0x8000_0230(从内存中读取一个数到寄存器中,注:C*Core的存/取指令中可包含4位偏移量,所以地址立即数的最后四位可以用偏移量来计算。)这样的指令,而经过本专利的优化之后则可以编译出movi r1,23;rolti rl,1;bseti r1,31;三条指令。
6.利用上述过程中所产生的新的指令格式来产生最终的汇编代码。
例如:
函数:
将地址0x234和地址0x456中的数据相加然后将结果给sum,用原来的编译器和改进的编译器编译后的结果分别如图3左右所示,经过本方法优化的编译器编译出来的汇编指令要比以前编译器编译出来的汇编指令中含有lrw指令的条数少很多,这样虽然指令条数要比原来多一些,但是这些指令都是单周期指令,并且不需要访问内存,所以这样的执行效率要比以前高很多。
以上对本发明的一个实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。
Claims (4)
1.一种基于C*core处理器的优化编译方法,包括对源程序代码进行预处理,并对处理后的源程序代码进行词法和语法的分析,其特征在于:该方法还包括:
第一步骤:判断源程序是否有立即数寻址操作;
第二步骤:如果有立即数寻址操作,则对地址进行分析,将传递下来的地址进行分类,同时标记对地址进行分类时对地址进行的操作。如果没有立即数寻址操作,则直接生成最终代码;
第三步骤:将第二步骤所记录的各类地址进行检测,并判断其是否可以表示成非存/取的指令格式;
第四步骤:对第三步骤中的可以用非存/取的指令格式表示的地址或立即数进行处理,确定其表示方式;
第五步骤:将第四步骤中的地址或地址立即数利用事先定义好的方式用非存/取的指令格式表示出来;
第六步骤:利用上述过程中所产生的新的指令格式来产生最终的汇编代码。
2.根据权利要求1所述的编译方法,其特征在于:所述的第二步骤中对地址进行分析和标记是指对地址立即数的操作属性、操作数类型、地址、数据进行分析和标记。
3.根据权利要求1所述的编译方法,其特征在于:所述的判断其是否可以表示成中非存/取的指令格式是指其是否可以用不多于3条指令表示成的地址立即数。
4.一种根据权利要求1所述编译方法的编译器,包括前端,其特征在于:所述的编译器还包括地址检测单元和地址立即数处理单元,立即数检测单元用于判断地址和特殊的立即数地址,地址立即数处理单元对地址或特殊立即数进行处理,确定其表示方式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210243043.3A CN102831004B (zh) | 2012-07-13 | 2012-07-13 | 一种基于C*core处理器的优化编译方法及编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210243043.3A CN102831004B (zh) | 2012-07-13 | 2012-07-13 | 一种基于C*core处理器的优化编译方法及编译器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102831004A true CN102831004A (zh) | 2012-12-19 |
CN102831004B CN102831004B (zh) | 2015-07-15 |
Family
ID=47334153
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210243043.3A Active CN102831004B (zh) | 2012-07-13 | 2012-07-13 | 一种基于C*core处理器的优化编译方法及编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102831004B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104216754A (zh) * | 2014-09-23 | 2014-12-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN111124416A (zh) * | 2019-12-09 | 2020-05-08 | 龙芯中科(合肥)技术有限公司 | 向内联汇编传递参数的方法、装置、设备以及存储介质 |
CN117688564A (zh) * | 2024-02-01 | 2024-03-12 | 山东大学 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050108499A1 (en) * | 2003-11-19 | 2005-05-19 | Bo Huang | Memory access instruction vectorization |
CN102385524A (zh) * | 2011-12-23 | 2012-03-21 | 浙江大学 | 一种基于混编指令集的编译链指令替换方法 |
-
2012
- 2012-07-13 CN CN201210243043.3A patent/CN102831004B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050108499A1 (en) * | 2003-11-19 | 2005-05-19 | Bo Huang | Memory access instruction vectorization |
CN102385524A (zh) * | 2011-12-23 | 2012-03-21 | 浙江大学 | 一种基于混编指令集的编译链指令替换方法 |
Non-Patent Citations (1)
Title |
---|
杨川龙: "《基于GCC的嵌入式系统编译器的研究与开发》", 《中国优秀硕士学位论文全文数据库(电子期刊)》, 15 December 2006 (2006-12-15), pages 9 - 53 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104216754A (zh) * | 2014-09-23 | 2014-12-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN104216754B (zh) * | 2014-09-23 | 2017-05-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN111124416A (zh) * | 2019-12-09 | 2020-05-08 | 龙芯中科(合肥)技术有限公司 | 向内联汇编传递参数的方法、装置、设备以及存储介质 |
CN111124416B (zh) * | 2019-12-09 | 2024-02-13 | 龙芯中科(合肥)技术有限公司 | 向内联汇编传递参数的方法、装置、设备以及存储介质 |
CN117688564A (zh) * | 2024-02-01 | 2024-03-12 | 山东大学 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
CN117688564B (zh) * | 2024-02-01 | 2024-05-03 | 山东大学 | 一种用于智能合约事件日志的检测方法、装置和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102831004B (zh) | 2015-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8806463B1 (en) | Feedback-directed inter-procedural optimization | |
JP4745341B2 (ja) | 依存性チェーン処理のためのシステム、方法及び装置 | |
JP4183399B2 (ja) | 複数言語のコンパイル方法及びシステム | |
Cohen et al. | Processor virtualization and split compilation for heterogeneous multicore embedded systems | |
CN104536898B (zh) | C程序并行区域的检测方法 | |
US9823911B2 (en) | Method and apparatus for compiling code based on a dependency tree | |
CN102099786A (zh) | 程序优化方法 | |
US11526433B2 (en) | Data structure allocation into storage class memory during compilation | |
US7480768B2 (en) | Apparatus, systems and methods to reduce access to shared data storage | |
CN102385524B (zh) | 一种基于混编指令集的编译链指令替换方法 | |
US20160357529A1 (en) | Parallel computing apparatus and parallel processing method | |
CN1849584B (zh) | 混合模式指令的动态最佳匹配编译的方法和设备 | |
Brandstätter et al. | Characterizing efficiency optimizations in solidity smart contracts | |
CN102831005A (zh) | 针对C*core处理器寄存器分配的编译方法及编译器 | |
CN102289362A (zh) | 分段符号执行装置及其工作方法 | |
CN102156634B (zh) | 一种实现值关联间接跳转预测的方法 | |
CN102831004A (zh) | 一种基于C*core处理器的优化编译方法及编译器 | |
CN112130848B (zh) | 一种面向便笺式存储器的带宽感知循环分块优化方法、编译系统、设备及存储介质 | |
US20050149912A1 (en) | Dynamic online optimizer | |
De Sutter et al. | Combining global code and data compaction | |
Popov et al. | Piecewise holistic autotuning of compiler and runtime parameters | |
CN102446112A (zh) | 指令处理装置和处理器、指令翻译装置和方法 | |
US10108405B2 (en) | Compiling apparatus and compiling method | |
CN102023870B (zh) | 一种软件修改的检测方法、装置及电子设备 | |
El-Shobaky et al. | Automatic vectorization using dynamic compilation and tree pattern matching technique in Jikes RVM |
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 |