programacion - punto flotante ejemplos
En cuanto al indicador de abi de punto flotante utilizado al compilar una aplicaciĆ³n para el objetivo de brazo (2)
Eche un vistazo a la documentación :
-mfloat-abi=name
Especifica qué ABI de coma flotante usar. Los valores permitidos son: ''soft'', ''softfp'' y ''hard''. Al especificar ''soft'', GCC genera resultados que contienen llamadas a bibliotecas para operaciones de coma flotante. ''softfp'' permite la generación de código usando instrucciones de coma flotante de hardware, pero aún usa las convenciones de llamada de flotación suave. ''hard'' permite la generación de instrucciones de punto flotante y utiliza convenciones de llamadas específicas de FPU.
El valor predeterminado depende de la configuración del objetivo específico. Tenga en cuenta que los ABI de flotación rígida y flotación blanda no son compatibles con el enlace; debe compilar todo su programa con el mismo ABI y vincularlo con un conjunto de bibliotecas compatible.
Eso significa que hard
usa instrucciones específicas de coma flotante. soft
no usará esas instrucciones, pero implementará las operaciones de FP como una biblioteca de software.
Finalmente, el softfp
significa que usará las convenciones de llamadas soft
(y otras ABI), es decir, no usará los registros de hardware de FP para pasar o tomar parámetros, pero usará las instrucciones de hardware de FP, si están disponibles.
El soft
y el softfp
son compatibles con el enlace, es decir, usan el mismo ABI, por lo que puede mezclarlos en el mismo programa. Pero hard
usará registros de hardware para pasar argumentos, por lo que no se puede mezclar con los otros dos.
¿Cuál usar? Bueno, eso depende del sistema que estás usando. Las bibliotecas del sistema operativo se compilarán para un ABI u otro, y el compilador nativo simplemente lo usará. Pero si está utilizando un compilador cruzado, puede que necesite especificar el ABI manualmente.
La excepción es que si está utilizando un sistema operativo con ABI soft
, y lo está ejecutando en un hardware que sabe que es capaz de hard-FP, entonces puede compilar sus programas como softfp
y aprovechar esa función sin romper el enlace .
Recientemente escribí aplicaciones c para el objetivo del brazo. Para cruzar la compilación de una aplicación para el objetivo del brazo, había una bandera -mfloat-abi=hard
que debía usarse. Pero en realidad no entendí lo que significa. ¿Alguien puede explicar lo que significa la bandera? ¿Qué cambios hará al compilar la aplicación?
La diferencia radica en la convención de llamadas. ARM utiliza convenciones de llamadas basadas en registros, en las que tanto los argumentos para una función (hasta un límite, después del cual comienzan a derramarse a la pila), como el valor de retorno, se pasan en registros (para conocer los detalles sangrientos, consulte el Procedimiento de llamada estándar ). Cuando se trata de valores de coma flotante, la presencia o no de un coprocesador de FPU de hardware plantea un pequeño acertijo sobre cómo lidiar con los valores de coma flotante, dando dos posibilidades al generar código:
Hard-float : supone que el hardware de punto flotante está presente, y los argumentos de FP y los valores de retorno se pasan en los registros FPU. Es más eficiente cuando tienes una FPU, pero no es portátil para máquinas sin una, donde el código explotaría al intentar acceder a registros que no existen.
Soft-float : los argumentos de punto flotante se pasan en registros de propósito general de la misma manera que los enteros de 32 bits o 64 bits. La función llamada puede transferirlos a registros FPU para hacer su trabajo si tiene soporte de hardware, o recurrir a la emulación de coma flotante si no es así. Por lo tanto, su código puede funcionar en cualquier lugar con el soporte de biblioteca adecuado, a costa de una pequeña sobrecarga incluso en hardware de FPU real (que puede volverse más significativo para funciones triviales).
De eso, probablemente puedas deducir que no puedes mezclar los dos, digamos que puedes compilar una función llamada como soft-float, pero enlazar a una biblioteca hard-float implementando esa función, tu código de llamada podría poner un argumento float en r1
, pero el código de llamada lo buscará en s0
y procederá a calcular las tonterías con el valor de basura que haya allí. Del mismo modo, la función de la biblioteca devolvería un resultado flotante en s0
, pero su código se ejecutaría con lo que sea que haya quedado en r0
y será aún más erróneo.
Por lo tanto, si su cadena de herramientas ofrece librerías hard-float, solo puede vincularlas si compila su código como hard-float, y viceversa. Tenga en cuenta que la magia de multilib significa que una sola cadena de herramientas podría ser compatible con ambas, al tener ambas versiones de cada biblioteca y elegir automáticamente la correcta cuando se vincula.