2012-01-04 25 views
5

Tôi muốn viết một số lắp ráp ARM nội tuyến trong mã C của tôi. Đối với mã này, tôi cần phải sử dụng một hoặc hai đăng ký nhiều hơn những cái được khai báo là đầu vào và đầu ra cho hàm. Tôi biết cách sử dụng danh sách clobber để nói với GCC rằng tôi sẽ sử dụng một số thanh ghi bổ sung để thực hiện tính toán của mình.Tối ưu hóa sổ đăng ký đã sử dụng khi sử dụng lắp ráp ARM nội tuyến trong GCC

Tuy nhiên, tôi chắc chắn rằng GCC có quyền tự do xáo trộn xung quanh những thanh ghi nào được sử dụng cho những gì khi tối ưu hóa. Đó là, tôi có cảm giác đó là một ý tưởng tồi để sử dụng một đăng ký cố định cho tính toán của tôi.

Cách tốt nhất để sử dụng một số đăng ký bổ sung không phải là đầu vào cũng như đầu ra của assembly nội tuyến của tôi, mà không cần sử dụng thanh ghi cố định?

P.S. Tôi đã nghĩ rằng việc sử dụng một biến đầu ra giả có thể làm các thủ thuật, nhưng tôi không chắc chắn những loại hiệu ứng lạ khác sẽ có ...

+0

Tôi đặt cược này * là * có thể khá trực tiếp, nhưng tôi sẽ để cho một guru trả lời này. :-) – Noldorin

+1

Tôi biết rằng bạn có thể sử dụng bí danh đăng ký và cho phép trình biên dịch chọn đăng ký mà nó muốn sử dụng, nhưng không thể nhớ cú pháp cho điều đó. Hoặc bạn có thể cắn viên đạn và chỉ cần viết một tập tin .s ans lắp ráp nó một cách riêng biệt cho sự linh hoạt hơn. –

+1

@MichaelDorgan Cảm ơn bạn đã nhập. Tôi biết thanh ghi đầu vào và đầu ra hoạt động như thế, nhưng tôi chưa thấy thanh ghi đó được sử dụng cho các thanh ghi tạm thời .. Giải pháp thứ hai của bạn có đảo ngược những gì tôi cần, nó loại bỏ các tùy chọn tối ưu hơn (chỉ định các thanh ghi đầu vào và đầu ra) – Madcowswe

Trả lời

5

Ok, tôi đã tìm thấy một nguồn sao lưu ý tưởng sử dụng kết quả đầu ra giả thay vì các thanh ghi cứng:

4.8 Sổ đăng ký tạm thời: Mọi người đôi khi sử dụng sai danh bạ cho các thanh ghi tạm thời. Cách đúng là để tạo thành một đầu ra giả, và sử dụng “= r” hoặc “= & r” tùy thuộc vào chồng chéo cho phép với đầu vào. GCC cấp phát một thanh ghi cho giá trị giả. Sự khác biệt là GCC có thể chọn một thanh ghi thuận tiện, vì vậy nó có nhiều tính linh hoạt hơn.

từ trang 20 của this pdf.

Đối với bất kỳ ai quan tâm đến thông tin thêm về lắp ráp nội tuyến với GCC this, trang web hóa ra rất mang tính hướng dẫn.

+0

Trên AArch64 tuần trước, tôi tìm thấy gcc tạo mã tốt hơn đứng đầu và lắp ráp phần cứng của tôi khi tôi mã hóa cứng (giống như đã viết 'thêm w2,% [input1],% [input2]') tạm thời và clobbered chúng hơn là làm các trick bạn đã đề cập (như 'add% [fakeoutputastemp],% [input1],% [input2]'). YMMV tất nhiên. Trường hợp của tôi: http://stackoverflow.com/questions/28325569/can-pretty-variable-names-be-used-for-registers-in-gcc-inline-assembly. Nếu bạn biết quy ước gọi điện, bạn có thể chọn các regs tạm thời sẽ không làm cho arg bị đẩy và cũng không quá cao. – ahcox