mercredi 8 octobre 2014

Belle astuce

Je suis toujours en train de travailler sur un projet utilisant un atMega328 et je regarde régulièrement le code assembleur généré par le compilateur. Aujourd'hui je suis tombé sur un morceau de code assembleur qui m'a laissé perplexe. A prime abord ça ne semblais rimé à rien! En le relisant avec attention j'ai fini par comprendre, voici le code assembleur en question tel que je l'ai commenté. Une variable de 8 bits est chargée dans le registre R24. R24 est additionnée à lui-même, puis mis à zéro par l'instruction eor r24, r24. Ensuite on additionne encore R24 à lui-même, avant d'enregistrer le résultat dans une autre variable. Si on ne porte très attention à ce qui ce passe c'est plutôt étonnant, mais en fait c'est une belle astuce pour faire ceci:


// code C original
  vms.var[15]=(vms.var[x]&128)>>7;
Donc R24 est additionné avec lui-même avec l'instruction adc r24, r24. Si le bit 7 de r24 était à 1 avant cette opération le Carry bit sera à 1 après l'addition. On met r24 à zéro et ensuite on additionne r24+r24+Carry. Donc si le carry est à 1 r24 = 1 sinon il égal 0. C'est ce qu'on voulais avoir dans vms.var[15], c'est à dire l'état du bit 7 de vms.var[x].

Beaucoup de travail d'optimisation a été fait sur ce compilateur. Bravo! à ces créateurs.