Next: Constant Definitions, Previous: Insn Attributes, Up: Machine Desc
许多体系结构都提供了某种形式的条件执行,或者predicate。其特点是能够使得
指令集中的大多数指令变为无效。当指令集很大并且不完全对称时,在
.md 文件中直接描述这些形式将会变得非常冗长。一种可替代的方式
为 define_cond_exec 模板。
(define_cond_exec
[predicate-pattern]
"condition"
"output-template")
predicate-pattern 为运行时执行insn所需要的必须为真的条件,并且
应该能匹配一个相关的操作符。可以使用 match_operator 来一次匹配
多个相关的操作符。任何 match_operand 操作数必须具有不超过一个
的可选项。
condition 为一个C表达式,对于生成的指令模式必须匹配为真。
output-template 为一个类似于 define_insn 输出模板
(参见Output Template)的字符串,除了不应用 ‘*’ 和 ‘@’
的特殊情况。这只在针对predicate的汇编文本为一个主insn的简单前缀时有用。为了
处理通用的情况,有一个全局变量 current_insn_predicate,在当前
insn被predicate时其将包含整个predicate,否则将为 NULL。
当使用 define_cond_exec 时,将会创建一个对 predicable 指
令属性的隐式引用。参见Insn Attributes。该属性并须为布尔的(即在它的
list-of-values 中具有确切的两个元素)。甚至,其必须不能使用复杂
表达式。也就是,insn中的缺省的和所有的使用都必须为一个简单常量,不能依
赖于可选项或其它。
对于每个 predicable 属性为真的 define_insn,一个新的匹配
一个指令predicate版本的 define_insn 指令模式将被生成。例如,
(define_insn "addsi"
[(set (match_operand:SI 0 "register_operand" "r")
(plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")))]
"test1"
"add %2,%1,%0")
(define_cond_exec
[(ne (match_operand:CC 0 "register_operand" "c")
(const_int 0))]
"test2"
"(%0)")
生成一个新的指令模式
(define_insn ""
[(cond_exec
(ne (match_operand:CC 3 "register_operand" "c") (const_int 0))
(set (match_operand:SI 0 "register_operand" "r")
(plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r"))))]
"(test2) && (test1)"
"(%3) add %2,%1,%0")