mercredi 11 septembre 2019

_TransformVector (AQ2)

Un nouveau mini cours à but éducatif avec la petite routine utilisant cette fois la Fpu _TransformVector d'AmiQuake2 et même de Quake 1 puisqu'elles sont identiques :

Commençons déjà par _DotProduct.

La version produite par gcc est catastrophique comme bien souvent, avec un code pesant 60 octets :

Une simple petite loop toute conne et nous voilà avec du code moins obèse, à maintenant 34 octets, économisant ainsi du précieux code cache ! Deux versions sont possibles avec un bne et un bcs, ce dernier étant bien utile pour la suite... Le fmove.s avec le d0 sera arrondi automatiquement à zéro par le processeur. Bref, rien de bien compliqué.

Bien sûr, les minuscules routines comme cette _DotProduct doivent être inlinées, et voici une routine trouvée sur le net :

Routine intéressante, mais me chagrinant tout de même : les deux fmovem.x sont couteux en cycles Fpu et la routine dans son ensemble pèse tout de même 148 octets.

Voici donc une autre approche en utilisant toujours les boucles :

Résultat : 70 octets avec une belle cerise à la fin !

Là encore tout est très simple, il s'agit de grouper trois loops en changeant d'in dans a1 à chaque fois. Le barillet dans d0 coordonne le tout :
  1. %011 = les 3 loops du _DotProduct pour _vright
  2. %1 = la 2ème loop pour _vup
  3. %011 = les 3 loops pour _vup
  4. %0= accès à la 3ème loop pour _vpn
  5. %11 = les 3 loops pour _vpn
La très belle astuce est dans le dernier bne utilisant toujours le même code condition que le précédent bcs. Bref, les deux horribles fmovem.x ont disparus et la routine dans son ensemble est bien plus mince.

Voilà, j'espère que cet exemple vous donnera envie d'apprendre l'assembleur 68k. J'avais d'ailleurs commencé des cours ici qui vous donneront quelques bases.