2014-09-04 16 views
6

Nếu tôi muốn để lộ một hướng dẫn cụ thể máy duy nhất để các lập trình viên, có hai cách tôi có thể làm như vậy:gcc nội tại và nội tuyến lắp ráp: đó là tốt hơn?

  1. Xác định một BUILTIN mới/nội
  2. Expose giống như lắp ráp inline asm() [ Vì đây là một hướng dẫn loại số học duy nhất, tôi tin rằng không cần thiết cho asm dễ bay hơi()]

Tôi đã biết rằng trình biên dịch cho phép trình biên dịch kiểm tra kiểu, đăng ký phân bổ và "tối ưu hóa khác" vv Nhưng trình biên dịch sẽ cần phải làm điều này ngay cả trong trường hợp asm(), phải không? Vậy lợi ích hiệu suất của việc sử dụng asm() trong một hướng dẫn đơn giản là gì?

Phương trình thay đổi như thế nào nếu có nhiều lệnh máy liên quan?

Đối số "di động" có lợi cho nội tại là dễ hiểu, nhưng tôi tò mò muốn hiểu lợi thế về hiệu suất, nếu có, so với cái kia.

+0

Đối với một hướng dẫn duy nhất tôi nghi ngờ sẽ có sự khác biệt đáng chú ý. – Gene

+4

Nội trang dựng sẵn. GCC pastes verbatim lắp ráp nội tuyến của bạn vào dòng mã, và về phân tích duy nhất nó làm trên asm nội tuyến là tính khả thi của các ràng buộc đăng ký bạn đặt. Điều này có nghĩa là không có cơ hội để chuyển đổi các hướng dẫn để cái gì khác nếu nó được tối ưu hơn trong một tình huống nhất định, hoặc xóa nó nếu nó có thể được chứng minh rằng lệnh là vô dụng. –

+1

Lắp ráp nội tuyến là khi bạn biết rõ hơn trình biên dịch, và muốn nó thoát ra ngoài để bạn có thể thực hiện chính xác các lệnh bạn muốn, theo đúng thứ tự bạn muốn, chính xác trên thanh ghi mà bạn muốn. Đây thường là một ý tưởng tồi. – Sneftel

Trả lời

6

Tôi nghĩ điều đó phụ thuộc rất nhiều vào những gì bạn đang làm. Sửa đổi GCC, và yêu cầu một GCC sửa đổi để xây dựng chương trình của bạn trừ khi/cho đến khi bản vá GCC của bạn làm cho nó ngược dòng, là rất nhiều đau đầu hơn là chỉ sử dụng nội tuyến asm.

Nếu lệnh bạn muốn sử dụng có ý nghĩa trừu tượng không bị ràng buộc với kiến ​​trúc bộ lệnh cụ thể, hãy thêm nội trang/nội tại sao cho cùng mã sử dụng nó có thể tự động làm việc trên tất cả các mục tiêu (với dự phòng phức tạp hơn thực hiện với nhiều hướng dẫn về các mục tiêu không có hướng dẫn) có lẽ là lựa chọn "đúng", nhưng có thể vẫn chưa thực tế.

Nếu lệnh là thứ gì đó rất cụ thể về ISA, tối nghĩa, không hiệu suất, vv .. (Tôi đang nghĩ đến việc tải đăng ký phần cứng đặc biệt, đăng ký chế độ cpu, nhận thông tin mô hình, v.v. chắc chắn bạn có thể nghĩ về các ví dụ khác) sau đó chỉ cần sử dụng nội tuyến asm là gần như chắc chắn là giải pháp đúng. Thậm chí nếu bạn nghĩ rằng nội trang là giải pháp "đúng" cho vấn đề của bạn, nhưng cần phải thực hiện phương pháp tiếp cận nội tuyến vì lý do thực tế, bạn vẫn có thể trừu tượng hóa nó bằng chức năng nội tuyến tĩnh hoặc macro theo cách thật dễ dàng để thay thế tất cả các lần sử dụng với nội tại sau này (hoặc với việc thực hiện dự phòng trên các mục tiêu không có hướng dẫn).

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