7

Gcc inline asm early clobber 约束在此处的 gcc 文档中进行了描述:

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

我们有一个 128 位添加的 amd64 实现:

#define ADD128(rh, rl, ah, al, bh, bl)                                     \
    __asm__("addq %2, %0; adcq %3, %1"                                     \
            /* outputs */ : "=r"(rl),  /* %0 */                            \
                            "=r"(rh)   /* %1 */                            \
            /* inputs */  : "emr"(bl), /* %2 */                            \
                            "emr"(bh), /* %3 */                            \
                            "0"(al),   /* %4 == %0 */                      \
                            "1"(ah)    /* %5 == %1 */                      \
            /* clobbers */: "cc"       /* condition registers (CF, ...) */ \
           )

我想知道这是否必须对 %0 使用早期的 clobber (&):

#define ADD128(rh, rl, ah, al, bh, bl)                                 \
    __asm__("addq %2, %0; adcq %3, %1"                                     \
            /* outputs */ : "=&r"(rl),  /* %0 */                            \
                            "=r"(rh)   /* %1 */                            \
            /* inputs */  : "emr"(bl), /* %2 */                            \
                            "emr"(bh), /* %3 */                            \
                            "0"(al),   /* %4 == %0 */                      \
                            "1"(ah)    /* %5 == %1 */                      \
            /* clobbers */: "cc"       /* condition registers (CF, ...) */ \
           )

但是,我不太确定,因为我们在 amd64 版本(%0== %4%1== %5)中有明确的输入 = 输出?

第一个非earlyclobber 版本目前似乎适用于我们正在使用的所有优化级别,至少使用intel 编译器(如果使用gcc,我们不需要这个,因为gcc 现在支持这个目标上的本机int128 操作)。

为了严格遵守内联 asm 中早期 clobber 的 gcc 规范,我们是否需要&for%0约束,即使使用 inputs=outputs 语句?

4

1 回答 1

1

bh如果您使用与and完全相同的表达式调用此宏,则需要早期的clobber al。在这种情况下,如果没有 clobber,编译器可能会选择对%3and使用相同的寄存器%4(与 相同%0),因此第一条指令可能会在第二个表达式读取该值之前破坏该值。

您实际上不太可能以可能触发此问题的方式调用宏,因此没有clobber 看不到任何问题也就不足为奇了。al添加 clobber 还会在调用具有相同 to的宏时引入额外的(不需要的)寄存器副本bl(例如,将 128 位值添加到其自身),因此有点不受欢迎。

于 2012-06-19T18:20:49.290 回答