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")