2009-06-19 12 views
8

Ist es (leicht) möglich, Software-Gleitkomma auf i386-Linux zu verwenden, ohne dass die Kosten für das Auffangen des Kernels bei jedem Aufruf entstehen? Ich habe -msoft-Schwimmer versucht, aber es scheint das normal (ubuntu) C-Bibliotheken haben keine FP-Bibliothek enthalten:Verwenden von Software Fließkomma auf x86-Linux

$ 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 

Antwort

4

Es sei denn, Sie wollenIhre gesamte Toolchain von Hand Bootstrap, könnten Sie Beginnen Sie mit uclibc toolchain (die i386-Version, ich mir vorstellen) - Soft-Float ist (AFAIK) nicht direkt für "native" Kompilierung auf debian und Derivate, aber es kann über die "embedded" Ansatz der uclibc-Toolchain verwendet werden.

+0

Danke für die Antwort. Ich habe versucht, uclibc mit buildroot bootstrapping, aber es scheint zu ignorieren die .config Ich habe es unter BR2_UCLIBC_CONFIG, zumindest für die UCLIBC_HAS_FPU-Option:/ – bdonlan

+0

@Alex Der uclib Toolchain-Link ist gebrochen. http://uclibc.org/toolchains.html sollte angemessen sein? – zengr

0

G'day,

Sofern Sie eine Plattform sind Targeting, die nicht eingebaute FP-Unterstützung bietet, kann ich mir nicht aus einem Grund, warum Sie FP Unterstützung emulieren wollen würde.

Hat Ihre x386-Plattform keine externe FPU-Unterstützung? Schade, es ist kein x486 mit der FPU eingebaut!

Meiner Erfahrung nach 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: Nur Ihren 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 von mir erwähnte Ada-Paket angefangen hat.

HTH

prost,

+3

Wir betrachten die Portierung eines Produkts auf eine eingebettete x86-CPU, und einige von ihnen haben keine FPU. Wir laufen derzeit auf einer Plattform ohne FPU, aber es fallen keine Strafen für das Einfangen des Kernels an :) – bdonlan

4

GCC dies ohne einige zusätzliche Bibliotheken nicht unterstützt. Von the 386 documentation:

-msoft-float für Floating Punkt Ausgabe enthält Bibliotheksaufrufe generieren. Warnung: die erforderlichen Bibliotheken sind nicht Teil von GCC. Normalerweise werden die Einrichtungen des Maschine üblichen C-Compiler verwendet, , aber dies kann nicht direkt in Cross-Compilierung getan werden. Sie müssen Ihre eigenen Vorkehrungen treffen, um geeignete Bibliotheksfunktionen für Cross-Compilation bereitzustellen.

Auf Maschinen, bei denen eine Funktion Gleitkommaergebnisse im 80387 Registerstapel zurückgibt, können einige Floating-Point- Opcodes auch wenn -msoft-Schwimmer verwendet wird

Auch emittiert werden, können Sie nicht festgelegt - mfpmath = unit zu "none", es muss sse, 387 oder beides sein.

Allerdings gibt es nach this gnu wiki page, 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 wie tcc unterstützt Software Gleitkommazahlen entweder.

Viel Glück bei der Suche nach einer Bibliothek, die für Sie arbeitet.

6

Es ist überraschend, dass gcc dies nicht nativ unterstützt, da der Code in der Quelle in einem Verzeichnis namens soft-fp eindeutig verfügbar ist. Es ist möglich, dass die Bibliothek manuell zu kompilieren:

$ 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 

Es gibt ein paar c-Dateien sind, die aufgrund von Fehlern nicht kompilieren, aber die Mehrheit nicht kompiliert. Nach dem Kopieren libsoft-fp.a in das Verzeichnis mit unseren Quelldateien kompilieren sie jetzt gut mit -msoft-float:

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

Einer schnellen Inspektion

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

mit zeigt, dass wie erwartet keine x87 Gleitkommaanweisungen aufgerufen und den Code ausgeführt werden deutlich langsamer, um einen Faktor von 8 in meinem Beispiel, das viel Teilung verwendet.

Hinweis: hätte ich die Soft-Float-Bibliothek mit

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

aber das führt zu Belastungen von Fehlermeldungen wie

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

scheint, wie die i386 zu kompilieren bevorzugte Version ist 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 zum Glück die arm Version kompiliert in Ordnung auf i386 und scheint gut zu funktionieren.

Verwandte Themen