2009-06-19 10 views
8

Est-il (facilement) possible d'utiliser le logiciel à virgule flottante sur i386 linux sans avoir à débourser dans le noyau à chaque appel? Je l'ai essayé -msoft-float, mais il semble que la normale (ubuntu) bibliothèques C ne disposent pas d'une bibliothèque FP inclus:Utilisation du logiciel flottant sur 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 

Répondre

4

Sauf si vous voulez pour amorcer toute votre chaîne d'outils à la main, vous pourriez commence par uclibc toolchain (la version i386, j'imagine) - soft float est (AFAIK) pas directement supporté pour la compilation "native" sur debian et dérivés, mais il peut être utilisé via l'approche "embedded" de la chaîne d'outils uclibc.

+0

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

+0

@Alex Le lien de la chaîne d'outils d'uclibc est cassé. http://uclibc.org/toolchains.html devrait être approprié? – zengr

0

G'day,

À moins que vous une plate-forme ciblant ne pas le soutien intégré FP, je ne peux pas penser à une raison pour laquelle vous voudriez émuler support FP.

Votre plate-forme x386 ne prend-elle pas en charge le FPU externe? Dommage que ce ne soit pas un x486 avec le FPU intégré! D'après mon expérience, toute émulation logicielle est forcément beaucoup plus lente que son équivalent matériel. C'est pourquoi j'ai fini d'écrire un paquet dans Ada pour taguer le FPU intégré 68k au lieu d'utiliser l'émulation douce fournie par le fabricant du compilateur à ce moment-là. Ils ont fini par le regrouper dans leur compilateur.

Editer: Vient de voir votre commentaire ci-dessous. Hmmm, si vous n'avez pas besoin d'une suite complète de prise en charge de la PF, est-il possible de rouler les vôtres pour les quelques fonctions mathématiques dont vous avez besoin? C'est ainsi que le paquet Ada que j'ai mentionné a commencé.

HTH

acclamations,

+3

Nous cherchons à porter un produit sur un processeur x86 intégré, et un certain nombre d'entre eux n'ont pas de FPU. Nous fonctionnons actuellement sur une plateforme sans FPU, mais nous n'encourons pas de pénalités pour piéger le noyau non plus :) – bdonlan

4

GCC ne supporte pas sans quelques bibliothèques supplémentaires. De the 386 documentation:

-msoft-float Générer des appels de bibliothèque contenant sortie pour virgule flottante . Avertissement: les bibliothèques requises ne font pas partie de GCC. Normalement, les fonctionnalités du compilateur C habituel de la machine sont utilisées, mais cela ne peut pas être fait directement dans la compilation croisée . Vous devez effectuer vos propres arrangements pour fournir des fonctions de bibliothèque appropriées pour la compilation croisée .

Sur les machines où une fonction retourne résultats à virgule flottante dans le 80387 pile de registre, un point Floating opcodes peut être émis même si -msoft-flotteur est utilisé

En outre, vous ne pouvez pas définir - mfpmath = unité à "none", ça doit être sse, 387 ou les deux.

Cependant, selon this gnu wiki page, il existe fp-soft et ieee. Il y a également SoftFloat.

(Pour ARM il y a -mfloat-abi = softfp, mais il ne semble pas que quelque chose de similaire soit disponible pour 386 SX).

Il ne semble pas que tcc prend en charge les nombres flottants logiciels.

Bonne chance pour trouver une librairie qui vous convient.

6

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.

Questions connexes