7

Gcc inline asm の初期の 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 に初期のクロバー (&) を使用する必要があるかどうか疑問に思っていました:

#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ただし、amd64 バージョン ( == %4%1== %5) で明示的に入力 = 出力があるため、よくわかりませんでした。

初期の非初期バージョンは、現在、少なくとも Intel コンパイラを使用して、使用しているすべての最適化レベルで動作しているようです (gcc はこのターゲットでネイティブの int128 操作をサポートするようになったため、gcc を使用する場合はこれは必要ありません)。

インライン asm の初期の clobber の gcc 仕様に厳密に準拠するには、inputs=outputs ステートメントを使用しても&、制約に for が必要ですか?%0

4

1 に答える 1

1

bhおよび とまったく同じ式でこのマクロを呼び出す場合は、初期の clobber IF が必要ですal。その場合、クロバーがなければ、コンパイラーは and に同じレジスターを使用することを選択する可能性があるため%3(%4これは と同じです%0)、最初の命令がその値を 2 番目の式が読み取る前にクロバーする可能性があります。

この問題を引き起こす可能性のある方法で実際にマクロを呼び出す可能性はほとんどないため、clobber がなければ問題が発生しないことは驚くに値しません。clobber を追加すると、al同じマクロを呼び出すときに余分な (不要な) レジスタ コピーが導入されるためbl(たとえば、128 ビット値をそれ自体に追加するなど)、少し望ましくありません。

于 2012-06-19T18:20:49.290 に答える