Next: , Previous: Macros for Initialization, Up: Assembler Format


17.21.7 汇编指令的输出

这章描述了汇编指令的输出。

— Macro: REGISTER_NAMES

一段C初始化程序,包含了机器寄存器的汇编名字,每个名字使用C字符串常量表示。 这用来将编译器中的寄存器编号转换成汇编语言。

— Macro: ADDITIONAL_REGISTER_NAMES

如果定义,则为结构体数组的初始化程序,结构体包含了名字和寄存器编号。 该宏定义了硬件寄存器的附加名字,这样就可以允许在声明中的asm选项, 来使用附加名引用寄存器。

— Macro: ASM_OUTPUT_OPCODE (stream, ptr)

定义该宏,如果你在使用一个不常见的汇编器,其需要不一样的机器指令名字。

定义为C语句,输出一个汇编指令代码到标准输入输出流stream中。 宏操作数ptr为类型是char *的变量,其指向内部形式中的指令码名字, 内部形式使用机器描述来表示。该定义应该输出操作码名字到stream中, 执行你想要的任何转换,并且将变量ptr增加到指向opcode的尾部, 这样其才不会被输出两次。

实际上,相对于整个指令码的名字,你的宏定义可以处理或多或少的部分; 但是如果你想处理包含‘%’序列的文本,则必须小心你所做的替换。 要保证增加ptr,使得不会输出不应该被输出的文本。

如果需要查看操作数的值,它们可以作为recog_data.operand的元素被找到。

如果宏定义不做任何事情,则指令使用通常的方式来输出。

— Macro: FINAL_PRESCAN_INSN (insn, opvec, noperands)

如果定义,则为一条C语句,其就在为insn输出汇编代码之前将被执行, 用来修改被抽取的操作数,从而可以被不同方式的输出。

这里的参数opvec为一个向量,包含了从insn中抽取的操作数, noperands为向量的元素个数。该向量的内容用于将insn模板转换成汇编代码, 所以你可以通过修改向量的内容来改变汇编输出。

该宏当有多个汇编语法共用一个指令模式文件时很有用;通过定义该宏, 你可以使大量类别的指令按照不同的方式输出(例如重组操作)。 自然的,影响单个insn模式的汇编语法, 应该通过在那些指令模式中写条件输出程序来处理。

如果没有定义该宏,则其相当于一条空语句。

— Target Hook: void TARGET_ASM_FINAL_POSTSCAN_INSN (FILE *file, rtx insn, rtx *opvec, int noperands)

If defined, this target hook is a function which is executed just after the output of assembler code for insn, to change the mode of the assembler if necessary.

Here the argument opvec is the vector containing the operands extracted from insn, and noperands is the number of elements of the vector which contain meaningful data for this insn. The contents of this vector are what was used to convert the insn template into assembler code, so you can change the assembler mode by checking the contents of the vector.

— Macro: PRINT_OPERAND (stream, x, code)

C复合语句,用来将指令操作数x的汇编语法输出到标准输入输出流stream中。 x为RTL表达式。

code is a value that can be used to specify one of several ways code值可以用来指定打印操作数的方式。 用于当操作数必须根据上下文进行不同的打印的时候。 code来自用于打印操作数的‘%’指定语句。 如果指定语句只是‘%digit’,则code为0; 如果指定语句为‘%ltrdigit’,则codeltr的ASCII码。

如果x为寄存器,则该宏应该打印寄存器的名字。 名字可以在数组reg_names中找到,数组的类型为char *[]reg_names通过REGISTER_NAMES来初始化。

当机器描述具有一个‘%punct’指定语句时 (‘%’后面跟随一个标点符号字符),则该宏被调用时,x为空指针, code为标点符号字符。

— Macro: PRINT_OPERAND_PUNCT_VALID_P (code)

一个C表达式, 当code为在PRINT_OPERAND宏中使用的有效的标点符号字符时, 其计算为真。如果没有定义PRINT_OPERAND_PUNCT_VALID_P, 则意味着不以这种方式使用标点符号字符(除了标准的‘%’以外)。

— Macro: PRINT_OPERAND_ADDRESS (stream, x)

C复合语句,用来将指令操作数为内存引用,其地址为x的汇编语法, 输出到标准输入输出流stream中。x为一个RTL表达式。

在一些机器上,符号地址的语法取决于地址所引用的section。在这些机器上, 定义钩子TARGET_ENCODE_SECTION_INFO来将信息存储到symbol_ref, 并在这里进行检查。参见Assembler Format

— Macro: DBR_OUTPUT_SEQEND (file)

C语句,在所有的栈槽填充指令被输出之后执行。如果需要的话, 调用dbr_sequence_length来判定在序列中被填充的栈槽数目 (如果当前不是输出一个序列,则为0),用来决定输出多少个no-ops,或其它。

如果不做任何事情,就不要定义该宏,但是如果将延迟序列显示化, 则会有助于阅读汇编输出(例如,使用空格)。

注意,用于带有延迟槽的指令的输出程序, 必须准备好处理没有被作为序列输出的情况(即,当没有运行调度过程, 或者没有找到栈槽填充者)。当没有处理序列时,变量final_sequence为空, 否则其包含了被输出的rtx sequence

— Macro: REGISTER_PREFIX
— Macro: LOCAL_LABEL_PREFIX
— Macro: USER_LABEL_PREFIX
— Macro: IMMEDIATE_PREFIX

如果定义,则为C字符串表达式,用于asm_fprintf(参见 final.c) 的选项‘%R’, ‘%L’, ‘%U’和 ‘%I’。 这在单个md文件必须支持多个汇编格式时很有用。这种情况下, 不同的tm.h文件可以定义不同的这些宏。

— Macro: ASM_FPRINTF_EXTENSIONS (file, argptr, format)

如果定义,该宏应该被扩展为一系列case语句, 其将在asm_fprintf函数中的switch语句里被解析。 这将应允许target来定义额外的printf格式,其在生成它们的汇编语句时很有帮助。 注意,大写字母被保留用于asm_fprintf将来的通用扩展, 所以不要用于target特定代码中。输出文件由参数file给定。 varargs输出指针为argptr,格式字符串的其余部分,由format指向。

— Macro: ASSEMBLER_DIALECT

如果你的target支持多个汇编语言方言(例如不同的操作码), 可以定义该宏作为C表达式,给出汇编语言方言的索引,0作为第一个。

如果该宏被定义,你可以在指令模式的输出模版中(参见输出模版)或者asm_fprintf的第一个参数中使用如下的结构形式

{option0|option1|option2...}

该结构输出‘option0’, ‘option1’, ‘option2’等等, 如果ASSEMBLER_DIALECT的值为0,1,2,等等。 这些字符串中的任何特殊字符将保留它们通常的含义。 如果括号中的可选项多于ASSEMBLER_DIALECT的值,则什么也不输出。

如果没有定义该宏,字符‘{’, ‘|’和‘}’在模版中或 asm_fprintf的操作数中不具有任何特殊含义。

如果你能够通过定义宏REGISTER_PREFIX, LOCAL_LABEL_PREFIX, USER_LABEL_PREFIXIMMEDIATE_PREFIX来表达出汇编语言语法的 不同之处,则定义这些宏。如果语法差异比较大,涉及到操作码不同或操作数顺序, 则定义ASSEMBLER_DIALECT,使用‘{option0|option1}’语法。

— Macro: ASM_OUTPUT_REG_PUSH (stream, regno)

C表达式,向stream中输出汇编代码,用于将硬件寄存器编号regno压入栈中。 代码不需要为最优的,因为该宏只在profiling的时候使用。

— Macro: ASM_OUTPUT_REG_POP (stream, regno)

C表达式,向stream中输出汇编代码,用于将硬件寄存器编号regno弹出栈中。 代码不需要为最优的,因为该宏只在profiling的时候使用。