2009-03-02 5 views
3

Pour l'assemblage SPARC en particulier, comment les branches annulées sont-elles différentes des branches régulières?En quoi une branche annulée est-elle différente d'une branche normale?

J'ai toujours pensé que l'annulation des instructions de branchement est nécessaire lorsque j'ai besoin de remplir l'intervalle de retard nop pour les instructions de branchement. Cependant, je ne pense pas que je suis correct sur cette partie, parce que vous pouvez remplir le nop sans annuler la branche.

Répondre

6

L'instruction de branchement annulée provoque l'ignorance de l'instruction dans l'intervalle de délai - l'instruction après la branche - si la branche n'est pas prise.

Pourquoi cela serait-il important? Parce que normalement, l'instruction après la branche est exécutée, même si la branche est prise. C'est parce qu'il y a deux compteurs de programme, PC et NPC. PC, qui indique l'instruction en cours d'exécution, est mis à jour vers NPC, qui est PC + 4, en même temps que NPC est en cours de mise à jour vers la cible de l'instruction de branchement. Donc, en raison de la synchronisation de ces événements, l'instruction suivante doit être chargée. Plutôt que de simplement jeter ce cycle, il est plus rentable d'utiliser ce cycle si nous le pouvons. Nous ferions alors simplement cette instruction partie de la boucle.

loop: someOp     
     someOtherOp 
     branch  loop  ; 
     delayslotOp   ; will actually be executed, before someOp, after branch 

Si nous ne pouvons pas utiliser la fente d'instruction après la branche, nous coller un nop là-dedans, et ne rien faire de ce cycle.

Alors pourquoi avoir des instructions différentes avec les options de branches annulées et non annulées? Pour nous donner le choix de ce qui se passe en sortie de la boucle. Si nous avons fait de la partie de délai de l'activité de boucle, nous ne voulons pas que cette opération soit exécutée en quittant la boucle. Par conséquent, nous ajouterions ", a" à la fin de l'instruction de branchement.

This page has some nice examples.

2

Selon le SPARC Architecture Manual (v9):

3.2.3 Transfert de contrôle

[...]

La plupart des instructions de contrôle de transfert sont retardés; c'est-à-dire que l'instruction qui suit immédiatement une instruction de transfert de commande dans une séquence logique est envoyée avant que le transfert de commande à l'adresse cible ne soit achevé .

[...]

L'instruction suite à une instruction de contrôle de transfert retardé est appelé une instruction de retard . Un bit dans une instruction de transfert de commande retardée (le bit d'annulation) peut entraîner l'annulation de l'instruction de retard (que n'a pas d'effet) si la branche n'est pas prise.

6.3.4 Instructions de contrôle-transfert (CTIS)

[...]

Programmation Remarque: Le bit d'annuler augmente la probabilité qu'un compilateur peut trouver une instruction utile remplir l'intervalle de délai après une branche , réduisant ainsi le nombre d'instructions exécutées par un programme .Par exemple, le bit d'annulation peut être utilisé pour déplacer une instruction à partir d'une boucle afin de remplir l'intervalle de retard de la branche qui ferme la boucle. De même, le bit d'annulation peut être utilisé pour déplacer une instruction de la branche "else" ou "then" d'un bloc "ifthen else" du programme vers l'intervalle de retard de la branche qui sélectionne entre eux. Depuis un ensemble complet de conditions sont fournies, un compilateur peut organiser le code (en inversant éventuellement le sens de la condition) de sorte qu'une instruction de la branche "else" ou de la branche "then" peut être déplacée à Fente de retard.

Le code suivant montre deux branches, dans le premier l'instruction de retard est toujours exécuté, dans le second l'instruction de retard est annulé si la branche ne sont pas prises:

cmp %i3, %i0 
ble %icc, -0x5c 
ld [%l0 - 0x4], %i5 ; executed whether the branch is taken or not 

... 

cmp %l1, 0x80 
bl,a %icc, +0x40 
ld [%fp + 0x7c7], %g2 ; annulled if the branch is not taken, executed otherwise 
Questions connexes