Next: Example, Previous: Overview, Up: Machine Desc
每个指令模式包含了一个不完全的RTL表达式,和之后要被填充的部分;操作数constraint,用来
限制如何填充那些部分;以及一个输出模式或者C代码来生成汇编输出。所有这些都由一个
define_insn
表达式包裹起来。
define_insn
是一个RTL表达式,包含了四或五个操作数:
空字符串表示不存在名字。没有命名的指令模式是不会被用来生成RTL代码的,但是之后它 们能够用来组合多个简单insn。
不识别的并且因此不在RTL生成中使用的名字,没有任何作用,就像没有命名一样。
出于调试编译器的目的,你可能还需要指定一个名字起始于 ‘*’ 字符。这样的名字只 被用来标识RTL dump中的指令,其它的都与没有命名的模式一样。
match_operand
,
match_operator
和 match_dup
表达式,用来表示指令的操作数。
如果向量只有一个元素,则那个元素为指令模式的模版。如果向量有多个元素,则指令模式是一个 parallel
表达式,包含了所描述的元素。
对于命名模式,条件(如果存在)可能不取决于要被匹配的insn的数据,而只是取决于 目标-机器-类型标记(target-machine-type flag)。编译器需要在初始化时测试这些条 件,以至于能够确切的知道在这一次运行中,哪些命名指令是可用的。
对于没有命名的模式,条件只用来匹配一个单独的insn,并且只在insn已经匹配了模式的识
别模版。insn的操作数可以为vector operands
。对于一旦条件匹配的insn,它便不能被用来控制寄存器分配,例如用来排除某个硬件寄存器,或者硬件寄存器组合。
当简单替换无法满足需求的时候,你可以指定一块C代码来计算输出。 参见Output Statement。