Red de conocimiento informático - Conocimiento informático - Cómo obtener el código fuente de la función de simulación correspondiente a la instrucción de división de punto flotante gcc

Cómo obtener el código fuente de la función de simulación correspondiente a la instrucción de división de punto flotante gcc

VFP (Vector Floating Point)

El módulo Vector Floating Point (VFP) opcional está disponible desde ARMv5. Por supuesto, se pueden utilizar las últimas versiones como Cortex-A8, Cortex-A9 y Cortex-A5. sin Configurar VFP para que los fabricantes de chips lo seleccionen. A lo largo de los años, VFP ha evolucionado a VFPv2 (parte de ARM9/ARM11), VFPv3-D16 (que solo usa 16 registros de punto flotante, por defecto 32) y VFPv3+NEON (como la mayoría de los chips Cortex-A8). Para los chips ARM que contienen NEON, NEON normalmente comparte registros con VFP.

Punto flotante duro

El compilador compilará el código directamente y lo enviará a un coprocesador de punto flotante de hardware (unidad de punto flotante, FPU) para su ejecución, que generalmente tiene un conjunto de puntos adicionales. Los registros se utilizan para el paso y manipulación de argumentos de punto flotante. Por supuesto, el uso de una FPU de hardware real mejorará el rendimiento. Esto se debe a que una única llamada a una función de punto flotante suele tardar varios o docenas de ciclos de reloj.

Operaciones suaves de punto flotante Operaciones suaves de punto flotante

El compilador convierte operaciones de punto flotante en llamadas a funciones y llamadas a bibliotecas para operaciones de punto flotante sin llamar a instrucciones FPU y sin pasar parámetros de registro de punto flotante. El paso de parámetros de punto flotante también se puede realizar mediante registros ARM o la pila. Actualmente, la opción de compilación predeterminada para los sistemas Linux es utilizar aritmética de punto flotante, que puede generar instrucciones ilegales y excepciones incluso si el sistema no tiene unidades procesadoras de punto flotante. Por lo tanto, las imágenes generales del sistema utilizan operaciones suaves de punto flotante para compatibilidad con procesadores sin VFP.

armel y armhf ABI

En armel, existen tres convenciones para operaciones de punto flotante. Tomando gcc como ejemplo, hay tres valores de parámetro -mfloat-abi correspondientes: soft, softfp y hard. soft significa que todas las operaciones de punto flotante se implementan en la capa de software. Por supuesto, la eficiencia no es alta. Habrá conversiones innecesarias de punto flotante a entero y de entero a punto flotante. Solo es adecuado para los primeros procesadores ARM sin punto flotante. unidades de operación; softfp es La configuración predeterminada actual de armel deja los cálculos de punto flotante a la FPU para su procesamiento, pero la transferencia de parámetros de función utiliza registros enteros de propósito general en lugar de registros de FPU. Los registros de punto flotante de FPU se utilizan para transferir parámetros de función; a la FPU para su procesamiento. Tenga en cuenta que en términos de compatibilidad, el software es compatible con los dos últimos modos, pero los modos softfp y hard no lo son. De forma predeterminada, armel usa softfp, por lo que armel en modo difícil se trata como una abi separada llamada armhf. Para una arquitectura como ARM, donde cada ciclo cuenta, estas mejoras son enormes. El uso de armhf puede mejorar el rendimiento de algunas aplicaciones entre un 20% y un 25% sin modificar el código fuente ni la configuración en absoluto. Para programas que dependen en gran medida de operaciones de punto flotante, las mejoras de rendimiento pueden alcanzar hasta el 300%.

Opciones de compilación de punto flotante suave y punto flotante duro

En los parámetros de compilación de CodeSourcery gcc, use -mfloat-abi=name para especificar el manejo de punto flotante. -mfpu=nombre especifica el tipo de coprocesamiento de punto flotante. Los tipos opcionales incluyen fpa, fpe2, fpe3, maverick, vfp, vfpv3, vfpv3-fp16, vfpv3-d16, vfpv3-d16-fp16, vfpv3xd, vfpv3xd-fp16, neon, neon-fp16, vfpv4, vfpv4-d16, fpv4 - sp. -d16, neón-vfpv4, etc. Utilice -mfloat-abi=hard (equivalente a -mhard-float) -mfpu=vfp para compilar opcionalmente en aritmética de punto flotante estricto. Utilice -mfloat-abi=softfp para que sea compatible con implementaciones de hardware y software de VFP de aritmética de punto flotante suave.

El vinculador de tiempo de ejecución ld.so elegirá las unidades de operación al realizar operaciones de punto flotante, si llamará al hardware directamente o a una biblioteca, y si ejecutará libm en /lib o lib/vfp. -mfloat-abi=soft (equivalente a -mhard-float) -mfpu=vfp, seleccione compilar en aritmética de punto flotante estricto. abi=soft (equivalente a -msoft-float) llama directamente a la biblioteca de implementación aritmética de punto flotante suave.