2009-10-12 24 views
9

Jestem w następującej sytuacji:SSE powrót rejestr z SSE niepełnosprawnych

  • piszę kod jądra, który nie pozwala instrukcje SSE
  • muszę zrobić arytmetyki zmiennoprzecinkowej
  • I „m kompilowania dla platformy x86_64

Oto przykładowy kod, który ilustruje problem:

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; 
} 

I tu jest odpowiednia linia z 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 

Kiedy uruchomić kompilacji otrzymuję ten błąd:

SSE register return with SSE disabled 

(punktów o błędach do linii, która mnoży D i base_value)

Każdy pomysł, co mogę zrobić, aby to naprawić? Usunięcie -mno-sse nie jest opcją, ale wygląda na to, że kompilator powinien mieć możliwość generowania kodu spoza ssese, aby zrobić pomnożenie.

Dzięki Nathan

+1

Możliwe, że gcc nie może obsłużyć tego przypadku, ponieważ zakłada, że ​​wszystkie procesory x86-64 mają SSE. – Amok

+1

Czy to oznacza, że ​​nikt nigdy nie mnoży niczego w jądrze FreeBSD w 64-bitowych wersjach? – Nathan

+0

Każde jądro, nad którym pracowałem, ma tendencję do unikania zmiennoprzecinkowych w jak największym stopniu. –

Odpowiedz

6

Brzmi jak kompilator emituje wezwanie do rutynowych biblioteki zrobić zmiennoprzecinkowych pomnożyć dla Ciebie (prawdopodobnie bez użycia SSE), ale stara się wykorzystać ABI na wezwanie, które ma wartość zwracaną przekazywaną w SSE. Oczywiście to nie działa.

Jeśli w ogóle możliwe jest używanie w jądrze zmiennoprzecinkowej, to powinna istnieć specjalna biblioteka środowiska wykonawczego do wykonywania operacji miękkiego float, które nie używają zwykłej (użytkownika) argumentów przechodzących i powrotnych. Jednak z tego, co wiem, nie ma wsparcia dla zmiennoprzecinkowego w jądrze BSD. Tak było na pewno kilka lat temu.

Najprawdopodobniej powinieneś po prostu poprosić o listę adresów e-mail jądra BSD, czy możliwe jest użycie zmiennoprzecinkowej; Podejrzewam, że da ci szybszą, bardziej definitywną odpowiedź niż SO.

+0

Postanowiłem użyć zamiast tego arytmetyki stałoprzecinkowej (jądro, o którym mowa, jest oparte na jądrze FreeBSD, ale zostało znacząco zmienione, więc nie byłem pewien, czy któraś z oficjalnych list mailingowych dałaby lepszą odpowiedź niż "nie" zrób to. " – Nathan

+0

Ah. Przepraszam, że nie ma szczęśliwszej odpowiedzi na tę. –