Next: , Previous: Insn Attributes, Up: Machine Desc


16.20 条件执行

许多体系结构都提供了某种形式的条件执行,或者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")