Next: , Previous: RTL Objects, Up: RTL


10.2 RTL类别和格式

不同的表达式代码被分为几个类别(classes),其有单个字符表示。你可以使用宏GET_RTX_CLASS (code)来确定RTX代码的类别。当前,rtl.def定义了这些类别:

RTX_OBJ
一个RTX代码,表示一个实际的对象,例如一个寄存器(REG)或者一个内存位置(MEM, SYMBOL_REF)。也包括LO_SUM);但是,SUBREGSTRICT_LOW_PART不在这个类别中,而是在x类别中。
RTX_CONST_OBJ
一个RTX代码,表示一个常量对象。HIGH也包含在该类别中。
RTX_COMPARE
一个RTX代码,针对一个非对称的比较,例如GEULT
RTX_COMM_COMPARE
一个RTX代码,针对一个对称(可交换)比较,例如,例如EQORDERED
RTX_UNARY
一个RTX代码,针对一元算术运算,例如NEGNOT或者ABS。这个类别还包括值扩展(符号扩展或者零扩展),以及整数和浮点之间的转换。
RTX_COMM_ARITH
一个RTX代码,针对可交换的二元运算,例如PLUS或者ANDNEEQ为比较运算,所以它们具有类别<
RTX_BIN_ARITH
一个RTX代码,针对不可交换的二元运算,例如MINUSDIV或者ASHIFTRT
RTX_BITFIELD_OPS
一个RTX代码,针对位域运算。当前只有ZERO_EXTRACTSIGN_EXTRACT。这些有三个输入,并且为左值。参见Bit-Fields
RTX_TERNARY
一个RTX代码,针对其它有三个输入的运算。当前只有IF_THEN_ELSEVEC_MERGE
RTX_INSN
一个RTX代码,针对整个指令:INSNJUMP_INSNCALL_INSN。参见Insns
RTX_MATCH
一个RTX代码,针对在insn中的一些匹配,例如MATCH_DUP。这些只出现在机器描述中。
RTX_AUTOINC
一个RTX代码,针对一个自动增量寻址模式,例如POST_INC
RTX_EXTRA
所有其它的RTX代码。这个类别包括只在机器描述(DEFINE_*等)中使用的其它RTX代码。其还表示所有表述副作用的RTX代码(SETUSECLOBBER等),以及在insn链中可能出现的非insn,例如NOTEBARRIERCODE_LABELSUBREG也属于该类。

对于每个表达式代码,rtl.def使用称作表达式代码格式(format)的字符序列,来说明所包含的对象数目,以及它们的种类。例如,subreg的格式为‘ei’。

这些是最常用的格式字符:

e
一个表达式(实际是一个表达式指针)
i
一个整数。
w
一个宽整数。
s
一个字符串。
E
一个表达式向量。

还有一些其它的格式字符有时会被用到:

u
u’等价于‘e’,只不过是在调试转储中的打印有所区别。其用于insn指针。
n
n’等价于‘i’, 只不过是在调试转储中的打印有所区别。其用于note insn的行号和代码号。
S
S’表示一个可选的字符串。在内部的RTX对象中,‘S’等价于‘s’,但当对象从‘md’文件中读取的时候,该操作数的字符串值可以被忽略。被忽略的字符串被当作一个空字符串。
V
V’表示一个可选的向量。在内部的RTX对象中,‘V’等价于‘E’,但是当对象从‘md’文件中读取的时候,该操作数的向量值可以被忽略。被忽略的向量被当作一个没有元素的向量。
B
B’表示一个指向基本块结构体的指针。
0
0’表示一个插槽,其内容不使用任何常规的类别。‘0’插槽根本不在转储中打印,通常在编译器中用于特定的方式。

这些是获得操作数数目和表达式代码格式的宏:

GET_RTX_LENGTH (code)
代码为code的RTX的操作数个数。


GET_RTX_FORMAT (code)
代码为code的RTX的格式,为C字符串。

一些RTX代码的类别总是具有相同的格式。例如,可以安全的假设所有的比较运算都具有格式ee

1
所有该类别的代码都具有格式e
<
c
2
所有这些类别的代码都具有格式ee
b
3
所有这些类别的代码都具有格式eee
i
所有该类别的代码具有的格式都起始于iuueiee。参见Insns。注意,并不是所有被链接到insn链表中的RTX对象都属于类别i
o
m
x
你可以不去假设这些代码的格式。