Next: , Previous: Side Effects, Up: RTL


10.16 地址中嵌入的副作用

有六个特定的副作用表达式代码作为内存地址出现。

(pre_dec:m x)
表示该副作用为,x递减一个标准的数量,并且还表示了递减后的x的值。x必须为一个reg或者mem,但是大多数机器只允许regm必须为机器所使用的指针的机器模式。x被递减的数量为,所包含的内存引用的机器模式的长度,以字节为单位。这里有一个关于用法的例子:
          (mem:DF (pre_dec:SI (reg:SI 39)))

这说明将伪寄存器39递减一个DFmode值的长度,并将结果用来对一个DFmode值进行寻址。


(pre_inc:m x)
类似的,用来说明递增x


(post_dec:m x)
表示与pre_dec相同的副作用,但表示不同的值。这里表示的值为递减之前x的值。


(post_inc:m x)
类似的,用来说明递增x


(post_modify:m x y)
表示该副作用为,将x设置为y,并且表示x被修改之前的值。x必须为一个reg或者mem,但是大多数机器只允许regm必须为机器所使用的指针的机器模式。

表达式y必须为下列三种形式之一: (plus:m x z), (minus:m x z), 或者 (plus:m x i), 其中z为一个索引寄存器,i为一个常量。

这里为一个有关用法的例子:

          (mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42)
                                                    (reg:SI 48))))

这说明在使用了伪寄存器42曾经指向的值之后,将伪寄存器42修改为,加上其伪寄存器48的内容,


(pre_modify:m x expr)
类似的,表示副作用在使用之前开始有效。

这些嵌入的副作用表达式在使用时要小心。指令模式可以不使用它们。在到达编译器的‘flow’ pass之前,它们可能只出现在用于表示压栈。‘flow’ pass查找寄存器在一条指令中被递增或递减,并且在之前或者之后被作为地址使用的情况;这些情况然后被转换成使用前增(减)或后增(减)。

如果这些表达式中作为操作数的寄存器,在一个insn中的另一个地址中使用,则会使用寄存器的原始的值。在地址之外使用寄存器是不被允许的,因为这样的insn在不同的机器上行为是不同的,因此会有歧义。

可以被表示成具有嵌入副作用的指令,也可以被表示成使用parallel,包含一个额外的set来描述地址寄存器如何被修改。