Требует ли этот ассемблер в стиле gcc с inputs=outputs раннее уничтожение?

Ограничения раннего затирания встроенного ассемблера Gcc описаны здесь, в документации gcc:

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

У нас есть реализация amd64 из 128-битного добавления:

#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:

#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 для этой цели).

Для строгого соответствия спецификациям gcc для раннего затирания во встроенном ассемблере нам понадобятся &для ограничения %0, даже с операторами inputs=outputs?

7
задан Peeter Joot 19 June 2012 в 18:48
поделиться