2009-06-19 14 views
8

È (facilmente) possibile utilizzare il software in virgola mobile su Linux i386 senza incorrere nelle spese di intercettazione nel kernel in ogni chiamata? Ho provato -msoft-float, ma sembra che la normale (ubuntu) librerie C non hanno una biblioteca FP incluso:Utilizzo del software in virgola mobile su 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 

risposta

4

meno che non si desidera per l'avvio l'intera toolchain a mano, si potrebbe inizia con uclibc toolchain (la versione i386, immagino) - il soft float è (AFAIK) non direttamente supportato per la compilazione "nativa" su debian e derivati, ma può essere usato tramite l'approccio "embedded" della toolchain uclibc.

+0

Grazie per la risposta. Ho provato a eseguire l'avvio di uclibc utilizzando buildroot, ma sembra ignorare il file .config l'ho fornito sotto BR2_UCLIBC_CONFIG, almeno per l'opzione UCLIBC_HAS_FPU:/ – bdonlan

+0

@Alex Il collegamento toolchain uclibc è interrotto. http://uclibc.org/toolchains.html dovrebbe essere appropriato? – zengr

0

G'day,

meno che non si rivolte a una piattaforma che non ha integrato il supporto FP, non posso pensare a una ragione per la quale ci si vuole emulare il supporto FP.

La piattaforma x386 non supporta il supporto FPU esterno? Peccato che non sia un x486 con FPU integrato!

Nella mia esperienza, qualsiasi emulazione software è destinata ad essere molto più lenta del suo equivalente hardware.

Ecco perché ho finito di scrivere un pacchetto in Ada per tagetare la FPU 68k onboard invece di usare l'emulazione morbida fornita dal produttore del compilatore in quel momento. Hanno finito col metterli nel loro compilatore come un dato di fatto.

Modifica: Appena visto il tuo commento qui sotto. Hmmm, se non hai bisogno di una suite completa di supporto FP è possibile eseguire il rollover per le poche funzioni matematiche di cui hai bisogno? Che è iniziato il pacchetto Ada che ho menzionato.

HTH

applausi,

+3

Stiamo esaminando il porting di un prodotto su una CPU x86 incorporata, e alcuni di questi non hanno una FPU. Al momento stiamo girando su una piattaforma senza FPU, ma non subiamo penalità per il trapping del kernel :) – bdonlan

4

GCC non supporta questo senza alcune librerie extra. Da the 386 documentation:

-msoft flottante generare output contenente chiamate di libreria di floating point . Avviso: le librerie richieste non fanno parte di GCC. Normalmente vengono utilizzati i servizi del normale compilatore C della macchina , ma questo non può essere eseguito direttamente nella compilazione incrociata . È necessario disporre delle proprie disposizioni per fornire le funzioni della libreria appropriate per la compilazione incrociata .

Su macchine dove una funzione restituisce risultati virgola mobile nella pila 80387 registro, alcuni virgola mobile codici operativi possono essere emessi anche se -msoft flottante viene utilizzato

Inoltre, non è possibile impostare - mfpmath = unità a "none", deve essere sse, 387 o entrambi.

Tuttavia, in base a this gnu wiki page, vi è fp-soft e ieee. C'è anche SoftFloat.

(Per ARM esiste -mfloat-abi = softfp, ma non sembra che qualcosa di simile sia disponibile per 386 SX).

Non sembra che tcc supporti i numeri in virgola mobile del software.

Buona fortuna per trovare una libreria che funzioni per te.

6

È sorprendente che gcc non supporti questo in modo nativo in quanto il codice è chiaramente disponibile nella sorgente all'interno di una directory denominata soft-fp. E 'possibile compilare manualmente quella libreria:

$ 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 

Ci sono un paio di file C che non compilano a causa di errori, ma la maggior parte si compila. Dopo aver copiato libsoft-fp.a nella directory con i nostri file di origine che ora compilare bene con -msoft-float:

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

Una rapida ispezione utilizzando

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

mostra che come previsto nessun x87 istruzioni in virgola mobile sono chiamati e le piste di codice considerevolmente più lento, di un fattore 8 nel mio esempio che usa molte divisioni.

Nota: avrei preferito per compilare la libreria soft-galleggiante con

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

ma che si traduce in un sacco di messaggi di errore come

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

Sembra come la versione i386 è non ben mantenuto come st(1) punti a uno dei registri x87 che ovviamente non sono disponibili quando si utilizza -msoft-float. Stranamente o per fortuna la versione arm compila bene su un i386 e sembra funzionare bene.