Next: , Up: Registers


17.7.1 寄存器的基本特征

寄存器具有不同的特征。

— Macro: FIRST_PSEUDO_REGISTER

编译器知道的硬件寄存器个数。它们包括编号0到FIRST_PSEUDO_REGISTER-1; 因此,第一个伪寄存器的编号实际被赋值为FIRST_PSEUDO_REGISTER

— Macro: FIXED_REGISTERS

一个初始化,说明哪些寄存器在整个编译代码中都用于固定用途, 因此不能用于通用分配。这些将包括栈指针,帧指针(在当不需要帧指针时, 可以用于通用寄存器的机器上除外), 在一些机器上被认为是可寻址的寄存器的程序计数器, 以及其它具有标准用法的编号寄存器。

这些信息作为一个序列编号来表示,由逗号分隔并由大括号包括。 第n个编号为1,如果寄存器n为固定的,否则为0。

从该宏初始化的表,以及由下面的初始化的表,都可以在运行时被覆盖, 或者通过执行宏CONDITIONAL_REGISTER_USAGE自动完成, 或者通过用户使用命令选项-ffixed-reg, -fcall-used-reg-fcall-saved-reg

— Macro: CALL_USED_REGISTERS

类似FIXED_REGISTERS,但是对于被函数调用破坏的每个寄存器, 以及固定寄存器,值为1。因此, 该宏标识了哪些寄存器不适合用于必须活跃于整个函数调用的值的通用分配。

如果寄存器在CALL_USED_REGISTERS中具有值0, 如果寄存器在函数中被使用,则编译器会自动的在函数入口保存它, 并在函数出口恢复它。

— Macro: CALL_REALLY_USED_REGISTERS

类似CALL_USED_REGISTERS,除了该宏不需要包含整个FIXED_REGISTERS集。 (CALL_USED_REGISTERS必须为FIXED_REGISTERS的超集)。 该宏为可选的。如果没有被指定,其缺省为CALL_USED_REGISTERS的值。

— Macro: HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)

一个C表达式,值为非0, 如果不允许将机器模式为mode的值存储在编号为regno的硬件寄存器中, 并且整个调用中没有破坏其某个部分。对于大多数机器,该宏不需要被定义。 其只用于一些在调用中不保护寄存器的整个内容的机器上。

— Macro: CONDITIONAL_REGISTER_USAGE

0条或者多条C语句,其可以条件修改5个变量fixed_regs, call_used_rehs, global_regs, reg_namesreg_class_contents,来考虑这些寄存器集对target标号的任何依赖。 前3个为char []类型(作为布尔向量来解析)。 global_regs为一个const char *[]reg_class_contents为一个HARD_REG_SET。 在宏被调用之前,fixed_regs, call_used_regs, reg_class_contentsreg_names已经分别通过FIXED_REGISTERS, CALL_USED_REGISTERS, REG_CLASS_CONTENTSREGISTER_NAMES被初始化。 global_regs已经被清除,并且任何-ffixed-reg, -fcall-used-reg-fcall-saved-reg选项已经被应用。

如果不需要做什么工作,则不必定义该宏。

如果整个寄存器的类别的使用,取决于target标记, 则你可以通过使用该宏来指示GCC修改fixed_regscall_used_regs为1, 对于类别中的每个不应由GCC使用的寄存器。还有就是, 定义宏REG_CLASS_FROM_LETTER / REG_CLASS_FROM_CONSTRAINT来返回NO_REGS, 如果其被调用,并带有一个不应该被使用的类别字母。

(然而,如果该类没有包含在GENERAL_REGS中, 并且所有的insn指令模式的约束允许该类通过target开关来控制, 则GCC将自动避免使用这些寄存器,当target开关与它们相反时。)

— Macro: INCOMING_REGNO (out)

定义该宏,如果target机器具有寄存器窗口。 该C表达式根据调用函数能看到的寄存器编号out, 返回被调用函数所能看到的寄存器编号。 返回out,如果寄存器编号out不是发送寄存器(outbound register)。

— Macro: OUTGOING_REGNO (in)

定义该宏,如果target机器具有寄存器窗口。 该C表达式根据被调用函数能看到的寄存器编号in, 返回调用函数所能看到的寄存器编号。 返回in,如果寄存器编号in不是运入寄存器(inbound register)。

— Macro: LOCAL_REGNO (regno)

定义该宏,如果target机器具有寄存器窗口。该C表达式返回真, 如果寄存器为调用保存的,但是在寄存器窗口中。不像大多调用保存的寄存器, 这样的寄存器不需要在函数出口或者非局部调转中被显示的恢复。

— Macro: PC_REGNUM

如果程序计数器具有一个寄存器编号,则定义其为那个寄存器编号。否则不要定义它。