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 语句?