Next: , Previous: Expressions, Up: Insn Attributes


16.19.3 给Insns赋予属性值

给insn的属性赋予的值,主要由该insn所匹配的模式决定 (或者什么define_peephole生成的它)。 每个define_insndefine_peephole可以具有可选的最后的参数, 用来指定匹配insn的属性值。在特定insn中没有指定的任何属性的值, 将被设为在define_attr中指定的缺省值。

可选的define_insndefine_peephole最后的参数,为一个表达式向量, 每个元素定义了单个属性的值。赋属性值的最通用方式是使用set表达式, 其第一个操作数为一个attr表达式,给出了要设置的属性名。 第二个操作数为一个属性表达式(参见Expressions),给出了属性值。

当属性值依赖于可选(‘alternative’)属性, 则可以使用set_attr_alternative表达式。其允许指定属性表达式向量, 每个元素对应一个可选属性。

当不需要一般性的任意属性表达式,则可以使用简单的set_attr表达式, 其允许指定一个字符串,给出单个属性值或者属性值列表, 其中每个元素对应于一个可选属性。

以上的属性指定形式将在下面展示出。在每种情况中,name为一个字符串, 指定了要被设置的属性。

(set_attr name value-string)
value-string或者为一个字符串,给出了期望的属性值, 或者为一个包含了逗号分隔的列表的字符串,给出了后续可选项的值。 元素的个数必须匹配在insn指令模式的约束中的可选项的个数。

注意可以为一些可选项指定‘*’,这样属性将被假设它的缺省值匹配那个可选项。


(set_attr_alternative name [value1 value2 ...])
取决于insn的可选项,值将为被指定值的其中之一。 这是对‘alternative’属性使用cond的简化形式。


(set (attr name) value)
第一个操作数必须为特定RTL表达式attr,其唯一的操作数是一个字符串, 给出了被设置的属性名。value为属性值。

下面展示了三种表示相同的属性指定的不同的方式:

     (set_attr "type" "load,store,arith")
     
     (set_attr_alternative "type"
                           [(const_string "load") (const_string "store")
                            (const_string "arith")])
     
     (set (attr "type")
          (cond [(eq_attr "alternative" "1") (const_string "load")
                 (eq_attr "alternative" "2") (const_string "store")]
                (const_string "arith")))

表达式define_asm_attributes提供了一种机制, 用来指定赋予insn的属性是由asm语句产生的。其形式为:

     (define_asm_attributes [attr-sets])

其中attr-sets为与define_insndefine_peephole中的相同。

这些值通常为“最坏情况”属性值。例如,它们可能指示条件码将被破坏(clobbered)。

length属性赋值,将被特殊处理。 计算asm insn长度的方式是将表达式define_asm_attributes中指定的长度 乘以在asm语句中指定的机器指令个数。 指令个数通过计算字符串中分号和换行符的个数来决定。因此, 在define_asm_attributes中指定的length属性值应该为单个机器指令的 最大可能长度。