Il est surprenant que gcc ne le supporte pas nativement car le code est clairement disponible dans la source dans un répertoire appelé soft-fp
. Il est possible de compiler cette bibliothèque manuellement:
$ 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
Il y a quelques fichiers c qui ne compilent pas en raison d'erreurs, mais la majorité ne compile. Après avoir copié libsoft-fp.a
dans le répertoire avec nos fichiers sources compilent maintenant bien avec -msoft-float
:
$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L.
Une inspection rapide à l'aide
$ objdump -D --disassembler-options=intel a.out | less
montre que comme prévu sans x87 instructions à virgule flottante sont appelés et les pistes de code considérablement plus lent aussi, par un facteur de 8 dans mon exemple qui utilise beaucoup de division.
Note: j'aurais préféré compiler la bibliothèque soft-float avec
$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c
mais qui se traduit par des charges de messages d'erreur comme
adddf3.c: In function '__adddf3':
adddf3.c:46: error: unknown register name 'st(1)' in 'asm'
On dirait que la version i386
est pas bien maintenu comme st(1)
points à l'un des registres x87 qui ne sont évidemment pas disponibles lors de l'utilisation -msoft-float
. Étrangement ou heureusement la version arm
compile bien sur un i386
et semble fonctionner très bien.
Merci pour la réponse. J'ai essayé d'amorcer uclibc en utilisant buildroot mais il semble ignorer le .config que je lui ai fourni sous BR2_UCLIBC_CONFIG, au moins pour l'option UCLIBC_HAS_FPU:/ – bdonlan
@Alex Le lien de la chaîne d'outils d'uclibc est cassé. http://uclibc.org/toolchains.html devrait être approprié? – zengr