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
Możliwe, że gcc nie może obsłużyć tego przypadku, ponieważ zakłada, że wszystkie procesory x86-64 mają SSE. – Amok
Czy to oznacza, że nikt nigdy nie mnoży niczego w jądrze FreeBSD w 64-bitowych wersjach? – Nathan
Każde jądro, nad którym pracowałem, ma tendencję do unikania zmiennoprzecinkowych w jak największym stopniu. –