Next: Examples, Previous: Defining Mode Iterators, Up: Mode Iterators
如果一个 .md 文件结构使用了机器模式迭代器,则结构的每个版本将通常 需要轻微不同的字符串或机器模式。例如:
define_expand
定义了多个 add
m3
指令模式时
(参见Standard Names),每个扩展将需要针对 m 的适当的机器模式。
define_insn
定义了多个指令模式时,每条指令将通常需要一个不
同的汇编助记符。
define_insn
需要操作数具有不同的机器模式时,针对一个操作数
的机器模式使用迭代器通常需要对于其它操作数使用特点的机器模式。
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:
前缀可以被省略掉,这种情况下将会针对每个迭代器扩展来
尝试替换。