¿Cómo maneja el compilador ARM (versión 5) los flotadores de precisión doble en dispositivos cuyo hardware de unidad de punto flotante solo admite precisión simple?

Después de leer el manual de ARM Compiler versión 5 , dice que para los dispositivos sin una unidad de coma flotante, los flotantes se tratan mediante implementaciones de software, lo que probablemente sea más lento que tener una unidad de hardware.

Sin embargo, no pude encontrar ninguna información sobre cómo ARM Compiler 5 se ocuparía de los flotadores de doble precisión en dispositivos con FPU de precisión simple. Mi suposición sería que también usaría una implementación de software como si la FPU no existiera, pero en mi código, intenté ver el desensamblaje, ¡y parece que se están usando las instrucciones específicas de la FPU!

Por ejemplo,

   696:         spectral_line[2] = 6869.955;     /* B */ 
0x0800250A ED9F0B81  VLDR          d0,[pc,#0x204]
0x0800250E ED800B04  VSTR          d0,[r0,#0x10]

este segmento de código ensamblador anterior fue generado por el compilador ARM 5, ¡aunque spectral_linees una matriz de dobles!

¿Cómo/qué está haciendo el compilador aquí para manejar los números de doble precisión?

No sé específicamente sobre ARM, pero muchos procesadores usan una "trampa" o interrupción de software para manejar instrucciones no implementadas. Cuando el procesador ve una instrucción que no está implementada, ejecuta una rutina de servicio de interrupción que determina qué instrucción se intentó y luego proporciona una emulación de software de esa función. Desde la perspectiva de la aplicación, parece que la instrucción no implementada se ejecutó muy lentamente.
Depende de las opciones de compilación: embedartistry.com/blog/2017/10/9/…

Respuestas (1)

¡y parece que se están utilizando las instrucciones específicas de la FPU!

Eso es correcto. Tiene instrucciones de carga y almacenamiento disponibles en las FPU de precisión simple, pero ninguna de las instrucciones de cálculo reales .

Tenga en cuenta que esto puede hacer que algunos cálculos de software sean doublemás lentos, ya que los argumentos de función residirán en la FPU pero deben transferirse de nuevo a los registros de la CPU para poder usarlos .