Vòng lặp bên ngoài được sản xuất bởi trình biên dịch PIC từ MicroChip


7

Chúng tôi đang sử dụng phiên bản Lite của trình biên dịch PIC MicroChip vì vậy có thể đó là lý do, nhưng sự thay đổi một bit đơn giản này đang tạo ra một vòng lặp trong đó không cần thiết. Vì số lượng ca là 1 (một hằng số), tôi mong muốn trình biên dịch sẽ không tạo ra vòng lặp tối ưu cho một vòng lặp.

Có một công tắc tối ưu hóa trình biên dịch sẽ làm giảm vòng lặp? Đây là mã cho ca làm việc:

    long foo;   // a 32-bit value

// Shift foo one bit. 
// A one-iteration loop is created!

    foo >>= 1;

Và đây là mã do trình biên dịch tạo ra. Như bạn có thể thấy, sự thay đổi được gói bằng một vòng lặp một lần.

  07F6    3001     MOVLW 0x1
  07F7    00F2     MOVWF 0x72
  07F8    37F6     ASRF 0x76, F
  07F9    0CF5     RRF 0x75, F
  07FA    0CF4     RRF 0x74, F
  07FB    0CF3     RRF 0x73, F
  07FC    0BF2     DECFSZ 0x72, F

BIÊN TẬP

Phiên bản trình biên dịch: Trình biên dịch HI-TECH C cho PIC10 / 12/16 MCU (Chế độ Lite) V9.81


3
Bạn có thể gửi chính xác trình biên dịch? Micochip hiện cung cấp các trình biên dịch XC ngoài các trình biên dịch sê-ri C và kể từ khi Microchip tiếp quản Hi-Tech, một số người gọi các trình biên dịch vi mô Hi-Tech cũng vậy.
AndrejaKo

4
Nếu bạn sẽ thống nhất các hướng dẫn riêng lẻ, đừng sử dụng trình biên dịch.
Olin Lathrop

2
@OlinLathrop - Vô nghĩa. Tôi sẽ viết cả một chương về việc tuyên bố đó sai như thế nào. Đây không phải là một trường hợp đau đớn theo các hướng dẫn riêng lẻ, đây là một đầu mối mà trình biên dịch đang tạo ra mã hiệu suất rất kém.
Rocketmagnet

4
@Rocket: Bạn đang thiếu điểm, đó là trình biên dịch sẽ làm những gì nó làm. Bạn đang quan tâm đến hướng dẫn cá nhân kể từ khi bạn nhìn họ và quyết định họ không hiệu quả. Bạn đang sử dụng ngôn ngữ cấp cao hoặc bạn không sử dụng. Nếu là bạn, đừng phàn nàn về những gì diễn ra dưới mui xe. Nếu bạn muốn tốt hơn, trả tiền cho trình tối ưu hóa, có được trình biên dịch tốt hơn (nếu điều đó thậm chí còn tồn tại) hoặc viết vào trình biên dịch chương trình.
Olin Lathrop

2
@OlinLathrop - Tôi ước tôi có không gian để đi sâu về lý do tại sao bạn sai ở đây.
Rocketmagnet

Câu trả lời:


2

Có thể điều này là do thiếu tối ưu hóa phiên bản lite.
Bạn có thể thử,

foo /= 2;

và xem nếu nó giúp.


foo / = 2 tạo ra 28 hướng dẫn di chuyển cộng với GỌI thành thói quen phân chia 32 bit dài.
IJ Kennedy

Bạn đã thử biên dịch mã với XC8 chưa?
Bruno Ferreira

1

Tôi đã thử các tùy chọn tối ưu hóa khác nhau, nhưng không có gì làm cho trình biên dịch tạo ra mã lành mạnh. Tôi cũng đã có kinh nghiệm tương tự với trình biên dịch C18. Một số mã mà nó tạo ra rất đáng kinh ngạc, và cuối cùng tôi đã sử dụng một số loại macro và thủ thuật. Cuối cùng, tôi đã có thể lấy nó để tạo mã gần như trình biên dịch được tối ưu hóa bằng tay trong khi vẫn khá dễ đọc.

Macro không đẹp này tạo ra trình biên dịch chính xác để dịch chuyển phải dài.

long foo;

#define R_SHIFT_LONG(x)     asm("asrf    _" #x "+3, f"); \
                            asm("rrf     _" #x "+2, f"); \
                            asm("rrf     _" #x "+1, f"); \
                            asm("rrf     _" #x "+0, f");

void main(void)
{
    foo=1234;

    R_SHIFT_LONG(foo);
}

Tôi không biết bạn nghĩ macro này dùng để làm gì, nhưng không có PIC 8 bit nào có cả lệnh ASRF và RRCF.
Olin Lathrop

Thật kỳ quặc làm sao. Trình biên dịch không tạo ra lỗi hoặc cảnh báo, chỉ âm thầm chuyển đổi rrcf thành rrf.
Rocketmagnet

Ah, vì vậy bạn rõ ràng đang giả sử một trong số các lõi 14 bit được tăng cường. Khi các bạn đang hướng dẫn nhìn trộm, bạn thực sự cần phải nói mã PIC dùng để làm gì.
Olin Lathrop

@OlinLathrop - Chà, tôi giả sử cùng một bộ hướng dẫn mà OP đang sử dụng.
Rocketmagnet

-1

Bây giờ tôi đã có cơ hội để xem mã của bạn, nó thực sự không phải là không hợp lý. Tùy thuộc vào PIC mô hình cụ thể, nó có thể được thực hiện theo 4 hoặc 5 hướng dẫn, nhưng chỉ trong trường hợp đặc biệt là dịch chuyển một bit . Có vẻ khá hợp lý rằng điều đầu tiên trình biên dịch thực hiện là viết mã cho trường hợp chung trong đó sự thay đổi dành cho N bit. Tôi sẽ ngạc nhiên nếu nó không nhận ra sự thay đổi một chút là một trường hợp đặc biệt với tối ưu hóa được bật, nhưng làm thế nào đây không chính xác là điều bạn mong đợi nó sẽ làm mà không tối ưu hóa?

Tuy nhiên, một lần nữa, nếu bạn quan tâm đến mức độ chi tiết này, bạn nên viết bằng trình biên dịch. Bằng cách sử dụng một trình biên dịch, bạn đã loại bỏ việc tạo hướng dẫn chi tiết. Bên cạnh đó, thật không công bằng khi đánh giá bất kỳ trình biên dịch nào đã tắt tối ưu hóa.


2
Trình biên dịch dường như thực hiện điều này ngay cả khi tối ưu hóa được bật và được đặt thành 9.
Rocketmagnet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.