ARM Optimization/fr

From Wiki.ooo4kids.org

Jump to: navigation, search


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)


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:

Linaro_project

Debian

Archlinux

Ubuntu

Pulsar

Assembly Code Optimization

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox