La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

GENERAZIONE CODICE MACCHINA Daniela Briola Lorena Bellino.

Presentazioni simili


Presentazione sul tema: "GENERAZIONE CODICE MACCHINA Daniela Briola Lorena Bellino."— Transcript della presentazione:

1 GENERAZIONE CODICE MACCHINA Daniela Briola Lorena Bellino

2 Funzione getreg Restituisce la locazione L destinata a ospitare il valore di x nelle istruzioni del tipo x := y op zRestituisce la locazione L destinata a ospitare il valore di x nelle istruzioni del tipo x := y op z Locazioni restituite dalla funzione:Locazioni restituite dalla funzione: – L è il registro che contiene y – L è un registro vuoto – L è un registro occupato – L è la locazione di x

3 Esempio 1/2 d := (a - b) + (a - c) +(a - c)d := (a - b) + (a - c) +(a - c) t := a – b u := a – c v := t + u d := v + u

4 Esempio 2/2 StatementCodegeneratedRegisterdescriptorAddressdescriptor t := a - b MOV a, R0 SUB b, R0 R0 contiene t t in R0 u := a - c MOV a, R1 SUB c, R1 R0 contiene t R1 contiene u t in R0 u in R1 v := t + u ADD R1, R0 R0 contiene v R1 contiene u u in R1 v in R0 d := v + u ADD R1, R0 R0 contiene d d in R0 MOV R0, d d in R0 e in memoria

5 Indici statement i in register Ri i in memoria Mi i nello stack codicecostocodicecostocodicecosto a := b[i] MOV b(Ri), R 2 MOV Mi, R MOV b(R), R 4 MOV Si(A), R MOV b(R), R 4 a[i] := b MOV b, a(Ri) 3 MOV Mi, R MOV b, a(R) 5 MOV Si(A), R MOV b, a(R) 5

6 Istruzioni condizionali Branch conditionBranch condition Condition code: che indicano se lultima quantità calcolata è positiva, negativa o zeroCondition code: che indicano se lultima quantità calcolata è positiva, negativa o zero –Esempio: If x CMP x, yIf x CMP x, y CJ< z CJ< z x := y + z MOV y, R0x := y + z MOV y, R0 if x ADD z, R0 if x > 0 goto w MOV R0, x CJ< z CJ< z CJ> w CJ> w

7 Allocazione e assegnazione registri LocaleLocale –Assegnazione di specifici valori a determinati registri –Più semplice da implementare ma meno efficiente GlobaleGlobale –Registri mantengono i valori per la durata del blocco –Registri riservati alle variabili più utilizzate –Più efficiente ma più complesso da implementare

8 Allocazione e assegnazione registri Risparmi –Utilizzo di x in loop L non preceduto da assegnazione -1 –per ogni blocco di L in cui x è vivo alluscita e gli viene assegnato un valore nel blocco -2 Allocazione di un registro ad una variabile x in un loop L: B L use(x, B) + 2 * live(x, B)(*) Dove: Use(x, B): n° volte in cui x è usato in B prima di ogni definizione di x Live(x, B): 1 se x è viva alluscita di B e gli viene assegnato un valore in B, 0 altrimenti

9 Esempio 1/2 B L use(x, B) + 2 * live(x, B) R0, R1, R2

10 Esempio 2/2 Valutazione di (*) per x = a:Valutazione di (*) per x = a: – B L 2*live(a, B) = 2 – B L use(a, B) = = 2 – B L use(a, B) + 2 * live(a, B) = 4 –Per b, c, d, e, f i valori sono rispettivamente 6, 3, 6, 4, 4 –È ragionevole pensare che R0, R1ed R2 mantengano i valori di a, b, d

11 Rappresentazione di BB tramite dags I dag sono utili strutture per rappresentare i BBI dag sono utili strutture per rappresentare i BB Etichette sui nodi:Etichette sui nodi: –Foglie etichettate da identificatori unici: nomi di variabili o costanti –Nodi interni etichettati da operatori –I nodi possono avere opzionalmente una sequenza di identificatori che rappresentano i corrispondenti valori calcolati

12 Esempio 1.t1 := 4 * i 2.t2 := a[t1] 3.t3 := 4 * i 4.t4 := b[t3] 5.t5 := t2 * t4 6.t6 := prod + t5 7.prod := t6 8.t7 := i i := t7 10.if i <= 20 goto 1.

13 Costruzione dag – Algoritmo 1/3 Input: basic block (BB)Input: basic block (BB) Output: dag rappresentante il BB che contiene le seguenti informazioni:Output: dag rappresentante il BB che contiene le seguenti informazioni: –Unetichetta per ogni nodo –Ad ogni nodo si associa una lista di identificatori Metodo:Metodo: –Struttura dati per rappresentare dag –Lista contenente tutti gli identificatori cui è associato un nodo –Node(y): restituisce nodo con identificatore y –Statement della forma i.x := y op z ii.x := op z iii.x := z

14 Costruzione dag – algoritmo 3/3 1.Se node(y) non è definito, creare una foglia etichettata y, e sia node(y) tale nodo 2.Nel caso (i) determinare se esiste nodo etichettato op con figlio sinistro = node(y) e figlio destro = node(z). Se non esiste creare così un nuovo nodo. Nel caso (ii) determinare se esiste un nodo etichettato op il quale ha come figlio node(y), se non esiste creare così un nuovo nodo. In entrambi i casi, il nodo trovato o creato lo indichiamo con n. Nel caso (iii) n = node(y). 3.Eliminare x dalla lista degli identificatori associati a node(x); appendere x alla lista degli identificatori associati al nodo n e settare node(x) a n.

15 Applicazioni delluso di DAG Individuazione di sottoespressioni comuniIndividuazione di sottoespressioni comuni Stabilire quali identificatori hanno valori usati nel bloccoStabilire quali identificatori hanno valori usati nel blocco Determinare gli statement che calcolano valori che possono essere usati al di fuori del bloccoDeterminare gli statement che calcolano valori che possono essere usati al di fuori del blocco

16 Ristrutturazione dellordine di esecuzione (a + b) – (e – (c + d))(a + b) – (e – (c + d)) BBBB –t1 := a + b –t2 := c + d –t3 := e – t2 –t4 := t1 – t3 MOV a, R0 ADD b, R0 MOV c, R1 ADD d, R1 MOV R0, t1 MOV e, R0 SUB R1, R0 MOV t1, R1 SUB R0, R1 MOV R1, t4

17 Ristrutturazione dellordine di esecuzione Modificando lordine delle istruzioni nel BBModificando lordine delle istruzioni nel BB –t2 := c + d –t3 := e – t2 –t1 := a + b –t4 := t1 – t3 vengono risparmiate due istruzioni MOV c, R0 ADD d, R0 MOV e, R1 SUB R0, R1 MOV a, R0 ADD b, R0 SUB R1, R0 MOV R0, t4

18 Generazione codice ottimale Algoritmo consiste di 2 partiAlgoritmo consiste di 2 parti 1.Etichetta ogni nodo con un intero che denota il più piccolo numero di registri richiesti per valutare lalbero 2.Visita dellalbero il cui ordine è dato dal valore delle etichette calcolato nel passo 1. Il codice di output viene generato durante la visita dellalbero.Il codice di output viene generato durante la visita dellalbero.

19 Algoritmo di etichettatura Foglia sinistra = è un nodo foglia il quale è il discendente più a sinistra del proprio padre. Le altre foglie sono dette foglie destreFoglia sinistra = è un nodo foglia il quale è il discendente più a sinistra del proprio padre. Le altre foglie sono dette foglie destre Letichettatura viene effettuata in una visita bottom-upLetichettatura viene effettuata in una visita bottom-up

20 Algoritmo di etichettatura (1)If n is leaf then (2) if n is the leftmost child of its parent then (3) label(n) := 1 (4) else label(n) := 0 (5)Else begin let l1, l2 be the children of n let l1, l2 be the children of n (6) label(n) = max(l1, l2) se l1 != l2 l1 + 1 l1 == l2 l1 + 1 l1 == l2 end end Nel caso generico, (6) viene sostituita con:Nel caso generico, (6) viene sostituita con: let n 1, … n k be the children on n ordered by label, so label(n 1 ) >= … >= label(n k ) label, so label(n 1 ) >= … >= label(n k ) label(n) := max 1<=i<=k (label(n i ) + i - 1) label(n) := max 1<=i<=k (label(n i ) + i - 1)

21 Algoritmo di etichettatura Ordine: a, b, t1, e, c, d, t2, t3, t4Ordine: a, b, t1, e, c, d, t2, t3, t4

22 Generazione codice da albero etichettato Procedura gencode(n): produce codice macchina valutando i sottoalberi di T con radice n.Procedura gencode(n): produce codice macchina valutando i sottoalberi di T con radice n. rstack: stack utilizzato per allocare i registrirstack: stack utilizzato per allocare i registri tstack: stack utilizzato per allocare locazioni di memoria temporaneatstack: stack utilizzato per allocare locazioni di memoria temporanea swap: procedura che scambia i primi 2 registri sul top di rstackswap: procedura che scambia i primi 2 registri sul top di rstack

23 Generazione codice da albero etichettato Procedure gencode(n); Begin /* case 0 */ If n is a left leaf representing operand name and n is the leftmost child of its parent then print MOV || name || top(rstack) print MOV || name || top(rstack) else if n is an interior node with operator op, left child n1 and right child n2 then /* case 1*/ /* case 1*/ if label(n2) = 0 then if label(n2) = 0 then begin begin let name be the operand represented by n2; gencode(n1); gencode(n1); print op || name ||, || top(rstack) print op || name ||, || top(rstack) end end /*case 2*/ /*case 2*/ else if 1<=label(n1) < label(n2) and label(n1) < r then else if 1<=label(n1) < label(n2) and label(n1) < r then begin begin swap(rstack); gencode(n2); swap(rstack); gencode(n2); R := pop(rstack); /* n2 was evaluated into register R */ R := pop(rstack); /* n2 was evaluated into register R */ gencode(n1); gencode(n1); print op || R ||, || top(rstack); print op || R ||, || top(rstack); push(rstack, R); push(rstack, R); swap(rstack); swap(rstack); end end

24 Generazione codice da albero etichettato /* case 3*/ else if 1 <= label(n2) <= label(n1) and label(n2) < r then else if 1 <= label(n2) <= label(n1) and label(n2) < r then begin begin gencode(n1); gencode(n1); R := pop(rstack); /*n1 was evaluated into register R*/ R := pop(rstack); /*n1 was evaluated into register R*/ gencode(n2); gencode(n2); print op || top(rstack) ||, || R; print op || top(rstack) ||, || R; push(rstack, R); push(rstack, R); end end /* case 4 both labels >= r the total number of register */ /* case 4 both labels >= r the total number of register */ else else begin begin gencode(n2); gencode(n2); T := pop(tstack); T := pop(tstack); print MOV || top(rstack) ||, || T; print MOV || top(rstack) ||, || T; gencode(n1); gencode(n1); push(tstack, T); push(tstack, T); print op || T ||, || top(rstack); print op || T ||, || top(rstack); end end


Scaricare ppt "GENERAZIONE CODICE MACCHINA Daniela Briola Lorena Bellino."

Presentazioni simili


Annunci Google