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