2012-11-02 27 views
12

Tôi làm việc trên phần mềm cho hệ thống nhúng không có FPU. Tôi muốn có thể xây dựng phần mềm này với một thư viện điểm nổi phần mềm trên máy tính để bàn của tôi để có được cái nhìn thực tế hơn về hiệu năng. Có ai có bất kỳ ý tưởng về làm thế nào để đạt được điều này?Phao mềm trên x86_64

Cho đến nay tôi chưa đạt được nhiều tiến bộ với việc sử dụng -msoft-float với gcc. Tôi hiện đang xem xét việc sử dụng tiếng kêu. Bằng cách sử dụng các cờ -Xclang -msoft-float -Xclang -no-implicit-float và chỉ định một thư viện có triển khai các thủ tục nổi mềm, tôi có thể nhận được ứng dụng của tôi để biên dịch. Khi tôi cố gắng chạy nó, nó luôn luôn segfaults. Tốt nhất tôi có thể nói, điều này là bởi vì các thư viện mà chương trình này phụ thuộc không được biên dịch bằng phao mềm. Ứng dụng này phụ thuộc vào gtk, sqlite, expat, gcrypt, một số thư viện nội bộ và libc.

Tôi muốn tìm cách xây dựng môi trường xây dựng hoàn chỉnh với hỗ trợ nổi mềm. Tôi đã thử xây dựng uclibc và thiết lập CCCXX vào các tệp nhị phân của clang, nhưng điều này không hoạt động do các yêu cầu để biên dịch chuỗi công cụ gcc (những thứ như autotools phàn nàn về phiên bản trình biên dịch không chính xác). Vì tôi muốn sử dụng clang làm trình biên dịch trong buildroot mới (để có hỗ trợ float mềm), tôi không thấy cần phải xây dựng gcc. Có thể làm điều này mà không có gcc?

+0

Tôi nghĩ rằng đây là điều không thể mà không thay đổi mã, bởi vì 'x86_64' ABI đòi hỏi' xmm' đăng ký để có mặt. Có thể một số thủ thuật '-Ddouble = mpfr :: real' sẽ hoạt động, sử dụng thư viện' mpfr' được yêu cầu bởi 'gcc'. – hirschhornsalz

+0

Như đã lưu ý, 'clang' đã có thể biên dịch một tệp nhị phân mà không có tham chiếu đến các hướng dẫn hoặc các thanh ghi dấu chấm động. Tôi cho rằng câu hỏi thực sự của tôi do đó là nếu có một cách để làm cho một chuỗi công cụ toàn bộ bằng cách sử dụng một cái gì đó như thế này. –

+0

Giải pháp được đề xuất có được không? –

Trả lời

5

GCC không thể thực hiện nó ngoài hộp mà không cần thêm một số thư viện. Về cơ bản, -msoft-float chỉ tạo các cuộc gọi cho các thư viện dấu chấm động nhưng các thư viện bắt buộc không phải là một phần của GCC.

Để liên kết các thư viện soft-fp bạn có thể sử dụng công tắc -lsoft-fp.

Kiến trúc X86_64 chứa các phần mở rộng SSE, do đó trình biên dịch sẽ cố gắng tạo mã SSE cho các thao tác cơ bản như + - * /. Chúng tôi sẽ sử dụng công tắc -mno-sse ngăn chặn hành vi trái phép này.

Nó có thể trông như sau:

gcc -g -msoft-float -mno-sse -m64 -lsoft-fp 

Đối với các mã:

int main() 
{ 
    float a = 10; 
    float b = 20; 

    float c = a * b; 

    return 0; 
} 

Việc lắp ráp kết quả sẽ là:

.file "12.cpp" 
    .def __main; .scl 2; .type 32; .endef 
    .def __mulsf3; .scl 2; .type 32; .endef 
    .text 
    .globl main 
    .def main; .scl 2; .type 32; .endef 
    .seh_proc main 
main: 
    pushq %rbp 
    .seh_pushreg %rbp 
    movq %rsp, %rbp 
    subq $48, %rsp 
    .seh_stackalloc 48 
    .seh_setframe %rbp, 48 
    .seh_endprologue 
    call __main 
    movl .LC0(%rip), %eax 
    movl %eax, -4(%rbp) 
    movl .LC1(%rip), %eax 
    movl %eax, -8(%rbp) 
    movl -8(%rbp), %edx 
    movl -4(%rbp), %ecx 
    call __mulsf3 
    movl %eax, -12(%rbp) 
    movl $0, %eax 
    addq $48, %rsp 
    popq %rbp 
    ret 
    .seh_endproc 
    .section .rdata,"dr" 
    .align 4 
.LC0: 
    .long 1092616192 
    .align 4 
.LC1: 
    .long 1101004800 
    .ident "GCC: (GNU) 4.8.0 20120624 (experimental)" 

hướng dẫn Không SSE đã được tạo ra. Lưu ý cuộc gọi đến __mulsf3.

Một số ý tưởng thú vị có thể được tìm thấy trong câu hỏi này: Using software floating point on x86 linux

+0

Tôi nghi ngờ việc này sẽ hoạt động - đối với các cuộc gọi thư viện, nhưng các thao tác cơ bản như '+ - * /' sẽ vẫn là SSE/xmm, vì không có x86_64 không có SSE – hirschhornsalz

+0

Bạn đúng về SSE. Nhưng nó sẽ hoạt động. Vui lòng xem câu trả lời cập nhật của tôi. –

+1

Nếu tôi cố gắng biên dịch điều này với gcc-4.7.2, tôi nhận được một 'lỗi: SSE đăng ký trở về với SSE bị vô hiệu hóa', có lẽ 4,8 là cần thiết? – hirschhornsalz

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