2009-10-12 26 views
9

Tôi đang trong tình huống sau đây:SSE trở lại đăng ký với SSE tàn tật

  • Tôi viết mã cho một hạt nhân không cho phép các chỉ lệnh SSE
  • tôi cần phải làm dấu chấm động số học
  • tôi 'm biên dịch cho một nền tảng x86_64

đây là một mẫu mã mà minh họa các vấn đề:

int 
main(int argc, char** argv) 
{ 
    double d = 0.0, dbase; 
    uint64_t base_value = 300; 

    d = (2200.0 - 1000.0)/(1000.0); 
    dbase = d * base_value; 
    printf("d = %f, dbase = %f\n", d, dbase); 
    base_value = dbase; 
    printf("base_value = %llu\n", (long long unsigned)base_value); 
    return 0; 
} 

Và đây là dòng có liên quan từ makefile:

CFLAGS += -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow \ 
      -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer 

Khi tôi chạy một build tôi nhận được lỗi này:

SSE register return with SSE disabled 

(Những điểm lỗi đến dòng đó sẽ nhân d và BASE_VALUE)

Bất kỳ ý tưởng nào tôi có thể làm để khắc phục sự cố này? Loại bỏ -mno-sse không phải là một lựa chọn, nhưng có vẻ như trình biên dịch sẽ có thể tạo ra mã không phải là sse để làm nhân.

Cảm ơn Nathan

+1

Có thể gcc không thể xử lý trường hợp này vì nó giả định rằng tất cả các bộ xử lý x86-64 đều có SSE. – Amok

+1

Điều này có nghĩa là không ai bao giờ nhân bất cứ thứ gì bên trong hạt nhân FreeBSD trên bản dựng 64 bit không? – Nathan

+0

Bất kỳ hạt nhân nào tôi đã làm việc có xu hướng tránh điểm nổi càng nhiều càng tốt. –

Trả lời

6

Nghe có vẻ như trình biên dịch được phát ra một cuộc gọi đến một thói quen thư viện để làm điểm nhân nổi cho bạn (có lẽ không sử dụng SSE), nhưng đang cố gắng sử dụng một ABI cho cuộc gọi đó có giá trị trả lại được chuyển trong SSE. Rõ ràng, điều đó không hiệu quả.

Nếu có thể sử dụng dấu phẩy động trong hạt nhân, phải có thư viện thời gian chạy đặc biệt để thực hiện thao tác trôi nổi không sử dụng đối số thông thường (userland). Tuy nhiên, theo như tôi biết, không có hỗ trợ cho dấu phẩy động trong hạt nhân BSD. Đó chắc chắn là trường hợp một vài năm trước đây.

Bạn có thể chỉ cần hỏi danh sách email của người phát triển hạt nhân BSD cho dù có thể sử dụng dấu phẩy động hay không; Tôi nghi ngờ nó sẽ cung cấp cho bạn một câu trả lời dứt khoát nhanh hơn SO.

+0

Tôi quyết định chỉ sử dụng số học điểm cố định thay vào đó (hạt nhân được đề cập dựa trên hạt nhân FreeBSD nhưng bị thay đổi đáng kể, vì vậy tôi không chắc chắn rằng bất kỳ danh sách gửi thư chính thức nào sẽ trả lời tốt hơn "không Hãy làm điều đó ". – Nathan

+0

Ah. Xin lỗi vì không có câu trả lời nào hạnh phúc hơn cho cái này. –