vendredi 14 septembre 2012

68060.library (Apollo) (III)

Toujours en regardant de plus près cette 68060.library, je viens de retrouver un nouveau bug !

Et dans une fonction qui patche l'exec.library : R_CachePreDMA. Le bug est d2, il est utilisé mais pas sauvé au préalable dans la pile :

Le fix est simple, il suffit d'ôter le "move.l (a1),d2" puisque d2 est inutilisé ensuite par la routine qui pointe sur a5. De plus, (a1) contient une adresse originale d'une fonction qui va être patchée et n'a aucun intérêt à être chargée dans le datacache.

Explications : L'API d'AmigaOS 68k spécifie seulement d0-d1/a0-a1 en scratch, c'est à dire que tous les autres registres doivent impérativement être sauvés avant utilisation. Il y a quelques exceptions comme par exemple pour R_ObtainSemaphore puisque c'est autorisé par les RKM. En effet, les RKM (documentations développeurs) sont la loi, et tous les coders débutants ou experts doivent la respecter à la lettre sans discuter.

J'en ai profité pour retravailler un peu la librairie : il existe des optimisations toutes simples comme par exemple les "bsr/rts" qui se remplacent par un seul "bra" plus rapide :

Ou encore les "add.l #xx,ax" qui s'optimisent en "lea xx(ax),ax" plus courts et donc plus rapides aussi :

Il y a aussi tous les branchements bcc.l et bcc.w qui peuvent parfois être raccourcis en bcc.w et bcc.b : la librairie est maintenant plus courte de presque 3 Ko (2836 octets pour être exact).

L'auteur original n'avait pas pensé à patcher deux fonctions. En effet pour bien faire les choses, il fallait aussi patcher R_Dispatch et R_Exception qui sont des parties de R_Switch060_Fpu puisque cette dernière est une version spéciale nécessaire pour le 68060 :

Pour finir, OxyPatcher v3.14 a été testé et accélère fort bien les fonctions trigonométriques. En premier les résultats sans lui et avec ensuite :

La nouvelle version de la 68060.library v66.8 est disponible ici.
   

2 commentaires:

Posté vos remarques :