È 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.
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
@Alex Il collegamento toolchain uclibc è interrotto. http://uclibc.org/toolchains.html dovrebbe essere appropriato? – zengr