Next: , Up: Machine Desc


16.1 概述机器描述是如何被使用的

编译器中有三个主要的转换:

  1. 前端读取源代码并建立解析树。
  2. 基于命名的指令模式,解析树被用来生成RTL insn列表。
  3. insn列表被用来匹配RTL模板,产生汇编代码。

生成过程,只与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_splitdefine_peephole 模式便在这里被使用。

最后,insn列表的RTL被用来匹配 define_insn 模式中的RTL模版,并且那些模式 被用来生成最终的汇编代码。这时,由于不需要关心名字,所以每个命名的 define_insn跟没有命名没有区别。