127
Generación de código ( desde Yacc/Bison para la máquina Q ) Generaci´ on de c ´ odigo v0.4 c 2006 Jos´ e Fortes G´ alvez – p.1

Generación de código - serdis.dis.ulpgc.es

  • Upload
    others

  • View
    5

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Generación de código - serdis.dis.ulpgc.es

Generación de código( desde Yacc/Bison para la máquina Q )

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.1 .

Page 2: Generación de código - serdis.dis.ulpgc.es

Notas preliminares

Generar código objeto directamente es más incómodo que

hacerlo desde una representación intermedia porque (1) ha de

adaptarse al momento justo del análisis y (2) a veces no se

dispone de toda la información apropiada.

Lo que se muestra a continuación son sólo ejemplos

ilustrativos: NO son la única posibilidad ni suponen una

implementación coherente pues (1) cada transparencia es

independiente y (2) se han obviado detalles por claridad.

No obstante, no hay grandes diferencias conceptuales entre

generar código para Q o para otra arquitectura (hardware).

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.2 .

Page 3: Generación de código - serdis.dis.ulpgc.es

Esquemas de traducción (1/2)

n + 5

n < 32 n =

do

inst

exp

condwhile inst

↓ L 4: // while: principio

↓ R0=I(0x11ff0); // n: carga

↓ R1=R0<32; // n<32

↓ IF(!R1) GT(5); // while: testa

↓ R0=I(0x11ff0); // n: carga

↓ R0=R0+5; // n+5

↓ I(0x11ff0)=R0; // n: almac.

↓ GT(4); // while: itera

↓ L 5: // while: salida

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.3 .

Page 4: Generación de código - serdis.dis.ulpgc.es

Esquemas de traducción (1/2)

n < 32 n =

do

inst

exp

condwhile inst

n + 5

↓ L 4: // while: principio

↓ R0=I(0x11ff0); // n: carga

↓ R1=R0<32; // n<32

↓ IF(!R1) GT(5); // while: test

↓ R0=I(0x11ff0); // n: carga

↓ R0=R0+5; // n+5

↓ I(0x11ff0)=R0; // n: almac.

↓ GT(4); // while: itera

↓ L 5: // while: salida

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.3 .

Page 5: Generación de código - serdis.dis.ulpgc.es

Esquemas de traducción (1/2)

n < 32 n =

do

inst

exp

condwhile inst

n + 5

↓ L 4: // while: principio

↓ R0=I(0x11ff0); // n: carga

↓ R1=R0<32; // n<32

↓ IF(!R1) GT(5); // while: test

↓ R0=I(0x11ff0); // n: carga

↓ R0=R0+5; // n+5

↓ I(0x11ff0)=R0; // n: almac.

↓ GT(4); // while: itera

↓ L 5: // while: salida

inst : while cond do inst ;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.3 .

Page 6: Generación de código - serdis.dis.ulpgc.es

Esquemas de traducción (1/2)

n < 32 n =

do

inst

exp

condwhile inst

n + 5

↓ L 4: // while: principio

↓ R0=I(0x11ff0); // n: carga

↓ R1=R0<32; // n<32

↓ IF(!R1) GT(5); // while: test

↓ R0=I(0x11ff0); // n: carga

↓ R0=R0+5; // n+5

↓ I(0x11ff0)=R0; // n: almac.

↓ GT(4); // while: itera

↓ L 5: // while: salida

inst : while {$$=ne(); gc("L %d:\n",$$);}cond do {$$=ne(); gc("\tIF(!R%d) GT(%d);\n",$3,$$);}inst {gc("\tGT(%d);\nL %d:\n",$2,$5);}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.3 .

Page 7: Generación de código - serdis.dis.ulpgc.es

Esquemas de traducción (2/2)

do

inst

condwhile inst

docondwhile inst

break

↓ L 4: // while: princ.

↓ · · ·↓ IF(!R1) GT(5); // while: test

↓ L 6: // while: princ.

↓ · · ·↓ IF(!R1) GT(7); // while: test

↓ GT(7); // break

↓ GT(6); // while: itera

↓ L 7: // while: salida

↓ GT(4); // while: itera

↓ L 5: // while: salida

inst : while {$$=ec; ec=ne(); gc("L %d:\n",ec);}cond do {$$=eb; eb=ne(); gc("\tIF(!R%d) GT(%d);\n",$3,eb);}inst {gc("\tGT(%d);\nL %d:\n",ec,eb); ec=$2; eb=$5);}

| break {if(eb) gc("\tGT(%d);\n",eb); else err(21);}

| continue {if(ec) gc("\tGT(%d);\n",ec); else err(22);}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.4 .

Page 8: Generación de código - serdis.dis.ulpgc.es

Declaraciones estáticas

j, = 2

;vars

vars

iint

decl

vars decl;

vars

decl

decl

char c

;

double x

MEM(0x11ffc,4); // i

DAT(0x11ff8,I,2); // j

MEM(0x11ff7,1); // c

MEM(0x11fec,8); // x

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.5 .

Page 9: Generación de código - serdis.dis.ulpgc.es

Declaraciones estáticas

j, = 2

Z=0x12000

0x11ffc

R7=0x11fec

0x11ff7

x

jc

i

0x11ff8

;vars

vars

iint

decl

vars decl;

vars

decl

decl

char c

;

double x

MEM(0x11ffc,4); // i

DAT(0x11ff8,I,2); // j

MEM(0x11ff7,1); // c

MEM(0x11fec,8); // x

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.5 .

Page 10: Generación de código - serdis.dis.ulpgc.es

Declaraciones estáticas

j, = 2

Z=0x12000

0x11ffc

R7=0x11fec

0x11ff7

x

jc

i

0x11ff8

;vars

vars

iint

decl

vars decl;

vars

decl

decl

char c

;

double x

MEM(0x11ffc,4); // i

DAT(0x11ff8,I,2); // j

MEM(0x11ff7,1); // c

MEM(0x11fec,8); // x

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.5 .

Page 11: Generación de código - serdis.dis.ulpgc.es

Declaraciones estáticas

j, = 2

;vars

vars

iint

decl

vars decl;

vars

decl

decl

char c

;

double x

MEM(0x11ffc,4); // i

DAT(0x11ff8,I,2); // j

MEM(0x11ff7,1); // c

MEM(0x11fec,8); // x

decl : vars ’;’ decl | ;

vars : tipo id | vars ’,’ id ’=’ cte ;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.5 .

Page 12: Generación de código - serdis.dis.ulpgc.es

Declaraciones estáticas

j, = 2

;vars

vars

iint

decl

vars decl;

vars

decl

decl

char c

;

double x

MEM(0x11ffc,4); // i

DAT(0x11ff8,I,2); // j

MEM(0x11ff7,1); // c

MEM(0x11fec,8); // x

decl : vars ’;’ decl | ;

vars : tipo id {unsigned int dir=alin(&estat,$1);

ts($2,VAR,EST,$1,dir);

gc("\tMEM(0x%x,%d);\n",dir,bytes($1)); $$=$1;}

| vars ’,’ id ’=’ cte {unsigned int dir=alin(&estat,$1);

ts($3,VAR,EST,$1,dir);

gc("\tDAT(0x%x,%c,%d);\n",dir,inic($1),$5); $$=$1;}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.5 .

Page 13: Generación de código - serdis.dis.ulpgc.es

Expresiones simples

i =

i

exp exp

+exp

2

exp

j

*

exp

;

inst

R0=0x11ffc; // &i

R1=2; // 2

R2=I(0x11ffc); // i

R3=I(0x11ff8); // j

R2=R2*R3; // i*j

R1=R1+R2; // 2+i*j

I(R0)=R1; // i=2+i*j

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.6 .

Page 14: Generación de código - serdis.dis.ulpgc.es

Expresiones simples

i =

i

exp exp

+exp

2

exp

j

*

exp

;

inst

R0=0x11ffc; // &i

R1=2; // 2

R2=I(0x11ffc); // i

R3=I(0x11ff8); // j

R2=R2*R3; // i*j

R1=R1+R2; // 2+i*j

I(R0)=R1; // i=2+i*j

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.6 .

Page 15: Generación de código - serdis.dis.ulpgc.es

Expresiones simples

i =

i

exp exp

+exp

2

exp

j

*

exp

;

inst

R0=0x11ffc; // &i

R1=2; // 2

R2=I(0x11ffc); // i

R3=I(0x11ff8); // j

R2=R2*R3; // i*j

R1=R1+R2; // 2+i*j

I(R0)=R1; // i=2+i*j

inst : var ’=’ exp ’;’ ;

exp : exp ’+’ exp

| exp ’*’ exp

| cte

| var

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.6 .

Page 16: Generación de código - serdis.dis.ulpgc.es

Expresiones simples

i =

i

exp exp

+exp

2

exp

j

*

exp

;

inst

R0=0x11ffc; // &i

R1=2; // 2

R2=I(0x11ffc); // i

R3=I(0x11ff8); // j

R2=R2*R3; // i*j

R1=R1+R2; // 2+i*j

I(R0)=R1; // i=2+i*j

inst : var ’=’ {$$=asig_reg(); gc("\tR%d=0x%x;\n",$$,$1);}exp ’;’ {gc("\tI(R%d)=R%d;\n,$3,$4); lib_regs();}

;

exp : exp ’+’ exp {$$=$1; gc("\tR%d=R%d+R%d;\n",$1,$1,$3); lib_reg($3);}

| exp ’*’ exp {$$=$1; gc("\tR%d=R%d*R%d;\n",$1,$1,$3); lib_reg($3);}

| cte {$$=asig_reg(); gc("\tR%d=%s;\n",$$,$1);}| var {$$=asig_reg(); gc("\tR%d=I(0x%x);\n",$$,$1);};

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.6 .

Page 17: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (1/2)

i − 5

inst

writeln ( exp );

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

STAT(0)STR(0x11ff3,"%d\n");· · ·

CODE(0)· · ·R7=R7-12; // pila param.P(R7+8)=0x11ff3; // par. &"%d\n"R0=I(0x11ffc); // iR1=5; // 5R0=R0-R1; // i-5I(R7+4)=R0; // par. i-5I(R7)=10; // etiq. ret.GT(-12); // putf_()

L 10: R7=R7+12; // lib. param.

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.7 .

Page 18: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (1/2)

inst

writeln ( exp );

i − 5

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

STAT(0)STR(0x11ff3,"%d\n");· · ·

CODE(0)· · ·R7=R7-12; // pila param.P(R7+8)=0x11ff3; // par. &"%d\n"R0=I(0x11ffc); // iR1=5; // 5R0=R0-R1; // i-5I(R7+4)=R0; // par. i-5I(R7)=10; // etiq. ret.GT(-12); // putf_()

L 10: R7=R7+12; // lib. param.

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.7 .

Page 19: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (1/2)

inst

writeln ( exp );

i − 5

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

STAT(0)STR(0x11ff3,"%d\n");· · ·

CODE(0)· · ·R7=R7-12; // pila param.P(R7+8)=0x11ff3; // par. &"%d\n"R0=I(0x11ffc); // iR1=5; // 5R0=R0-R1; // i-5I(R7+4)=R0; // par. i-5I(R7)=10; // etiq. ret.GT(-12); // putf_()

L 10: R7=R7+12; // lib. param.

inst : writeln ’(’ exp ’)’ ’;’ ;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.7 .

Page 20: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (1/2)

inst

writeln ( exp );

i − 5

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

STAT(0)STR(0x11ff3,"%d\n");· · ·

CODE(0)· · ·R7=R7-12; // pila param.P(R7+8)=0x11ff3; // par. &"%d\n"R0=I(0x11ffc); // iR1=5; // 5R0=R0-R1; // i-5I(R7+4)=R0; // par. i-5I(R7)=10; // etiq. ret.GT(-12); // putf_()

L 10: R7=R7+12; // lib. param.

inst : writeln ’(’

{gc("\tR7=R7-12;\n\tP(R7+8)=0x%x;\n",fmt_wrtln);}exp ’)’ ’;’

{$$=ne(); lib_regs();

gc("\tI(R7+4)=R%d;\n\tI(R7)=%d;\n\tGT(-12);\n\tL %d:\tR7=R7+12;\n",$4,$$,$$);}

; Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.7 .

Page 21: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (2/2)

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a

0x00

R7

valor

ret.etiq.

R7+4

&I(R7+4) 0x020x000x000x00

En general, tanto en Q como en C,para el tipo de datos T,

T(dir. Q)nos da el valor correcto, p.e.:

I(R7+4) == 2

Y en general podremos obtener ladirección C con &:

&T(dir. Q) == dir. Cp.e.:scanf("%d%o",&I(R7+4),&R5);

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.8 .

Page 22: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (2/2)

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

+1+2+3dir. C

dir. Q

+1+2+3

// Qlib.c BIBLIOTECA DE Q

· · ·L -12: {//entre llaves por usar variable local p

char *p=inv_str(&U(P(R7+8))); // invierte

printf(p,I(R7+4)); // traslada

reinv_str(p,&U(P(R7+8))); // re-invierte

GT(P(R7)); // retorna

}

· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.8 .

Page 23: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (2/2)

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

+1+2+3dir. C

dir. Q&U

+1+2+3

// Qlib.c BIBLIOTECA DE Q

· · ·L -12: {//entre llaves por usar variable local p

char *p=inv_str(&U(P(R7+8))); // invierte

printf(p,I(R7+4)); // traslada

reinv_str(p,&U(P(R7+8))); // re-invierte

GT(P(R7)); // retorna

}

· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.8 .

Page 24: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (2/2)

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

+1+2+3

dir. Q

dir. C+1+2+3

’%’

’\0’

’d’’\n’

p =

&U

// Qlib.c BIBLIOTECA DE Q

· · ·L -12: {//entre llaves por usar variable local p

char *p=inv_str(&U(P(R7+8))); // invierte

printf(p,I(R7+4)); // traslada

reinv_str(p,&U(P(R7+8))); // re-invierte

GT(P(R7)); // retorna

}

· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.8 .

Page 25: Generación de código - serdis.dis.ulpgc.es

Entrada/salida con Qlib (2/2)

’\0’’\n’’d’’%’

0xf30x1f0x01

0x000x000x000x0a0x000x000x000x020x00

R7

valor

ret.etiq.

+1+2+3dir. C

dir. Q&U

p =+1+2+3

// Qlib.c BIBLIOTECA DE Q

· · ·L -12: {//entre llaves por usar variable local p

char *p=inv_str(&U(P(R7+8))); // invierte

printf(p,I(R7+4)); // traslada

reinv_str(p,&U(P(R7+8))); // re-invierte

GT(P(R7)); // retorna

}

· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.8 .

Page 26: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 27: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

par. rut [1]

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 28: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

par. rut

loc. rut

[1]

[1]

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 29: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

par. rut

par. rut

loc. rut

[1]

[1]

[2]

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 30: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

par. rut

par. rut

loc. rut

loc. rut

[1]

[1]

[2]

[2]

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 31: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

par. rut

loc. rut

[1]

[1]

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 32: Generación de código - serdis.dis.ulpgc.es

Pila de registros de activación

estát.datos

par. main

loc. main

Z

R7

R6

var ...

rut(par) {

loc ...

rut(..);

}

main(par) {

loc ...

rut(..);

}

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.9 .

Page 33: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

n

m

k

10

20

−1

R7

R6

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 34: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

R7

n

m

k

10

20

−1

R6

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 35: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

ret.R7etiq.

enlacedinám.

par. i

par. j

n

m

k

10

20

22

3

−1

R6

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 36: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

ret.R7etiq.

par. i

par. j

n

m

k

10

20

22

3

−1

R6=

enlacedinám.

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 37: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

ret.R7etiq.

par. i

par. j

n

m

k

10

20

3

−1

9

R6=

enlacedinám.

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 38: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

ret.R7etiq.

par. i

par. j

n

m

k

10

20

3

−1

9

R6

enlacedinám.

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 39: Generación de código - serdis.dis.ulpgc.es

Procedimientos (1/3)

n

m

k

10

20

−1

R7

R6

program P;

var k:int;

proced R

(i:int;

var j:int)

begin

i := k+j;

end

proced Q()

var n,m:int;

begin

· · ·R(n+2,m);

· · ·

STAT(0)MEM(0x11ffc,4);// k

CODE(0)// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.10 .

Page 40: Generación de código - serdis.dis.ulpgc.es

Procedimientos (2/3)

endinstsbeginlocs)forms(idproced

proc

proc : proced id ’(’ forms ’)’ locs begin insts end ;

forms : paso id ’:’ tipo ’;’ forms | ;

paso : var | ;

locs : var vars locs | ;

vars : id ’:’ tipo ’;’ | id ’,’ vars ;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.11 .

Page 41: Generación de código - serdis.dis.ulpgc.es

Procedimientos (2/3)

forms

paso i:int ;

j:int ;paso

forms

forms

var

proc

instslocsproced R ( ) begin end

// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

proc : proced id ’(’ {param=8; local=0;}

forms ’)’ locs begin

{$$=ne(); ts($2,PROC,$$,alinp(&param,0),$5);

gc("L %d:\tR6=R7;\n\tR7=R7-%d",$$,$7);}insts {gc("\tR7=R6;\n\tR6=P(R7+4);\n\tR5=P(R7);\n\tGT(R5);\n");}end

;Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.11 .

Page 42: Generación de código - serdis.dis.ulpgc.es

Procedimientos (2/3)

paso i:int ;

j:int ;paso

forms

forms

forms

var

proc

begin insts endlocs)(Rproced

// proced RL 1: R6=R7; // nva base

R7=R7-0; // localesR0=R6+8; // &iR1=I(0x11ffc); // kR2=P(R6+12); // &jR2=I(R2); // jR1=R1+R2; // k+jI(R0)=R1; // i=k+jR7=R6; // lib localesR6=P(R7+4); // recup baseR5=P(R7); // etiq retGT(R5); // retorna

forms : paso id ’:’ tipo ’;’ {$$=alinp(&param,$4);}

forms {$$=ts($2,PAR,$1,$4,$6,$7);}

| {$$=NIL;}

;

paso : var {$$=REF;}

| {$$=VAL;}

;Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.11 .

Page 43: Generación de código - serdis.dis.ulpgc.es

Procedimientos (3/3)

vars

vars

:m int ;

,n

var

proc

proced Q ( ) begin endlocsforms

locs

insts

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

locs : var vars locs | ;

vars : id ’:’ tipo ’;’ {ts($1,VAR,LOC,$3,alin(&local,$3); $$=$3;}

| id ’,’ vars {ts($1,VAR,LOC,$3,alin(&local,$3); $$=$3;}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.12 .

Page 44: Generación de código - serdis.dis.ulpgc.es

Procedimientos (3/3)

;actsR

,acts

proc

proced Q ( ) begin endforms insts

)(

locs

exp

exp

n+2

m

// proced QL 2: · · ·

R7=R7-16; // paramR0=I(R6-8); // nR0=R0+2; // n+2I(R7+8)=R0; // par 1oR0=R6-4; // &mI(R7+12)=R0; // par 2oP(R7+4)=R6; // base actP(R7)=3; // etiq retGT(1); // invoca R

L 3: R7=R7+16; // lib param· · ·

inst : id ’(’ { gc("\tR7=R7-%d;\n",tam_par($1)); $$=par($1);} acts ’)’

{$$=ne(); gc("\tP(R7+4)=R6;\n\tP(R7)=%d;\n\tGT(%d);\nL %d:\t\R7=R7+%d;\n",$$,etiq($1),$$,tam_par($1));} ’;’ ;

acts : exp {gc("\tI(R7+%d)=$1;\n",dir_par($0)); $$=sig_par($0);}

| acts ’,’ exp {gc("\tI(R7+%d)=$1;\n",dir_par($1)); $$=sig_par($1);}

; Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.12 .

Page 45: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0 R6

R7

Z

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 46: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R6

R7

Z

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 47: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R6

R7

Z

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 48: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R6R7

Z

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 49: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R6

R7

Z

P1

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 50: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R6

R7

Z

P2

P1

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 51: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R7R6

Z

P3

P2

P1

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 52: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R7

R6

Z

P3

P2

P1

P3

P2

P1

P0

Q2

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 53: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R7

R6

Z

P2

P3

P2

P1

P3

P2

P1

P0

Q2

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 54: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R7R6

Z

P3

P2

Q2

P3

P2

P1

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 55: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (1/3)

P2

P3

Q2

P1

P0

R7R6

Z

P3

P3

P2

Q2

P3

P2

P1

P3

P2

P1

P0

program P0;

1→ var ...

1→ procedure P1;

1→ 2→ var ...

1→ 2→ procedure Q2; forward;

1→ 2→ procedure P2;

1→ 2→ 3→ var ...

1→ 2→ 3→ procedure P3;

1→ 2→ 3→ 4→ var ...

1→ 2→ 3→ 4→ begin ... end;

1→ 2→ 3→ begin ... end;

1→ 2→ procedure Q2;

1→ 2→ 3→ var ...

1→ 2→ 3→ begin ... end;

1→ 2→ begin ... end;

1→ begin ... end.Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.13 .

Page 56: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (2/3)

ret.etiq.

i10

j

9

R7−2

R6

enlaceestát.enlacedinám.

· · ·procedure P1;

var i:integer;

procedure Q2;

forward;

procedure P2;

var j:integer;

procedure P3;

begin{P3}

· · ·i := j;

Q2;

end{P3};

begin{P2}

· · ·j := -2;

P3;

· · ·end{P2};

begin{P1}

· · ·

// procedure P3L 4: R6=R7; // nva base

R7=R7-0; // locales· · ·R0=P(R6+8); // P2R0=P(R0+8); // P1R0=R0-4; // &i en P1R1=P(R6+8); // P2R1=I(R1-4); // j en P2I(R0)=R1; // i=j;R7=R7-12; // paramR0=P(R6+8); // P2R0=P(R0+8); // P1P(R7+8)=R0; // enl estátP(R7+4)=R6; // base actP(R7)=5; // etiq retGT(2); // invoca Q2

L 5: · · ·// procedure P2L 3: · · ·

P(R0)=-2; // j=-2R7=R7-12; // paramP(R7+8)=R6; // enl estátP(R7+4)=R6; // base actP(R7)=7; // etiq retGT(4); // invoca P3

L 7: · · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.14 .

Page 57: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (2/3)

ret.etiq.

ret.etiq.

i10

j

9

7R7

−2R6

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

· · ·procedure P1;

var i:integer;

procedure Q2;

forward;

procedure P2;

var j:integer;

procedure P3;

begin{P3}

· · ·i := j;

Q2;

end{P3};

begin{P2}

· · ·j := -2;

P3;

· · ·end{P2};

begin{P1}

· · ·

// procedure P3L 4: R6=R7; // nva base

R7=R7-0; // locales· · ·R0=P(R6+8); // P2R0=P(R0+8); // P1R0=R0-4; // &i en P1R1=P(R6+8); // P2R1=I(R1-4); // j en P2I(R0)=R1; // i=j;R7=R7-12; // paramR0=P(R6+8); // P2R0=P(R0+8); // P1P(R7+8)=R0; // enl estátP(R7+4)=R6; // base actP(R7)=5; // etiq retGT(2); // invoca Q2

L 5: · · ·// procedure P2L 3: · · ·

P(R0)=-2; // j=-2R7=R7-12; // paramP(R7+8)=R6; // enl estátP(R7+4)=R6; // base actP(R7)=7; // etiq retGT(4); // invoca P3

L 7: · · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.14 .

Page 58: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (2/3)

ret.etiq.

ret.etiq.

i10

j

9

7

−2

R7R6=

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

· · ·procedure P1;

var i:integer;

procedure Q2;

forward;

procedure P2;

var j:integer;

procedure P3;

begin{P3}

· · ·i := j;

Q2;

end{P3};

begin{P2}

· · ·j := -2;

P3;

· · ·end{P2};

begin{P1}

· · ·

// procedure P3L 4: R6=R7; // nva base

R7=R7-0; // locales· · ·R0=P(R6+8); // P2R0=P(R0+8); // P1R0=R0-4; // &i en P1R1=P(R6+8); // P2R1=I(R1-4); // j en P2I(R0)=R1; // i=j;R7=R7-12; // paramR0=P(R6+8); // P2R0=P(R0+8); // P1P(R7+8)=R0; // enl estátP(R7+4)=R6; // base actP(R7)=5; // etiq retGT(2); // invoca Q2

L 5: · · ·// procedure P2L 3: · · ·

P(R0)=-2; // j=-2R7=R7-12; // paramP(R7+8)=R6; // enl estátP(R7+4)=R6; // base actP(R7)=7; // etiq retGT(4); // invoca P3

L 7: · · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.14 .

Page 59: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (2/3)

ret.etiq.

ret.etiq.

ret.etiq.

i−2

j

R7

9

7

5

−2

R6

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

· · ·procedure P1;

var i:integer;

procedure Q2;

forward;

procedure P2;

var j:integer;

procedure P3;

begin{P3}

· · ·i := j;

Q2;

end{P3};

begin{P2}

· · ·j := -2;

P3;

· · ·end{P2};

begin{P1}

· · ·

// procedure P3L 4: R6=R7; // nva base

R7=R7-0; // locales· · ·R0=P(R6+8); // P2R0=P(R0+8); // P1R0=R0-4; // &i en P1R1=P(R6+8); // P2R1=I(R1-4); // j en P2I(R0)=R1; // i=j;R7=R7-12; // paramR0=P(R6+8); // P2R0=P(R0+8); // P1P(R7+8)=R0; // enl estátP(R7+4)=R6; // base actP(R7)=5; // etiq retGT(2); // invoca Q2

L 5: · · ·// procedure P2L 3: · · ·

P(R0)=-2; // j=-2R7=R7-12; // paramP(R7+8)=R6; // enl estátP(R7+4)=R6; // base actP(R7)=7; // etiq retGT(4); // invoca P3

L 7: · · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.14 .

Page 60: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (2/3)

ret.etiq.

ret.etiq.

ret.etiq.

i−2

j

R7

9

7

5

−2

R6

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

enlaceestát.enlacedinám.

· · ·procedure P1;

var i:integer;

procedure Q2;

forward;

procedure P2;

var j:integer;

procedure P3;

begin{P3}

· · ·i := j;

Q2;

end{P3};

begin{P2}

· · ·j := -2;

P3;

· · ·end{P2};

begin{P1}

· · ·

// procedure P3L 4: R6=R7; // nva base

R7=R7-0; // locales· · ·R0=P(R6+8); // P2R0=P(R0+8); // P1R0=R0-4; // &i en P1R1=P(R6+8); // P2R1=I(R1-4); // j en P2I(R0)=R1; // i=j;R7=R7-12; // paramR0=P(R6+8); // P2R0=P(R0+8); // P1P(R7+8)=R0; // enl estátP(R7+4)=R6; // base actP(R7)=5; // etiq retGT(2); // invoca Q2

L 5: · · ·// procedure P2L 3: · · ·

P(R0)=-2; // j=-2R7=R7-12; // paramP(R7+8)=R6; // enl estátP(R7+4)=R6; // base actP(R7)=7; // etiq retGT(4); // invoca P3

L 7: · · ·

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.14 .

Page 61: Generación de código - serdis.dis.ulpgc.es

Rutinas locales (3/3)

repetirn− p− 1veces Ri=P(Ri+8);

Ri=P(R6+8);

· · ·Ri=P(Ri+8);

// r.a. nivel n− 1// r.a. nivel n− 2

// r.a. nivel p· · ·

Código de nivel n para obtener la base del registrode activación de nivel p:

n = p: ya en R6

n > p:

Alternativa: pila-vector de enlaces (display)

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.15 .

Page 62: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);R7

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;R0=d;I(R7)=R0;R7=R7−4;R2=c;R1=b;R0=&a;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 63: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&aR7

R0R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;R0=d;I(R7)=R0;R7=R7−4;R2=c;R1=b;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 64: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&aR7

bR1

R0R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;R0=d;I(R7)=R0;R7=R7−4;R2=c;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 65: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&aR7

b

cR2

R1

R0R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;R0=d;I(R7)=R0;R7=R7−4;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 66: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

cR2

R1R7

R0=d;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;R7=R7−4;I(R7)=R0;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 67: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

dR0

R2

R1R7R2=R2*R0;

R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R7=R7−4;I(R7)=R0;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;R1=e;I(R7)=R1;R7=R7−4;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 68: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

dR0

R2R7

R1=e;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 69: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d

e

R0

R1

R2R7

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;R2=f;I(R7)=R2;R7=R7−4;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 70: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d

e

R0

R1

R7

R2=f;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 71: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d

e

f

R0

R1

R2

R7

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 72: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d

e*f

R0

R1

R7

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R7=R7+4;R2=I(R7);R0=R0+R1;R1=R1*R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 73: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d+e*fR0R7

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R7=R7+4;R2=I(R7);

R1=R1*R2;R0=R0+R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 74: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c

d+e*fR0

R2R7

R2=I(R7);R7=R7+4;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 75: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)R2R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 76: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)R2

R0 g

R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 77: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)R2

R0 g

R1 h

R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 78: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)

R0 g

R1 h

R7

R2=i;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 79: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)

R0 g

R1 h

R2 i

R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 80: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)

R0 g

R1 h*i

R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 81: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)

R0 g+h*iR7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 82: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)

R0 g+h*i

R2R7

R2=I(R7);R7=R7+4;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 83: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)*(g+h*i)R2R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 84: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b

c*(d+e*f)*(g+h*i)R2

R7R1

R1=I(R7);R7=R7+4;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 85: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&a

b+c*(d+e*f)*(g+h*i)R1R7R0=&a;

R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;

R0=I(R7);

I(R0)=R1;R7=R7+4;

R1=I(R7);R7=R7+4;R1=R1+R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 86: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);

&aR7

b+c*(d+e*f)*(g+h*i)R1

R0

R7=R7+4;

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;

I(R0)=R1;

R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 87: Generación de código - serdis.dis.ulpgc.es

Derramado de registros

a=b+c*(d+e*f)*(g+h*i);R7

R0=&a;R1=b;R2=c;

R0=d;

R1=e;

R2=f;

R7=R7−4;I(R7)=R0;

R7=R7−4;I(R7)=R1;

R7=R7−4;I(R7)=R2;

R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;

R2=R2*R0;R0=g;R1=h;R7=R7−4;I(R7)=R2;R2=i;R1=R1*R2;R0=R0+R1;R2=I(R7);R7=R7+4;R2=R2*R0;R1=I(R7);R7=R7+4;R1=R1+R2;R0=I(R7);R7=R7+4;I(R0)=R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.16 .

Page 88: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

return a+b*( d+e*(f+g)c +h*i);

R7

z( , )

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R6

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 89: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

return a+b*( d+e*(f+g)c +h*i);

R7R0 a

z( , )

R6

R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 90: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

return a+b*( d+e*(f+g)c +h*i);

a

bR1

R0R7

z( , )

R6

R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 91: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

a

bR7

return a+b*( d+e*(f+g)c +h*i);

R6

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 92: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

R0 c

R6

R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 93: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

R6

R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 94: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

R6

R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d; R0

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 95: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e

R6

R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d; R0R1=e;

R1

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 96: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e

f

R6

R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d; R0R1=e;

R1R2=f;

R2

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 97: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e

f

R6

R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;

R1R2=f;

R2R7=R7−4;I(R7)=R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 98: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e

f

g

R6

R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;

R1R2=f;

R2R7=R7−4;I(R7)=R0;R0=g;

R0

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 99: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e

f+g

R6

R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;

R1R2=f;

R0R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 100: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e*(f+g)

R6

R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;

R0R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 101: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d

e*(f+g)

R6

R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;

R0R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;

R1

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 102: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d+e*(f+g)

R6R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;

R0

R0=R1+R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 103: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d+e*(f+g)

R6

R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 104: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d+e*(f+g)

enl. est.

etiq. ret.2

R6

GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 105: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d+e*(f+g)

enl. est.

etiq. ret.2

reg. act. z()

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);

R6

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 106: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

c

d+e*(f+g)

enl. est.

etiq. ret.2

R6

GT(1);

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

L 2: R7=R7+16;

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 107: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))

R6

R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 108: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))

h

R6

R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0R1=h;

R1

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 109: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))

h

i

R6

R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0R1=h;

R1

R2=i;

R2

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 110: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))

h*i

R6

R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0R1=h;

R1

R2=i;R1=R1*R2;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 111: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))+h*i

R6

R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0R1=h;R2=i;R1=R1*R2;R0=R0+R1;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 112: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7a

b

return a+b*( d+e*(f+g)c +h*i);

z(c,d+e*(f+g))+h*i

R6

R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:

R0R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;

R1

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 113: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7a

return a+b*( d+e*(f+g)c +h*i);

b*(z(c,d+e*(f+g))+h*i)

R6

R1=I(R7);R7=R7+4;R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;

R0

R0=R1*R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 114: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7a

return a+b*( d+e*(f+g)c +h*i);

b*(z(c,d+e*(f+g))+h*i)

R6

R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;

R0

R0=R1*R0;R1=I(R7);R7=R7+4;

R1

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 115: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

R7

return a+b*( d+e*(f+g)c +h*i);

a+b*(z(c,d+e*(f+g))+h*i)

R6

R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;

R0

R0=R1+R0;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 116: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

return a+b*( d+e*(f+g)c +h*i);

a+b*(z(c,d+e*(f+g))+h*i)

R6

R6=P(R7+4);R5=P(R7);GT(R5);

R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;

R0

R0=R1+R0;R7=R6;

R7=

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 117: Generación de código - serdis.dis.ulpgc.es

Salvado de registros

return a+b*( d+e*(f+g)c +h*i);

a+b*(z(c,d+e*(f+g))+h*i)

R7R0=a;R1=b;R7=R7−4;I(R7)=R0;R7=R7−4;I(R7)=R1;

, )z(

R0=c;R7=R7−4;I(R7)=R0;R0=d;R1=e;R2=f;R7=R7−4;I(R7)=R0;R0=g;R0=R2+R0;R0=R1*R0;R1=I(R7);R7=R7+4;R0=R1+R0;

R7=R7−4;I(R7)=R0;R7=R7−8;P(R7+4)=R6;P(R7)=2;GT(1);R7=R7+16;L 2:R1=h;R2=i;R1=R1*R2;R0=R0+R1;R1=I(R7);R7=R7+4;R0=R1*R0;R1=I(R7);R7=R7+4;

R0

R0=R1+R0;R7=R6;R6=P(R7+4);R5=P(R7);GT(R5);

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.17 .

Page 118: Generación de código - serdis.dis.ulpgc.es

Gestión de registros

Estructura global enlazando pila de registros ocupados:int ult(): Devuelve i en cima

int nvo(): Si pila llena, genera R7=R7-4;I(R7)=Rk; para k en fondo, que se extrae. Push de klibre. Devuelve k

op(char *x): Pop da j. Si queda vacía, generaRi=I(R7); R7=R7+4; t.q. i 6= j; si no, otro pop da i.Push de k libre. Genera Rk=RixRj;

vac(char b): Si b, genera salvado. Vacía la pila

k = 0 si R0 libre (asegura resultado último en R0).Innecesario pasar registros en $$.Registros de distintos tipos: ¡“heap” local en lugar de pila!

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.18 .

Page 119: Generación de código - serdis.dis.ulpgc.es

Formaciones [arrays] (1/2)

&V[i]

&V[a] = &V

&V[0] = &V0

&V[b]

t

Vectores

V[a:b] of T

t = tam_alin(T)

&V0 = &V− a× t

&V[i] = &V0 + i× t

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.19 .

Page 120: Generación de código - serdis.dis.ulpgc.es

Formaciones [arrays] (1/2)

&M[i1, i2]

&M[i1, a2]

&M[i1, 0]

&M[i1, b2]

&M[b1, b2]

&M = &M[a1, a2]

&M0 = &M[0, 0]

t1 t2

Matrices por filas [row-major]

M[a1:b1,a2:b2] of T

t1 = t× (b2 − a2 + 1)

t2 = t

&M0 = &M− a1t1 − a2t2

&M[i1, i2] = &M0 + i1t1 + i2t2

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.19 .

Page 121: Generación de código - serdis.dis.ulpgc.es

Formaciones [arrays] (1/2)

Caso general: n dimensiones por “filas”

F[a1:b1,· · ·,an:bn] of T

tn = t tk = tk+1 × (bk+1 − ak+1 + 1)

&F0 = &F−n∑

k=1

aktk

&F[i1, · · · , in] = &F0 +n∑

k=1

iktk

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.19 .

Page 122: Generación de código - serdis.dis.ulpgc.es

Formaciones [arrays] (2/2)

int m[5,10];· · ·m[i,j+1]=-1;

FIL(0x11f38,200,0); // int m[5,10]...R0=I(0x11ffc); // iR0=R0*40; // vector 1oR1=I(0x11ff8); // jR1=R1+1; // j+1R1=R1*4; // vector 2oR0=R0+R1; // posic [i,j+1]R0=R0+0x11f38; // &m[i,j+1]I(R0)=-1; // m[..]=-1;

vars : tip id ’[’ {tp=$1;} rangs ’]’ ’;’

{unsigned int dir=alin(&estat,$5); ts($2,VAR,EST,$5,dir);

gc("\tFIL(0x%x,%d,0);\n",dir,bytes($5));};

rangs : cte {$$=ts(_,TIP,VECT,tp,$1*bytes(tp));}

| cte ’,’ rangs {$$=ts(_,TIP,VECT,$3,$1*bytes($3));}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.20 .

Page 123: Generación de código - serdis.dis.ulpgc.es

Formaciones [arrays] (2/2)

int m[5,10];· · ·m[i,j+1]=-1;

FIL(0x11f38,200,0); // int m[5,10]...R0=I(0x11ffc); // iR0=R0*40; // vector 1oR1=I(0x11ff8); // jR1=R1+1; // j+1R1=R1*4; // vector 2oR0=R0+R1; // posic [i,j+1]R0=R0+0x11f38; // &m[i,j+1]I(R0)=-1; // m[..]=-1;

acc : id ’[’ inds ’]’ {gc("\tR%d=R%d+0x%x\n",ult(),ult(),dir($1));} ;

inds : exp

{$$=elem(tipo($-1)); gc("\tR%d=R%d*%d\n",ult(),ult(),bytes($$));}| inds ’,’ exp

{$$=elem($1); gc("\tR%d=R%d*%d\n",ult(),ult(),bytes($$)); op("+");}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.20 .

Page 124: Generación de código - serdis.dis.ulpgc.es

Registros y uniones

c CMP 0

i CMP 0d CMP 0u TIP UN 8v CMP 4j CMP 12s TIP ST 16t VAR 0x11ff0

struct s {

char c;

union u {

int i;

double d;

} v;

int j;

} t;

· · ·t.v.i=-1;

FIL(0x11ff0,16,0); // t...R0=0x11ff4; // &t.v.iI(R0)=-1; t.v.i=-1;

tipo : su id ’{’ {$$=0;} campos ’}’ {$$=ts($2,TIP,$1,$4,$5);} ;

su : STRUCT {$$=ST;} | UNION {$$=UN;} ;

campos : {$$=NULL;} campo {$$=$2;} | campos campo {$$=$2;} ;

campo : tipo id ’;’ {if ($-4==UN) if (bytes($1)>$-1) $-1=bytes($1);

$$=ts($2,CMP,$1,($-4==UN)?0:alinp(&$-1,$1),$0);}

;Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.21 .

Page 125: Generación de código - serdis.dis.ulpgc.es

Registros y uniones

c

i

j

svd

&t=0x11ff0

struct s {

char c;

union u {

int i;

double d;

} v;

int j;

} t;

· · ·t.v.i=-1;

FIL(0x11ff0,16,0); // t...R0=0x11ff4; // &t.v.iI(R0)=-1; t.v.i=-1;

acc : id sel {gc("\tR%d=0x%x\n",nvo(),dir($1)+$2.pos);} ;

sel : sel ’.’ id {$$.ts=tc($1.ts,$3); $$.pos=$1.pos+dir($$.ts);}

| {$$.ts=tipo($0); $$.pos=0;}

;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.21 .

Page 126: Generación de código - serdis.dis.ulpgc.es

Punteros y variables dinámicas

p: ptr int;new(p);· · ·pˆ:=-1;

R7=R7-8; // parámsI(R7+4)=4; // 4 bytesP(R7)=5; // dir. ret.GT(-11); // invoca new()

L 5: R7=R7+8; // liberaP(R6+8)=R0; // p...R0=P(R6+8); // pI(R0)=-1; // pˆ=-1

vars : id ’:’ PTR tip ’;’

{int d=alin(&local,$$=ts(_,TIP,PTR,$4,4)); ts($1,VAR,LOC,$$,d);}

;

inst : NEW ’(’ var ’)’ ’;’

{int et=ne(); gc("\tR7=R7-8;\n\tI(R7+4)=%d;\tP(R7)=%d;\n\\tGT(-11);\nL %d:\tR7=R7+8;\n\tP(R6+%d)=R0;\n",bytes(tipo($3)),et,et,dir($3));}

;

acc : var ’ˆ’ {gc("\tR%d=P(R6+%d);\n",nvo(),dir($1));} ;

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.22 .

Page 127: Generación de código - serdis.dis.ulpgc.es

Expresiones complejas

double f() {...}struct {int *p, i;} v[3];...*v[(int)f(3+2)].p=2.1+v[2].i;

FIL(0x11fe8,24,0); // v...R7=R7-12; // parámsI(R7+8)=5; // 3+2I(R7+4)=R6; // enl. din.P(R7)=4; // dir. ret.GT(1); // invoca f()

L 4: R7=R7+12; // liberaR0=RR0; // (int)IF(R0<0) GT(-3); // cheq. lím. inf.IF(R0>=3) GT(-3); // cheq. lím. sup.R0=R0*8; // pos v[..]R0=R0+0x11fe8; // &v[..]==&v[..].pR0=P(R0); // v[..].pR1=I(0x11ffc); // v[2].iRR0=2.1+R1; // 2.1+v[2].iI(R0)=RR0; // = conv. forz.

Generacion de codigo v0.4 c©2006 Jose Fortes Galvez – p.23 .