Next: , Previous: Defining Mode Iterators, Up: Mode Iterators


16.22.1.2 机器模式迭代器中的替换

如果一个 .md 文件结构使用了机器模式迭代器,则结构的每个版本将通常 需要轻微不同的字符串或机器模式。例如:

GCC通过“机器模式属性”系统来支持这样的变种。有两种标准属性:mode, 其为机器模式的小写名字,MODE,其为机器模式的大写名字。你可以定义其 它属性,使用:

     (define_mode_attr name [(mode1 "value1") ... (moden "valuen")])

其中 name 为属性的名字,valuei 为与 modei 关联的值。

当GCC使用 :mode 来替换某个 :iterator 时,其将扫描指令模式中的 每个字符串和机器模式,按照 <iterator:attr>形式的序列, 其中attr为一个机器模式属性的名字。如果属性针对mode被定义,则整个 <...> 序列将被适当的属性值替换。

例如,假设一个 .md 具有:

     (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
     (define_mode_attr load [(SI "lw") (DI "ld")])

如果其中一个使用 :P 的指令模式包含了字符串 "<P:load>\t%0,%1",则 SI 版本的指令模式将使用 "lw\t%0,%1" 并且 DI 版本的将使用 "ld\t%0,%1"

这里有一个关于使用针对一个机器模式的属性的例子:

     (define_mode_iterator LONG [SI DI])
     (define_mode_attr SHORT [(SI "HI") (DI "SI")])
     (define_insn ...
       (sign_extend:LONG (match_operand:<LONG:SHORT> ...)) ...)

iterator: 前缀可以被省略掉,这种情况下将会针对每个迭代器扩展来 尝试替换。