Next: , Previous: Pattern Ordering, Up: Machine Desc


16.11 指令模式的相互依赖性

每个机器描述必须针对每个名为‘bcond’的条件分支, 具有一个命名的指令模式。识别模板必须总是具有如下形式

     (set (pc)
          (if_then_else (cond (cc0) (const_int 0))
                        (label_ref (match_operand 0 "" ""))
                        (pc)))

另外,每个机器描述必须针对每个可能的逆转条件分支具有一个匿名的指令模式。 它们的模板的形式为

     (set (pc)
          (if_then_else (cond (cc0) (const_int 0))
                        (pc)
                        (label_ref (match_operand 0 "" ""))))

之所以需要这些,是因为jump优化会将直接条件(direct-conditional)分支, 转换为逆转条件(reverse-conditional)分支。

使用match_operator结构来减少必须为分支指定的指令模式的编号 通常是很方便的。例如,

     (define_insn ""
       [(set (pc)
             (if_then_else (match_operator 0 "comparison_operator"
                                           [(cc0) (const_int 0)])
                           (pc)
                           (label_ref (match_operand 1 "" ""))))]
       "condition"
       "...")

有些情况,机器支持除了一个或多个操作数的机器模式不同的相同指令。 例如,可以有指令“sign-extend halfword” 和“sign-extend byte”,其指令模式为

     (set (match_operand:SI 0 ...)
          (extend:SI (match_operand:HI 1 ...)))
     
     (set (match_operand:SI 0 ...)
          (extend:SI (match_operand:QI 1 ...)))

常整数不指定机器模式,所以扩展常量值的指令可以两个指令模式都匹配。 实际匹配的指令模式将为文件中首先出现的指令模式。为了获得正确的结果, 其必须为尽可能宽的模式(这里为HImode)。 如果指令模式匹配QImode,则当常量值实际不适合该模式时,结果将不正确。

像这样扩展常数的指令很少被生成,因为它们会被优化掉, 不过在不优化的编译中确实偶尔会出现。

如果在指令模式中constraint允许为一个常量,reload过程可以用constraint允许的常量来替换寄存器。 类似的对于内存引用。由于存在这种替换, 所以不要为递增和递减指令提供单独的指令模式。 替换的,它们应该由同一个指令模式生成。