Gcc inline asm chế clobber sớm được mô tả ở đây trong các tài liệu gcc đây:Liệu kiểu asc gcc này có đầu vào = đầu ra đòi hỏi một clobber sớm?
http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
Chúng tôi đã một thực hiện amd64 của 128 bit thêm:
#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, ...) */ \
)
tôi đã tự hỏi nếu điều này phải sử dụng đầu clobber (&) cho% 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, ...) */ \
)
Tuy nhiên, tôi không chắc chắn ince chúng tôi có đầu vào = đầu ra rõ ràng trong phiên bản amd64 (%0
== %4
, %1
== %5
)?
Phiên bản non-earlyclobber đầu tiên hiện đang hoạt động trên tất cả các mức tối ưu hóa mà chúng tôi đang sử dụng, ít nhất với trình biên dịch intel (chúng tôi sẽ không cần điều này nếu sử dụng gcc, vì gcc hiện hỗ trợ các hoạt động int128 gốc trên mục tiêu này) .
Để tuân thủ nghiêm ngặt các thông số gcc cho clobber sớm trong nội tuyến asm, chúng tôi có cần &
cho ràng buộc %0
, ngay cả với câu lệnh input = output không?