2009-06-19 16 views
8

¿Es (fácilmente) posible utilizar el software punto flotante en i386 linux sin incurrir en el gasto de atrapar el núcleo en cada llamada? He intentado -msoft-flotador, pero parece que el (ubuntu) bibliotecas de C no tienen una biblioteca normal de FP incluye:Uso de software coma flotante en 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 

Respuesta

4

A menos que usted quiere para arrancar toda su cadena de herramientas a mano, usted podría comience con uclibc toolchain (la versión i386, me imagino) - soft float es (AFAIK) no soportado directamente para la compilación "nativa" en debian y derivados, pero se puede usar a través del enfoque "embedded" de la herramienta uclibc toolchain.

+0

Gracias por la respuesta. Intenté arrancar uclibc usando buildroot pero parece estar ignorando .config. Lo proporcioné en BR2_UCLIBC_CONFIG, al menos para la opción UCLIBC_HAS_FPU:/ – bdonlan

+0

@Alex El enlace de la cadena de herramientas uclibc está roto. http://uclibc.org/toolchains.html debería ser apropiado? – zengr

0

día G,

A menos que estés que apuntan a una plataforma que no tiene soporte incorporado FP, no puedo pensar en una razón por qué te gustaría emular el apoyo FP.

¿Su plataforma x386 no tiene soporte de FPU externo? Lástima que no es un x486 con la FPU integrada.

En mi experiencia, cualquier emulación suave es necesariamente mucho más lenta que su equivalente de hardware.

Es por eso que terminé escribiendo un paquete en Ada para adaptar la FPU incorporada de 68k en lugar de usar la emulación suave proporcionada por el fabricante del compilador en ese momento. Terminaron empacándolo en su compilador como una cuestión de hecho.

Editar: Acabo de ver tu comentario a continuación. Hmmm, si no necesitas un paquete completo de soporte FP, ¿es posible hacer tu propio para las pocas funciones matemáticas que necesitas? Así es como comenzó el paquete Ada que mencioné.

HTH

aplausos,

+3

Estamos considerando la posibilidad de portar un producto a una CPU x86 incrustada, y varios de ellos no tienen una FPU. Actualmente estamos ejecutando una plataforma sin una FPU, pero tampoco incurrimos en penalizaciones por atrapar al kernel :) – bdonlan

4

GCC no soporta esto sin algunas bibliotecas adicionales. De the 386 documentation:

-msoft-flotador generar una salida que contiene llamadas a las bibliotecas para flotar punto. Advertencia: las bibliotecas requeridas no son parte de GCC. Normalmente se utilizan las instalaciones del compilador de C habitual de la máquina , , pero esto no se puede hacer directamente en compilación cruzada. Debe realizar sus propios arreglos para proporcionar funciones de biblioteca adecuadas para compilación cruzada.

en máquinas en una función devuelve resultados de punto flotante en la pila 80387 registro, algunos de coma flotante códigos de operación puede ser emitida incluso si -msoft-flotador se utiliza

Además, no se puede establecer - mfpmath = unidad a "ninguno", tiene que ser sse, 387 o ambos. Sin embargo, de acuerdo con this gnu wiki page, hay fp-soft y ieee. También hay SoftFloat.

(Para ARM hay -mfloat-abi = softfp, pero no parece que algo similar esté disponible para 386 SX).

No parece que tcc sea compatible con los números de coma flotante de software.

Buena suerte para encontrar una biblioteca que funcione para usted.

6

Es sorprendente que gcc no lo admita de forma nativa ya que el código está claramente disponible en la fuente dentro de un directorio llamado soft-fp. Es posible compilar esa biblioteca manualmente:

$ 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 

Hay algunos archivos de C, que no compilan debido a errores, pero la mayoría se compila. Después de copiar libsoft-fp.a en el directorio con los archivos de origen que ahora compilarse bien con -msoft-float:

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

Una rápida inspección utilizando

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

muestra que como se esperaba ningún x87 instrucciones de coma flotante se llama y se ejecuta el código considerablemente más lento también, por un factor de 8 en mi ejemplo, que usa mucha división.

Nota: Hubiera preferido para compilar la biblioteca suave-flotador con

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

pero que se traduce en un montón de mensajes de error como

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

parece que es la versión i386 no bien mantenido como st(1) apunta a uno de los registros x87 que obviamente no están disponibles cuando se usa -msoft-float. Extraña o afortunadamente, la versión arm compila bien en un i386 y parece funcionar bien.

Cuestiones relacionadas