Next: , Previous: Overview, Up: Machine Desc


16.2 指令模式的方方面面

每个指令模式包含了一个不完全的RTL表达式,和之后要被填充的部分;操作数constraint,用来 限制如何填充那些部分;以及一个输出模式或者C代码来生成汇编输出。所有这些都由一个 define_insn 表达式包裹起来。

define_insn 是一个RTL表达式,包含了四或五个操作数:

  1. 一个可选的名字。存在名字表明该指令模式能够为编译器的RTL生成过程,执行一个确定的 标准工作。这个过程知道确定的名字,并且如果在机器描述中定义了这些名字,则会使用 它们的指令模式。

    空字符串表示不存在名字。没有命名的指令模式是不会被用来生成RTL代码的,但是之后它 们能够用来组合多个简单insn。

    不识别的并且因此不在RTL生成中使用的名字,没有任何作用,就像没有命名一样。

    出于调试编译器的目的,你可能还需要指定一个名字起始于 ‘*’ 字符。这样的名字只 被用来标识RTL dump中的指令,其它的都与没有命名的模式一样。

  2. RTL template(参见RTL Template)是一个不完全的RTL表达式向量,展示了这 条指令的样子。所谓不完全是因为它可以包含 match_operand, match_operatormatch_dup 表达式,用来表示指令的操作数。

    如果向量只有一个元素,则那个元素为指令模式的模版。如果向量有多个元素,则指令模式是一个 parallel 表达式,包含了所描述的元素。

  3. 一个条件。这是一个字符串,包含了一个C表达式用来最终测试,判定一个insn实体是否匹 配该模式。

    对于命名模式,条件(如果存在)可能不取决于要被匹配的insn的数据,而只是取决于 目标-机器-类型标记(target-machine-type flag)。编译器需要在初始化时测试这些条 件,以至于能够确切的知道在这一次运行中,哪些命名指令是可用的。

    对于没有命名的模式,条件只用来匹配一个单独的insn,并且只在insn已经匹配了模式的识 别模版。insn的操作数可以为vector operands。对于一旦条件匹配的insn,它便不能被用来控制寄存器分配,例如用来排除某个硬件寄存器,或者硬件寄存器组合。

  4. output template:一个字符串,说明了如何将匹配的insn输出为汇编代码。字符串 中的 ‘%’ 指定了替换一个操作数值的地方。参见Output Template

    当简单替换无法满足需求的时候,你可以指定一块C代码来计算输出。 参见Output Statement

  5. 一个可选的向量,包含了匹配该模式的insn的属性值。参见Insn Attributes