Next: Patterns, Up: Machine Desc
编译器中有三个主要的转换:
生成过程,只与insn的名字有关系,包括命名的 define_insn
或者 define_expand
。编译器会选择恰当名字的模式,并且根据这章后面的文档来使用 操作数,而不需要关心RTL模板或者操作数constraint。注意,编译器所寻找的名字是被硬编码 进编译器中的——它将忽略未命名的模式和名字无法识别的模式,但是,如果你没有提供所 需要的命名模式,它将异常中断(abort)。
如果使用了 define_insn
,所给出的模版将会被插入到insn列表中。如果使用了 define_expand
,将会发生三种情况之一,取决于条件逻辑。条件逻辑可以手动为 insn列表创建一个新的insn,并且调用 DONE
。对于某些命名模式,它可以调用 FAIL
来告诉编译器使用一种备用方式完成任务。如果既没有调用DONE也没有调用 FAIL
,在模式中所给出的模版将会被插入,就像 define_insn
一样。
一旦生成insn列表,各种优化过程便在insn列表中转换,替代和重排insn。例如, define_split
和 define_peephole
模式便在这里被使用。
最后,insn列表的RTL被用来匹配 define_insn
模式中的RTL模版,并且那些模式 被用来生成最终的汇编代码。这时,由于不需要关心名字,所以每个命名的 define_insn
跟没有命名没有区别。