Next: , Up: Condition Code


17.16.1 Representation of condition codes using (cc0)

文件conditions.h定义了变量cc_status, 用来描述条件代码如何被计算(对于条件代码的解释取决于设置它的指令的情况)。 该变量包含了条件码目前基于的RTL表达式,以及一些标准的标记。

有时额外的机器特定的标记必须被定义,在机器描述头文件中。 其还可以增加额外的机器特定信息,通过定义CC_STATUS_MDEP

— Macro: CC_STATUS_MDEP

一个数据类型的C代码,其用于声明cc_statusmdep部件。 缺省为int

该宏在不使用cc0的机器上不被使用。

— Macro: CC_STATUS_MDEP_INIT

一个C表达式,用来初始化mdep域为“空”。缺省定义不做任何事, 因为大多数机器不使用该域。如果你想使用该域,则可能应该定义该宏来初始化它。

该宏在不使用cc0的机器上不被使用。

— Macro: NOTICE_UPDATE_CC (exp, insn)

一个C复合语句,用来适当的为主体为expinsn, 设置cc_status的部件。 该宏负责识别insn将条件码设置作为副产品以及显示的set (cc0)

该宏在不使用cc0的机器上不被使用。

如果insn不设置条件码,但修改其它机器寄存器, 则该宏必须检查它们是否使得记录条件码的表达式变为无效。例如,在68000上, 在地址寄存器上存储insn不设置条件码, 其意味着通常NOTICE_UPDATE_CC对于这样的insn可以不修改cc_status。 但是假设之前的insn将条件码设成基于位置‘a4@(102)’, 并且当前insn在‘a4’上存储了一个新值。虽然条件码没有被改变, 但其不再为真,因为其反映了‘a4@(102)’的内容。因此对于这种情况, NOTICE_UPDATE_CC必须修改cc_status,来表示条件码值不可知。

NOTICE_UPDATE_CC的定义必须要准备处理窥孔优化的结果: insn的指令模式为parallel RTXs,其包含了不同的regmem或者常量操作数。这些insn的RTL结构体不足以表明insn实际要做的事情。 NOTICE_UPDATE_CC应该做的是当遇到这样的,就直接运行CC_STATUS_INIT

NOTICE_UPDATE_CC可能的定义为调用一个函数, 来查看一个属性(参见Insn Attributes),例如名为‘cc’。这避免了在两个地方, md文件和NOTICE_UPDATE_CC中具有指令模式的详细信息。