Previous: Mode Iterators, Up: Iterators


16.22.2 代码迭代器

代码迭代器使用与机器模式迭代器类似的方法来操作。参见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;
     })
     
     ...