Next: , Previous: Simple Constraints, Up: Constraints


16.8.2 多个可选的约束

有时单个指令具有多个可选的操作数集。例如,在68000上, 一个逻辑或指令可以将寄存器或者立即数的值组合到内存中, 或者可以组合任何类型的操作数到寄存器中;但是不能将一个内存位置组合到另一个中。

这些约束作为多个可选项来表示。 一个可选项可以通过针对每个操作数的一系列字母来描述。 一个操作数的总的约束由该操作数第一个可选项的字母,逗号, 该操作数的第二个可选项,逗号,等等直到最后一个可选项组成。 这里有一个在68000上全字逻辑或的表示:

     (define_insn "iorsi3"
       [(set (match_operand:SI 0 "general_operand" "=m,d")
             (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
                     (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
       ...)

第一个可选项具有操作数0的‘m’ (memory),操作数1的‘0’(意味着其必须匹配 操作数0)和操作数2的‘dKs’。第二个可选项具有操作数0的‘d’ (data register),操作数1的‘0’和操作数2的‘dmKs’。 约束中的‘=’和‘%’应用于所有的可选项; 它们的含义在下一节介绍(参见Class Preferences)。

如果所有操作数适合任意一个可选项,则指令为有效的。否则,对于每个可选项, 编译器计算要复制操作数使得可选项可以使用所需要增加的指令个数。 需要的复制最少的可选项将被选中。如果两个可选项需要相同数目的复制, 则选择前面的。这些选择可以通过字符‘?’和‘!’来改变:

?
轻微降低‘?’出现的可选项,当没有可选项被确切应用时,才将其作为选择。 编译器将该可选项的花销认为高出一个单元。


!
严格降低‘!’出现的可选项,当该选项没有reloading的时候还可以被使用, 但是如果需要reloading,则将使用其它可选项。

当insn指令模式在其约束中具有多个可选项时, 经常会出现通过哪个可选项被匹配而决定使用使用什么汇编代码的情况。这时, 输写汇编代码的C代码可以使用变量which_alternative, 其为实际被满足的可选项的顺序编号(0对应第一个,1对应第二个,等等)。参见Output Statement