免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1156 | 回复: 0
打印 上一主题 下一主题

12 RTL表示 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-16 23:14 |只看该作者 |倒序浏览

                12 RTL 表示
GCC的大部分工作是基于一种称为寄存器转换语言的中间表示上进行的。在RTL中,要描述的输出指令有相当一部分是以字母表顺序,一个接一个地描述指令完成的工作。
RTL的产生受到了LISP表的启发。它既有内部(内存)形式,这种形式是由指向其他结构的结构组成;也有文本形式,这种形式用于机器描述和调试输出打印。文本形式使用嵌套的括号表示内部形式的指针。
RTL对象: 表达式、向量、字符串和整数。
RTL类:RTL表达式对象的种类和他们的结构。
RTL的访问器:访问表达式操作书或向量元素的宏。
特殊的RTL访问器:访问特定RTL标注的宏。
标记:RTL表达式中的其他标记。
机器模式:描述数据大小和格式。
常量表达式:包含常量值的表达式。
寄存器和存储器表达式:表示寄存器内容或存储器的表达式。
算术运算表达式:表示对其他表达式进行算术运算的表达式。
比较表达式:表示表达式比较运算的表达式。
位字段表达式:表示存储器或寄存器中位字段的表达式。
向量操作表达式:向量类型相关的表达式。
转换运算表达式:扩展、截取、浮点或顶点运算表达式。
RTL申明表达式:申明易失性变量,常量等。
副作用表达式:值存储在寄存器中的表达式等。
递增/递减表达式:嵌套在自动递增寻址中的副作用。
汇编操作表达式:表示asm指令中的操作数。
指令表达式:整个指令的表达式类型。
调用表达式:表示函数调用指令的表达式。
共享表达式:有些表达式是唯一的;而其他表达式“必须”拷贝。
读入RTL的表达式:从文件中读入文本形式的RTL。
12.1 RTL对象类型
RTL使用五种类型的对象:表达式,整数,宽整数,字符串和向量。其中表达式是最重要的一类对象。一个RTL表达式(简称为RTX)是一个C结构,但是它通常用指针来访问;表达式的类型用typedef定义为rtx。
一个整数对象就是一个int;他们的输出形式使用十进制数字表示。一个宽整数是一个其类型为HOST_WIDE_INT的整数对象;他们的输出形式也是用十进制数字表示。
一个字符串是一组字符序列。其核心是用char *表示的常见C形式的字符数组,而且其输出形式也是用C语法表示。然而RTL中的字符串永远不可能为空(null)。如果在机器描述中使用了一个空字符串,那么在RTL内部表示中是用一个空指针而不是一个指向空字符的指针。在某些环境中,空指针是有效的,而字符串是无效的(In certain contexts, these null pointers instead of strings are valid)。RTL代码中,字符串常用在symbol_ref表达式中,但是他们出现在组成机器描述的RTL表达式的其他场合。
机器描述中,字符串常用双引号引住,正如C语言中一样。然而,机器描述中的字符串可能扩展为多行,这在C中是无效的,并且在C中相邻字符串常量并不拼接。任何字符串常量可能用一对小括号括住。这样做有时会使机器描述可读性更好。
有一种特殊语法的字符串,这种字符串在机器描述中嵌入C代码是十分有用的。一个字符串能出现的地方,一个C类型的大括号也是可以的。在整个大括号范围内,包括外面的大括号,被看作是字符串常量。大括号中的双引号字符是普通字符,并没有特殊的含义。因此,如果在C代码中使用了字符串常量,那么不必用反斜杠将每个引号转义。
一个向量可以包含任意多个指向表达式的指针。向量的元素个数显示在向量中指定。向量的书写形式是由方括号括住的元素组成,这些元素依次用空格隔开。长度为零的向量并不被实际创建;这样的向量用空指针代替。
表达式按照表达式编码(也称为RTX编码)分类。表达式编码是定义在rtl.def中的名字,它也是一个C枚举类型常量(大写)。表达式编码和它的所表示的内容是机器无关的。RTX的编码也可以用宏GET_CODE(X)来提取(访问),用宏PUT_CODE(x, newcode)来改变。
任何种类的表达式编码决定了该类表达式包含的操作数个数。RTL与Lisp不同的是,不能通过操作数类型确定表达式的种类。与此相反,必须从表达式编码确定该表达式类型。例如,对于一个subreg表达式,第一个操作数认为是一个表达式,第二个操作数认为是一个整型数据。在一个plus表达式中,两个表达式都被认为是表达式。在symbol_ref表达式中,仅有一个操作数,它被认为是字符串。
表达式的书写格式是用一对括号内包含一个表达式类型,表达式的标记和可能的机器模式以及用空格隔开的表达式的操作数表示。
在MD文件中表达式编码名字用小写形式表示,但是在C代码中用大写形式表示。在本手册当中,他们用如下的形式表示:const_int。
在许多场合中,用空指针表示表达式是有效的。这时用(nil)表示。
12.2RTL类和格式
表达式编码分成以下类型,这些类型都用单个字符串表示。用宏GET_RTX_CLASS(code)能够确定RTL编码的种类。现在,rtl.def中定义了如下RTL编码类:
RTX_OBJ
     表示一个实际对象的RTX编码,比如寄存器(REG)或者一个存储器位置((MEM,SYMBOL_REF).LO_SUM);然而SUBREG和STRICT_LOW_PART不是这种类型的表达式,他们属于x类表达式。
RTX_CONST_OBJ
    表示一个常量对象的表达式。HIGH属于这种类型的表达式。
RTX_COMPARE
    表示非对称比较的RTX编码,比如GEU或LT。
RTX_COMM_COMPARE
    表示对称(可交换)比较的RTX编码,比如EQ或ORDERED。
RTX_UNARY
    表示一元运算操作的RTX编码,比如PLUS或AND,ABS。这种表达式也包括值扩展(符号或零扩展)和整数和浮点数之间的转换。
RTX_COMM_ARITH
    表示可交换二元操作的表达式,比如PLUS或AND,以及NE和EQ等比较操作,所以他们种类编码为<。
RTX_BIN_ARITH            
     表示非交换二元操作的表达式编码,比如MINUS,DIV或ASHIFT。
RTX_BITFIELD_OPS
     表示位字段操作的RTX编码。但前只有ZERO_EXTRACT和SIGN_EXTRACT。这些表达式有三个输入操作数,其结果可以作为左值。(所以他们也可以用于插入)。见位字段。
RTX_TENARY
     表示其他有三个输入操作数的RTX编码。当前只有IF_THEN_ELSE和VEC_MERGE两中表达式属于这个类型。
RTX_INSN
     表示整条指令的RTX编码:INSN,JUMP_INSN和CALL_INSN。见指令。
RTX_MATH
    表示数学运算类信的RTX表达式编码,比如MATCH_DUP。这些表达式只能出现在机器描述中。
RTX_AUTOINC
     表示自动递增寻址模式的RTX表达式编码,比如POST_INC。
RTX_EXTRA
     所有其他RTX表达式编码。这种类型的表达式包含只在机器描述中出现的其他表达式类型(DEFINE_*等)。此外也包含描述副作用的表达式(SET,USE,CLOBBER等)和可能在NOT,BARRIER和CODE_LABEL这样的指令链上的非指令表达式。SUBREG也是种表达式的一种。
对于每一种表达式类型,rtl.def使用称为表达式编码格式的一组字符指定了该种表达式中包含的对象数目和种类。例如,subreg的格式是“ei”。
下面是最常使用的格式字符:
e 一个表达式(实际上是一个指向表达式的指针)。
i 一个整数。
w 一个宽整数。
s 一个字符串。
E 一个表达式向量。
其他偶尔使用的格式字符:
u 除了在调试输出不同,u与e等同。u用来指向指令。
n 除了在调试输出不同,n与i等同。n用来输出行好或note指令的编号(code number)。
S S表示字符串是可选的。在RTL对象内部,S与s是等同的,但是当这种表达式从md文件中读取时,这种操作数可能被省略。一个被省略的向量与空向量的效果是等价的。
B B表示指向一个基本块的指针。
0  0表示不能用任何正常类型对象填充的槽。在输出时,0槽并不打印出来,它经常被编译器的某些部分用于某些特殊场合。
下面这些宏获取一个表达式编码的操作数个数和格式。
GET_RTX_LENGHT(code) 获取code类型表达式的操作数个数。
GET_RTX_FORMAT(code) 获取code类型表达式的格式,得到的是一个C字符串。
有些RTX表达式常有相同的格式。例如,可以假定在哦有比较表达式的格式为ee。
1   所有这种类型的表达式的格式为e。
<
c
2  所有这些类型的表达式的格式为ee。
b
3  所有这些类型的表达式的格式为eee。
i 所有这些类型的表达式的格式为iuueiee。见指令。注意并不是所有的RTL对象都链进i类的指令链中。
o
m
x 对这些类型的RTX表达式不能做任何假定。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26291/showart_302967.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP