Previous: Mode Iterators, Up: Iterators
代码迭代器使用与机器模式迭代器类似的方法来操作。参见Mode Iterators。
结构:
(define_code_iterator name [(code1 "cond1") ... (coden "condn")])
定义了一个伪rtx代码 name,如果条件 condi 为真时,其可以作为 codei 被实例化。每个 codei 必须具有相同的rtx格式。 参见RTL Classes。
跟机器模式迭代器一样,每个使用 name 的指令模式将被扩展 n 次, 一次使用 code1 来替换,一次使用 code2,等等。 参见Defining Mode Iterators。
跟机器模式一样可以为代码定义属性。有两种标准代码属性:code
,代码
的小写形式名字,以及 CODE
,代码的大写形式名字。其它属性使用下列
方式来定义:
(define_code_attr name [(code1 "value1") ... (coden "valuen")])
这里有一个实际使用的关于代码迭代器的例子,摘自MIPS后端(port):
(define_code_iterator any_cond [unordered ordered unlt unge uneq ltgt unle ungt eq ne gt ge lt le gtu geu ltu leu]) (define_expand "b<code>" [(set (pc) (if_then_else (any_cond:CC (cc0) (const_int 0)) (label_ref (match_operand 0 "")) (pc)))] "" { gen_conditional_branch (operands, <CODE>); DONE; })
这等价于:
(define_expand "bunordered" [(set (pc) (if_then_else (unordered:CC (cc0) (const_int 0)) (label_ref (match_operand 0 "")) (pc)))] "" { gen_conditional_branch (operands, UNORDERED); DONE; }) (define_expand "bordered" [(set (pc) (if_then_else (ordered:CC (cc0) (const_int 0)) (label_ref (match_operand 0 "")) (pc)))] "" { gen_conditional_branch (operands, ORDERED); DONE; }) ...