Next: , Previous: RTL Template, Up: Machine Desc


16.5 输出模板和操作数替换

output template是一个字符串,其指定了如何为一个指令模式输出汇编代码。 大多数模板都是一个固定的字符串,可以按照字面直接输出。符号 ‘%’ 用来指 定替换操作数;

最简单的情况下,一个 ‘%’ 后面跟一个数字 n 表示在字符串中的这个 位置输出操作数 n

%’ 后面跟一个字母和一个数字表示用备用方式来输出操作数。有四个字母具 有标准内嵌的含义,将在下面描述。机器描述宏 PRINT_OPERAND 能够定义 其它的非标准含义的字母。

%cdigit’ 可以用来替换一个常数值的操作数。

%ndigit’ 类似于 ‘%cdigit’,只不过是对要打印的常数 值进行取反操作(negated)。

%adigit’ 可以用来替换一个操作数,并把它当作一个内存引用,实际 的操作数则被视为地址。这在输出一个加载地址的指令时很有帮助,因为对于这样 的指令,汇编器语法经常需要你将操作数写成一个内存引用的形式。

%ldigit’ 用来将一个 label_ref 替换到跳转指令中。

%=’ 输出一个在整个编译过程中,对每一条指令都是唯一的编号。这可以用来 在一个生成多个汇编指令的单一模板中, 使得局部标号能够被多次引用。

%’ 后面跟一个标点符号指定了一个不使用操作数的替换。只用一种情况是标 准的:‘%%’ 用来输出一个 ‘%’ 到汇编代码中。其它非标准的情况可以被 定义在 PRINT_OPERAND 宏中。你必须还要通过宏 PRINT_OPERAND_PUNCT_VALID_P 来定义哪些标点符号是有效的。

模板可以生成多条汇编指令。这些指令文本之间使用 ‘\;’ 隔开。

‘%’之后跟非标准字母或者标点符号的一种用途是区分同一机器的不同汇编语言;例如,68000的Motorola语法和MIT语法。 Motorola语法要求大多数的操作名都含有句点,而MIT语法中没有。比如,MIT语法中的操作码‘movel’在Motorola语法中为 ‘move.l’。两种输出法语使用了同一个模式文件,只不过在Motorola语法需要句点的地方使用了字符序列‘%.’。Motorola语法的宏 PRINT_OPERAND定义了这个序列用于输出一个句点;MIT语法的宏将其定义为不做任何事情。

紧随‘%’之后的非标准字母或者标点符号的一种用法是,为同一机器区别不同的汇编语言;例如,68000的Motorola语法与MIT语法。Motorola语法要求大多操作码的名字中带有句号,而MIT语法不是这样。例如,在MIT语法中的操作码‘movel’,在Motorola语法中为‘move.l’。这两种输出语法都在同一个文件中的指令模式中实现,只不过字符序列‘%.’用在需要句号的Motorola语法中。Motorola语法的PRINT_OPERAND宏,将该序列定义成输出一个句号;而MIT语法则将其定义为不做任何事情。

作为一种特殊情况,只包含一个单独的字符#的模板会指示编译器首先拆分insn,然后分别输出所得的指令。这样有助于减少输出模板的重复内容。如果你有一个define_insn,其需要输出多个汇编指令,并且有一个匹配的define_split已经被定义,则你可以简单的使用#作为输出模板,而不用将模板写成输出多个汇编指令的样子。

如果宏ASSEMBLER_DIALECT被定义,你可以在模板中使用形如‘{option0|option1|option2}’的结构。这些描述了多个汇编语言语法的变体。参见Instruction Output