|
| Postscript, PDF | Didier Rémy | Polytechnique, INRIA |
| 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 and HACHA.