摘要:介绍嵌式32位CPU在编译器中处理64位运算的办法,并罗列一个加法运算的比如,给出可供参考的指令模板。包含32位RISC体系嵌入式CPU层次结构和编译器后端结构。 关键词:RTL 指令模板 编译优化 1 概述 在信息化飞速发展的今日,计算机已成为人们学习和作业不行短少的东西,我国业已取得了电脑出产大国的位置;可是,作为计算机的中心——CPU的规划与制作,却成了几代计算机作业者的未了习愿,也给国家的安全带来了隐忧。顺应潮流,中芯微体系公司于2001年推出了国内第一颗实用化的32位CPU(方舟一号),主频到达166MHz。下一代方舟CPU将选用0.18μm工艺,超流水结构,主频能到达600MHz以上,在嵌入式CPU范畴走到国际前列。 传统的32位计算机处理64位运算一般是规划详细的逻辑电路完结。跟着SoC(System on Chip)的呈现,芯片上集成各种功用部件越来越多,特别关于嵌入式体系,片上能运用的空间就列加有限,这也要求将部分功用用软件来完结。关于64位长字运算软件完结的办法一般有两种:一是规划体系软件供操作体系内核调用;二是在相关的编译器中规划指令模板来处理。前者履行功率高,但每运用一次就要编译一次;后者只需编译一次,总的功率要高于前者。因而,实践选用在编译器中规划指令模板予以处理。 2 32位RISC体系嵌入式CPU层次结构描绘 图1是一个集成了DSP(数字信号处理器)嵌入式CPU的层次图。
从图1可看到,编译器在整个CPU结构中处于AS%&&&&&%硬件电路之下和操作体系之上,担负着将高档的、笼统的表达式转化为相对初级的表达式,终究生成体系指令集。 3 CPU编译器后端结构 CPU编译器分为前端和后端:前端首要完结词法/语法分析并生成语法树,这儿不再论说;后端是编译的主体部分,它将语法树转化成不间言语,在此不间言语基础上进行各种编译优化,终究生成汇编指令代码。编译后端在进行优化的进程中要跟详细的方针机的机器描绘文件屡次匹配,生成RTL言语(Register Transfer Language)—GNU CC的中心言语。 机器描绘文件由各种与方针机有关的指令模板、功用模板、C言语方法的预处理函数等构成。本文涉及到的64位运算便是由RTL和指令模板屡次匹配后生成汇编指令来处理的,进程如图2所示。 限于篇幅,这儿仅举64位加法运算的部分比如,其它运算与此相似。 4 64位加法运算指令板 ① RTL辨认指令模板,第一次匹配。 (define_insn “adddi3”) [(set(match_operand:DI 0 register_operand =r) (plus:DI (match_operand:DI 1“register_operand”“0”) (match_operand:DI 2 register_operand“r”))) (clobber(reg:SI 6))]//6号寄存器作进位运用 ) ② 将64位加法分解成高32位和低32位运算,第2次匹配。 (define_split [(set(match_operand:DI 0 register_operand“=r”) (plus:DI (match_operand:DI 1“register_operand”“0”) (match_operand:DI 2 “register_operand”“r”))) (clobber(reg:SI 6))] reload_complete “{ [(const_int 0)] //寄存器运用前清零 rtx low[3],high[3]; //rtx为一种处理表达式的数据类型 low[0]=gen_lowpart(Simode,operands[0]); low[1]=gen_lowpart(Simode,operands[1]); low[2]=gen_lowpart(Simode,operands[2]); high[0]=gen_rtx(REG,Simode,REGNO(operands[0]-1); high[1]=gen_rtx(REG,Simode,REGNO(operands[1]-1); high[2]=gen_rtx(REG,Simode,REGNO(operands[2]-1); //因为方舟CPU地址存储方法选用的是Big-Endian,即字节中的最高有用位具有最低序号,所以高位硬寄存器号要减1。 emit_insn(gen_addsi3_set_carry(low[0],low[1],low[2])) //低32位加并设置进位 emit_insn(gen_addsi3_use_carry(high[0],high[1],high[2])); //高32位加并处理进位 DONE;
} ③ 处理低32位加。 (define_insn addsi_set_carry [(set(match_operand:SI 0 (match_operand:SI1 register_operand r) (match_operand:SI 2 register_operand“r”))) (clobber(reg:SI6))] //以下判别是否有进位。有,则6号寄存器置1(set(reg:SI6) (itu:SI(plus:SI(match_dup 1)match_dup 2))(match_dup 1)))] add\t%0,%1,%2 //生成低32位汇编模板 ) ④处理高32位加。 (define_insn addi3_use_carry (define_insn adddi3_use_carry [(set(match_operand:SI 0 register_operand“=r”) (plus:SI(plus:SI(match_operand:SI 1 register_operand r)) (reg:SI 6))) (clobber(reg:SI 6))] “” add%0,%1,%2;add\t%0,%0,r6 //生成高32位带进位加汇编模板 ) 在机器描绘文件中,DI为64位机器方法,SI为32位方法。该文件由机器描绘处理程序进行格局转化,它将调用编译内部一套专门的函数和数据结构作为接口,生成gen_最初的预处理函数对指令模板作进一步的处理,再生成由insn_最初的函数对模板作匹配后生成汇编代码。 结语 在方舟二号CPU上测验的成果到达了64运算的要求,相关的指令代码如下: …… 132 r18,[r15,4] 132 r19,[r15,8] add r16,r16,r18 add r17,r17,r19 add r17,r17,r6 …… 用SPEC95进行定点运算测验,可达280MIPS以上,收到了较好的预期成果。