gcc的內聯彙編早期撞約束這裏描述在這裏GCC文檔:這個輸入=輸出的gcc樣式asm是否需要早期的clobber?
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, ...) */ \
)
但是,我不敢肯定小號因此,我們在amd64版本中明確指定輸入=輸出(%0
== %4
,%1
== %5
)?
第一個非earlyclobber版本似乎目前在我們正在使用的所有優化級別上工作,至少在intel編譯器中(如果使用gcc,我們不需要這個,因爲gcc現在支持本目標上的本地int128操作) 。
爲了嚴格遵守內聯asm中早期clobber的gcc規範,我們需要&
作爲%0
約束,即使使用inputs = outputs語句?