Aller au contenu | Aller au menu | Aller à la recherche

Incompatibilité entre le code FPU et non-FPU

En essayant de compiler une application qui utilise le FPU, je suis tombé sur un problème embêtant, car j'utilisais une librairie qui n'avait pas de version FPU, mais qui avait une fonction qui retournait une valeur flottante (float, ou double, peu importe).

L'ABI pour le code non-FPU, est de renvoyer la valeur de retour dans d0; Bien sûr, pour le code FPU, la valeur de retour se trouve dans le registre fp0.

Maintenant, si vous compilez votre application pour -m68020-60 (or -m68030 -m68881) et qu'elle est liée avec une bibliothèque qui a une fonction retournant un float ou un double, et qui n'a pas de version FPU (donc liée avec la version 68000 ou 68020 de ladite bibliothèque), votre application a de grandes chances de se comporter bizarrement. Tout cela car la bibliothèque retourne la valeur dans d0, et votre application l'attend dans fp0, et vous vous demandez pendant des heures où est le bug dans votre code (et il n'y en a pas :-)).

Pour faire court:

- application FPU + bibliothèque FPU = OK

- application FPU + bibliothèque non-FPU = OK seulement si aucune fonction de la bibliothèque ne retourne de valeur flottante. Pour celles-ci, grande chance de bug, dûe à la différence d'ABI (registre d0 pour la bibliothèque, registre fp0 pour l'application).

- application non-FPU + bibliothèque FPU = Même problème que au-dessus, dans le sens inverse. Mais cela en pratique n'arrive jamais, puisqu'une application qui est compilée pour m68000 ou m68020, dispose toujours d'une libraire dans cette version.

- application non-FPU + bibliothèque non-FPU = OK.

Que faire?

Ne pas mixer le code FPU et non FPU. Cela signifie qu'il faudrait interdire à gcc (et ou ld) d'utiliser les versions m68000 ou m68020 des bibliothèques quand on compile une application FPU. Le problème est de savoir si c'est possible, et faire ensuite les corrections nécessaires.