在32个处理器中编辑并且翻译64固定的点进位计算

姓名:黎文渊

学号:17021210909

引自:http://lw.3edu.net/qrs/lw_46704.html

嵌牛导读:介绍嵌式32位CPU在编译器中解决64位运算的方法,并列举一个加法运算的例子,给出可供参考的指令模板。包括32位RISC体系嵌入式CPU层次结构和编译器后端结构。

嵌牛鼻子:RTL 指令模板 编译优化

嵌牛提问:如何在32个处理器中编辑并且翻译64固定的点进位计算?

嵌牛正文:

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结构中处于ASIC硬件电路之下和操作系统之上,担负着将高级的、抽象的表达式转化为相对低级的表达式,最终生成系统指令集。

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位运算,第二次匹配。

(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以上,收到了较好的预期结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容