2009-06-19 34 views
8

Có (dễ dàng) có thể sử dụng điểm nổi phần mềm trên i386 linux mà không làm mất chi phí bẫy vào hạt nhân trên mỗi cuộc gọi không? Tôi đã thử -msoft-float, nhưng có vẻ như bình thường (ubuntu) C thư viện không có một thư viện FP bao gồm:Sử dụng điểm nổi phần mềm trên linux x86

$ gcc -m32 -msoft-float -lm -o test test.c 
/tmp/cc8RXn8F.o: In function `main': 
test.c:(.text+0x39): undefined reference to `__muldf3' 
collect2: ld returned 1 exit status 

Trả lời

4

Trừ khi bạn muốn để bootstrap toàn bộ toolchain của bạn bằng tay, bạn có thể bắt đầu với uclibc toolchain (phiên bản i386, tôi tưởng tượng) - float mềm là (AFAIK) không được hỗ trợ trực tiếp để biên dịch "bản địa" trên debian và các dẫn xuất, nhưng nó có thể được sử dụng thông qua phương pháp "nhúng" của chuỗi công cụ uclibc.

+0

Cảm ơn bạn đã phản hồi. Tôi đã thử bootstrap uclibc bằng cách sử dụng buildroot nhưng nó có vẻ là bỏ qua các .config tôi cung cấp nó theo BR2_UCLIBC_CONFIG, ít nhất là cho các tùy chọn UCLIBC_HAS_FPU:/ – bdonlan

+0

@Alex Liên kết toolchain uclibc bị hỏng. http://uclibc.org/toolchains.html phải phù hợp? – zengr

0

G'day,

Trừ khi bạn đang nhắm mục tiêu một nền tảng mà không có hỗ trợ FP inbuilt, tôi không thể nghĩ ra một lý do tại sao bạn muốn thi đua hỗ trợ FP.

Nền tảng x386 của bạn có hỗ trợ FPU bên ngoài không? Đáng tiếc nó không phải là một x486 với FPU được xây dựng trong!

Theo kinh nghiệm của tôi, bất kỳ mô phỏng mềm nào đều bị ràng buộc chậm hơn nhiều so với phần cứng tương đương.

Đó là lý do tại sao tôi hoàn thành việc viết một gói trong Ada để gắn thẻ FPU 68k trên bo mạch thay vì sử dụng mô phỏng mềm do nhà sản xuất trình biên dịch cung cấp tại thời điểm đó. Họ đã hoàn thành gói nó trong trình biên dịch của họ như là một vấn đề của thực tế.

Chỉnh sửa: Chỉ xem bình luận của bạn bên dưới. Hmmm, nếu bạn không cần một bộ phần mềm hỗ trợ đầy đủ của FP, bạn có thể tự mình thực hiện một số chức năng toán học mà bạn cần không? Đó là cách mà gói Ada tôi đã đề cập đã bắt đầu.

HTH

cổ vũ,

+3

Chúng tôi đang xem xét việc chuyển một sản phẩm sang CPU x86 được nhúng và một số trong số chúng không có FPU. Chúng tôi hiện đang chạy trên một nền tảng không có FPU, nhưng chúng tôi không chịu các hình phạt cho việc bẫy hạt nhân :) – bdonlan

4

GCC không hỗ trợ này mà không có một số thư viện thêm. Từ the 386 documentation:

-msoft-float Tạo đầu ra chứa các cuộc gọi thư viện cho nổi điểm. Cảnh báo: các yêu cầu thư viện không phải là một phần của GCC. Thông thường, các thiết bị của trình biên dịch C thông thường của máy được sử dụng, nhưng không thể thực hiện trực tiếp trong biên dịch chéo này. Bạn phải tự mình sắp xếp của riêng mình để cung cấp các chức năng thư viện phù hợp cho biên dịch chéo.

Trên máy nơi một hàm trả về kết quả dấu chấm động trong 80.387 đăng ký ngăn xếp, một số dấu chấm động opcodes có thể được phát ra ngay cả khi -msoft-float được sử dụng

Ngoài ra, bạn không thể thiết lập - mfpmath = unit thành "none", nó phải là sse, 387 hoặc cả hai.

Tuy nhiên, theo this gnu wiki page, có fp-soft và ieee. Ngoài ra còn có SoftFloat.

(Đối với ARM có -mfloat-abi = softfp, nhưng dường như không có gì tương tự có sẵn cho 386 SX).

Nó có vẻ không giống như tcc hỗ trợ số phần mềm dấu phẩy động.

Chúc may mắn tìm thư viện phù hợp với bạn.

6

Thật đáng ngạc nhiên là gcc không hỗ trợ nguyên bản này vì mã rõ ràng có sẵn trong nguồn trong thư mục có tên soft-fp. Có thể biên dịch thư viện đó theo cách thủ công:

$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc 
$ cd libgcc/soft-fp/ 
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c 
$ ar -crv libsoft-fp.a *.o 

Có một vài tệp không biên dịch do lỗi nhưng phần lớn sẽ biên dịch. Sau khi sao chép libsoft-fp.a vào thư mục với các file nguồn của chúng tôi bây giờ họ biên dịch tốt với -msoft-float:

$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

Một kiểm tra nhanh chóng sử dụng

$ objdump -D --disassembler-options=intel a.out | less 

cho thấy như mong đợi không x87 hướng dẫn điểm nổi được gọi và chạy mã chậm hơn đáng kể, theo hệ số 8 trong ví dụ của tôi sử dụng nhiều phân chia.

Lưu ý: tôi sẽ đã ưa thích để biên dịch thư viện mềm-float với

$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

nhưng có kết quả trong vô số thông báo lỗi như

adddf3.c: In function '__adddf3': 
adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

Có vẻ như phiên bản i386 là không được duy trì tốt như st(1) điểm đến một trong các thanh ghi x87 rõ ràng là không có sẵn khi sử dụng -msoft-float. Thật lạ hoặc may mắn phiên bản arm biên dịch tốt trên i386 và có vẻ hoạt động tốt.

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