Next: , Previous: Modifiers, Up: Constraints


16.8.6 使用enabled属性来禁止insn可选项

insn属性enabled,可以出于机器特定的原因,用来禁止特定的insn的可选项。这用于,当为现有的指令模式,增加新的指令,且其只用于使用-march=选项指定的特定cpu体系结构级别。

如果insn的可选项被禁止,则其将不被使用。编译器将被禁止的可选项的约束视为不被满足。

为了能够使用enabled属性,后端必须在机器描述文件中增加:

  1. enabled insn属性的定义。该属性通常使用define_attr命令来定义。该定义应该基于其它insn属性以及/或者目标机标记。enabled属性为数字属性,并且对于被启用的可选项应该求值为(const_int 1),否则为(const_int 0)
  2. 另一个insn属性的定义,用于描述为什么一个insn可选项可用或不可用。例如,下面例子中的cpu_facility
  3. 对每个insn定义,赋予第二个属性。(注意:显然只是针对那些具有多个可选项的定义。其它insn模式应该使用insn条件来禁止或开启。)

例如,下面两个指令模式可以容易的使用enabled属性合并在一起:

     
     (define_insn "*movdi_old"
       [(set (match_operand:DI 0 "register_operand" "=d")
             (match_operand:DI 1 "register_operand" " d"))]
       "!TARGET_NEW"
       "lgr %0,%1")
     
     (define_insn "*movdi_new"
       [(set (match_operand:DI 0 "register_operand" "=d,f,d")
             (match_operand:DI 1 "register_operand" " d,d,f"))]
       "TARGET_NEW"
       "@
        lgr  %0,%1
        ldgr %0,%1
        lgdr %0,%1")
     

合并成:

     
     (define_insn "*movdi_combined"
       [(set (match_operand:DI 0 "register_operand" "=d,f,d")
             (match_operand:DI 1 "register_operand" " d,d,f"))]
       ""
       "@
        lgr  %0,%1
        ldgr %0,%1
        lgdr %0,%1"
       [(set_attr "cpu_facility" "*,new,new")])