Ist es (leicht) möglich, einen Software-Gleitkomma-Punkt auf i386-Linux zu verwenden, ohne dass bei jedem Aufruf die Kosten des Einfangens in den Kernel entstehen? Ich habe -smsoft-float ausprobiert, aber es scheint, dass die normalen (ubuntu) C-Bibliotheken keine FP-Bibliothek enthalten:
%Vor%Wenn Sie Ihre gesamte Toolchain nicht manuell per Bootstrap erstellen möchten, können Sie mit uclibc beginnen toolchain (die i386-Version, stelle ich mir vor) - Soft-Float wird (AFAIK) nicht direkt für die "native" Kompilierung auf Debian und Derivaten unterstützt, sondern kann über den "embedded" -Ansatz der uclibc-Toolchain verwendet werden.
Es ist überraschend, dass gcc dies nicht nativ unterstützt, da der Code in der Quelle in einem Verzeichnis mit dem Namen soft-fp
eindeutig verfügbar ist. Es ist möglich, diese Bibliothek manuell zu kompilieren:
Es gibt einige c-Dateien, die aufgrund von Fehlern nicht kompiliert werden, aber die Mehrheit kompiliert. Nach dem Kopieren von libsoft-fp.a
in das Verzeichnis mit unseren Quelldateien kompilieren sie nun mit -msoft-float
:
Eine schnelle Inspektion mit
%Vor%zeigt, dass erwartungsgemäß keine x87 Fließkomma-Anweisungen aufgerufen werden und der Code auch deutlich langsamer abläuft, in meinem Beispiel um einen Faktor von 8, der sehr viel Unterteilung verwendet.
Hinweis: Ich hätte es vorgezogen, die Soft-Float-Bibliothek mit
zu kompilieren %Vor%aber das führt zu vielen Fehlermeldungen wie
%Vor% Scheint als wäre die i386
Version nicht gut gepflegt, da st(1)
auf eines der x87 Register zeigt, die offensichtlich nicht verfügbar sind, wenn -msoft-float
verwendet wird.
Seltsam oder glücklicherweise kompiliert die arm
version in i386
und scheint gut zu funktionieren.
GCC unterstützt dies nicht ohne einige zusätzliche Bibliotheken. Aus der 386-Dokumentation :
-msoft-float Generiert Ausgaben, die Bibliotheksaufrufe für Floating enthalten Punkt. Warnung : das Erforderliche Bibliotheken sind nicht Teil von GCC. Normalerweise sind die Einrichtungen des Maschine üblichen C-Compiler verwendet werden, aber das kann nicht direkt in gemacht werden Kreuz-Kompilierung. Du musst deine machen eigene Arrangements zur Verfügung zu stellen Bibliotheksfunktionen für Kreuz-Kompilierung.
Auf Maschinen, auf denen eine Funktion zurückkehrt Fließkomma ergibt sich in der 80387 Registerstapel, etwas Fließkomma Opcodes können auch dann ausgegeben werden, wenn -msoft-float wird verwendet
Sie können -mfpmath = unit auch nicht auf "none" setzen, es muss sse, 387 oder beides sein.
Laut dieser Gnu-Wiki-Seite gibt es jedoch fp-soft und ieee . Es gibt auch SoftFloat .
(Für ARM gibt es -mfloat-abi = softfp, aber es scheint nicht, dass etwas Ähnliches für 386 SX verfügbar ist).
Es scheint nicht so, als ob tcc Software-Gleitkommazahlen unterstützt.
Viel Glück bei der Suche nach einer Bibliothek, die für Sie funktioniert.
Heute,
Wenn Sie nicht auf eine Plattform abzielen, die keine integrierte FP-Unterstützung bietet, kann ich mir keinen Grund vorstellen, warum Sie die FP-Unterstützung emulieren sollten.
Hat Ihre x386-Plattform keine externe FPU-Unterstützung? Schade, es ist kein x486 mit eingebauter FPU!
Nach meiner Erfahrung ist jede weiche Emulation wesentlich langsamer als ihre Hardware-Entsprechung.
Deshalb habe ich ein Paket in Ada geschrieben, um die Onboard-68k-FPU zu verwenden, anstatt die Soft-Emulation des Compiler-Herstellers zu dieser Zeit zu verwenden. Sie haben es tatsächlich in ihrem Compiler gebündelt.
Bearbeiten: Habe gerade deinen Kommentar unten gesehen. Hmmm, wenn Sie keine vollständige FP-Unterstützung benötigen, können Sie Ihre eigenen mathematischen Funktionen für die wenigen mathematischen Funktionen verwenden, die Sie benötigen? Wie das Ada-Paket, das ich erwähnt habe, angefangen hat.
HTH
Prost,
Tags und Links x86 linux floating-point