2012-06-19 18 views
7

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?

Trả lời

1

Bạn cần dấu đầu dòng NẾU bạn gọi macro này với cùng biểu thức chính xác cho bhal. Trong trường hợp đó, không có clobber, trình biên dịch có thể chọn sử dụng cùng một thanh ghi cho %3%4 (tương tự như %0), vì vậy lệnh đầu tiên có thể ghi đè giá trị đó trước khi biểu thức thứ hai đọc nó.

Rất khó rằng bạn thực sự gọi macro theo cách có thể kích hoạt vấn đề này, vì vậy không có gì đáng ngạc nhiên khi bạn không thấy bất kỳ sự cố nào không có phím tắt. Thêm clobber cũng giới thiệu một bản sao đăng ký thêm (không cần thiết) khi bạn gọi macro với al giống hệt với bl (ví dụ, thêm một giá trị 128 bit vào chính nó tại chỗ), do đó, hơi không mong muốn.

Các vấn đề liên quan