ARM Optimization/fr
Amélioration des performances sur machine de type ARM
Projet EducOOo / Epitech 2011 (voir Amélioration des performances d'OOo4Kids sur machines de type ARM)
- Étudiant : Pédro Moreno
- Mentor : Eric Bachard
Important: Si vous utilisez le contenu de ces pages, n'oubliez pas que celles-ci sont sous Licence CC by-sa, et que vous devez mentionner vos sources...
Assembleur ARM
Cette partie contient des informations provenant de plusieurs sources: Christine Rochange 2006(Université Paul sabatier), Graba Tarik(Telecom Paris tech) et provenant aussi de ARM.com .
Cette partie est destinée à d'autre personnes désirant contribuer à OOo4kids et souhaitant découvrir l'ARM tout en ayant déjà des informations à portée de mains.
Syntaxe d'un fichier source (assembleur)
La mémoire et les registres (propre aux processeurs ARM)
Le jeu d'instruction ARM
L'architecture ARM de type load-store : seules certaines instructions peuvent accéder à la mémoire et transférer une valeur depuis la mémoire vers un registre (load) ou inversement (store). Toutes les autres instructions opèrent sur des registres.
Les instructions de traitement de données
Le 1er registre est celui où le résultat doit être rangé, les 2 registres suivants sont les opérandes.
Opérations mathématiques et logiques
Mnémoniques Opérandes Commentaires ADD r0,r1,r2 @ r0 ← r1 + r2 addition ADC r0,r1,r2 @ r0 ← r1 + r2 + C addition avec Carry SUB r0,r1,r2 @ r0 ← r1 – r2 soustraction SBC r0,r1,r2 @ r0 ← r1 – r2 + C – 1 soustraction avec Carry RSB r0,r1,r2 @ r0 ← r2 – r1 soustraction inversée RSC r0,r1,r2 @ r0 ← r2 – r1 + C – 1 soustraction inversée avec Carry
AND r0,r1,r2 @ r0 ← r1 & r2 ET binaire ORR r0,r1,r2 @ r0 ← r1 | r2 OU binaire EOR r0,r1,r2 @ r0 ← r1 ^ r2 XOR BIC r0,r1,r2 @ r0 ← r1 &~ r2 Met à ’0’ les bits de r1 indiqués par r2
Notes: Les opérations logiques s'appliquent à chacun des 32 bits des opérandes.
Multiplications
Mnémoniques Opérandes Commentaires MUL r0,r1,r2 @ r0 ← (r1 * r2) multiplie r1 par r2
Il y a des différences importantes avec les autres opérations arithmétiques :
- − le second opérande ne peut pas être une valeur immédiate.
- − le registre résultat ne peut pas être identique au premier registre opérande.
- − si il y a le suffixe 'S' est (mise à jour des codes condition), le bit V(CPSR) n'est pas modifié et le bit C est non significatif.
Multiplier entre eux deux entiers sur 32 bits donne un résultat sur 64 bits : les 32 bits de poids faible sont placés dans le registre résultat, les bits de poids fort sont ignorés.
Il est possible d'effectuer une multiplication en utilisant des décalages binaires (voir plus bas).
Mouvements entre registres et comparaisons
Mnémoniques Opérandes Commentaires MOV r0,r2 @ r0 ← r2 copie r2 dans r0 MVN r0,r2 @ r0 ← !r2 copie et negation de r2 dans r0
CMP r1,r2 @ CPSR ← cc(r1 - r2) comparer CMN r1,r2 @ CPSR ← cc(r1 + r2) comparer inversement TST r1,r2 @ CPSR ← cc(r1 et r2) tester les bits indiqués par r1 TEQ r1,r2 @ CPSR ← cc(r1 ⊕ r2) tester l'egalité bits par bits
Notes: Ces instructions (les quatre dernières) ne produisent pas de résultat et ne font que mettre à jour les codes condition dans le CPSR.
Décalage
Il est possible de faire subir un décalage au second opérande avant de lui appliquer une opération.
Exemple:
AND r0,r1,r2,LSL #6 @ r0 ← r1 + r2 * 2^6
r2 subit un décalage de 6 bits vers la gauche donnant un r2'.Ensuite r0 reçoit le résultat de r1 ET binaire r2'.
Les décalages possibles sont :
- - Logical Shift Left = décalage de 0 à 31 positions vers la gauche avec introduction de 0.
- - Logical Shift Right = décalage de 0 à 32 positions vers la droite avec introduction de 0.
- - Arithmetic Shift Left = identique à LSL.
- - Arithmetic Shift Right = décalage de 0 à 32 positions vers la droite avec extension du bit de signe.
- - ROotate Right = décalage de 0 à 32 positions circulaire vers la droite.
- - Rotate Right Eextended = décalage d'une position vers la droite avec introduction du bit Carry.
Notes:Le nombre de positions de décalage peut être spécifié par une constante (précédée de #) ou par un registre.
Mise à jour des codes de conditions
Les opérations de comparaison mettent toujours à jour les codes condition.
Une opération arithmétique, de même que l'instruction CMP ou CMN, met à jour tous les codes de condition.
Une opération logique ou de mouvement entre registres ne met à jour que N et Z (V n'est pas modifié, C non plus, sauf s'il s'agit d'un décalage, auquel cas C reçoit le dernier bit éjecté par le décalage).
Les autres le font si on le demande explicitement en ajoutant le suffixe: S(set condition codes) au mnémonique.
Instructions de transfert
Il existe deux instructions pour déplacer des données entre la mémoire et le processeur:
- - LDR (load) pour charger un registre avec une donnée de 32 bits en mémoire.
- - STR (store) pour enregistrer la valeur sur 32 bits du registre en mémoire.
Adressage indirect via un registre
L'adresse de la donnée est contenu dans un registre appelé registre de base.
Mnémoniques Opérandes Commentaires LDR r0,[r1] @ r0 ← mem<sub>32</sub>[r1] STR r0,[r1] @ mem<sub>32</sub>[r1] ← r0
Notes: C'est la méthode la plus simple.
Transfert d'octets
Il est possible aussi de transférer des octets, avec les instructions LDRB et STRB.
Transferts multiples
Quand on doit transférer plusieurs registres de ou vers la mémoire, on peut le faire en une seule fois avec les instructions LDM et STM. Par exemple :
LDMIA r1,{r0,r2,r5} @ r0 ← mem32[r1]
@ r2 ← mem32[r1+4]
@ r5 ← mem32[r1+8]
La liste des registres de transfert (entre accolades) peut comprendre n'importe quels registres entre r0 et r15. L'ordre de la liste n'a pas d'importance, le transfert se fait de toute façon dans l'ordre croissant des numéros de registres.
Notes :Le suffixe IA (increment after) indique que l'adresse de base doit être incrémentée après le premier accès. D'autres extensions sont possibles : IB (increment before), DA (decrement after) et DB (decrement before).
Adressage de pile
Une pile est une zone de mémoire allouée dynamiquement et gérée en mode "dernier entré, premier sorti". L’ARM dispose des instructions nécessaires pour gérer différents types de piles.
La pile peut (par exemple) être manipulée avec les instructions de transfert multiples suivantes :
STMFD r13!,{r0,r1,r5} @pour empiler
LDMFD r13!,{r0,r1,r5} @pour dépiler
Le point exclamation après r13 indique que r13 doit être mis à jour après le transfert.
Instructions de contrôle de flots
Branchements
La façon la plus courante de rompre une exécution en séquence est d'utiliser une instruction de branchement :
B etiquette
...
etiquette: ...
Quand le processeur atteint le branchement, il continue l'exécution à partir de etiquette au lieu de continuer en séquence (c'est-à-dire au lieu d'exécuter l'instruction qui se trouve à la suite du branchement).
Dans l'exemple ci-dessus, étiquette est après le branchement, donc il s'agit de sauter les instructions qui se trouvent entre les deux. Mais étiquette pourrait aussi bien se situer avant le branchement, et dans ce cas le processeur reprendrait l'exécution en arrière et ré-exécuterait éventuellement les mêmes instructions.
Branchements conditionels
Pour réaliser une boucle, un branchement au début du corps de boucle est nécessaire, mais il ne doit être réalisé que si la condition de boucle est vraie.
Une instruction de branchement conditionnel est associée à une condition (liée aux codes condition contenus dans le registre CPSR), et le branchement n'est réalisé que si la condition est vraie.
MOV r0, #0 @init compteur de boucle (r0)
boucle: CMP r0,#10 @compare le compteur et la borne (10)
BHI sortie @bcht si borne atteinte
... @corps de boucle
ADD r0,r0,#1 @incr. compteur de boucle
B boucle @retour au test
sortie: ... @ sortie de la boucle
Cet exemple montre un branchement conditionnel, BNE (branch if not equal).
Branchements avec lien de retour
Faire un branchement vers une fonction et pouvoir ensuite reprendre l'exécution après le point d'appel. Ceci nécessite de mémoriser l'adresse de retour.
Cette possibilité est présente dans l'assembleur ARM, avec l'instruction BL qui sauvegarde automatiquement l'adresse de retour dans le registre r14.
Par exemple :
principal: BL routine @r14 ← pc + 4 ; pc ← routine
suite: ...
...
routine: ...
MOV pc,r14 @ pc ← r14
Comme l'adresse de retour est rangée dans un registre, un sous-programme ne peut pas en appeler un autre sans avoir sauvegardé son adresse de retour.
Généralement, cette sauvegarde se fait dans la pile. Par exemple :
principal: ...
BL sp1
...
sp1: STMFA r13!,{r14} @ou STR r14,[r13,#4]!
BL sp2
...
LDMFA r13!,{r15} @ou LDR r15,[r13],#4
sp2: ...
MOV r15,r14 @pc ← r14
Liens
- Liens vers des moteurs de developpement sur machine de type ARM: