|
Postscript, PDF | Didier Rémy | Polytechnique, INRIA |
Cours (super, self) | Exercises |
Cours (super, self) | Exercises |
|
|
· | La sélection des instructions dépend des conventions d'appel. |
· | Elle utilise au besoin de nouveaux temporaires. |
· | L'allocation des registres tiendra compte de ces temporaires et minimisera les mouvements de registres autour des appels. |
|
· | Génerer les meilleures combinaisons d'instructions possibles |
· | En fonction des conventions d'appel, générer les prologues et les épilogues des fonctions. |
· | Choisir définitivement les instructions, |
· | Sans fixer le choix des registres (laissé à l'allocateur). |
|
'^'
suivi d'un code
'd'
pour destination et 's'
pour source et d'un chiffre i
indiquant qu'il s'agit du i-ème registre destination ou source.
Ainsi, par exemple, "add ^d0, ^s0, ^s1"
est une représentation
compacte de la fonction:
|
|
décode inst src dest
retourne une instruction
dans laquelle les registres formels destination et sources ont été
substitués par des registres réels src
et dest
.
|
|
· | Cette information est utilisée par l'allocateur de registres; |
· | Leurs temporaires seront in fine associés à de vrais registres. |
|
|
|
|
|
|
|
|
|
L'allocation de registres identifiera si besoin t' et t1. Il ne faut surtout pas chercher à le faire ici. |
|
|
|
|
|
|
|
|
|
|
|
|
|
ra
et zero
.
Autre choix:
|
|
... | |||
16 | local 2 | ||
Frame f | 12 | local 1 | |
Size 5 | 8 | libre | ¬¾ nombre maximun d'arguments(a) |
4 | arg. 6 de g | arg. 6 à l'addresse sp + 4 | |
0 | arg. 5 de g | ¬¾ sp | |
Frame g | : | ||
Size s | : | arg. 6 de g à l'addresse sp + s + 4 | |
: | ¬¾ sp |
|
· | Placer les premiers arguments dans les registres conventionnels, puis dans la pile. |
· | Appeler la fonction. |
· | Récupérer si besoin le résultat dans le registre conventionnel. |
|
· | arg_in_reg est la liste des registres conventionnels utilisés.
|
· | trashed_by f est la liste des registres écrasés par l'appel à f .
|
|
|
arg_reg
,
trash_by f
qui incluent
les registres spéciaux utilisés
dans le prologue et l'épilogue, les registres pour passer les arguments et le
résultat, ceux sauvés par l'appelant (donc non sauvés par l'appelé).
|
· | On le reconnaît ``au passage'' à son étiquette. |
· | On connait le comportement exact de la primitive
(les registres lus et écrits). |
|
|
$ra
).
|
|
· | l'argument de f est calculé dans un temporaire tf (vue de l'appelant) et transféré dans a0 avant l'appel à g. |
· | à l'entrée de g la valeur de a0 est placée dans un temporaire tg (vue de l'appelé). |
|
· | ce n'est pas toujours nécessaire. |
· | il ne faut sauver que les registres réellement utilisés. |
· | Les transferts inutiles seront annulés par l'allocateur de registres
(en identifiant le temporaire et le registre). |
· | Si nécessaire, le temporaire sera placé en pile par l'allocateur de
registres. |
|
|
|
|
|
|
imortal_registers
qui survivent à l'appel:
· | Les registres callee-saved si, qui viennent d'être résuscités y compris ra, c'est ce qui forcera leur sauvegarde en cas d'utilisation. |
· | les registres spéciaux (globaux) |
|
|
|
|
|
|
s0
)This document was translated from LATEX by HEVEA.