Sie sind auf Seite 1von 101

Compiladores

Generacin de Cdigo No
Optimizado
De la Representacin Intermedia a
Cdigo de Mquina

Resumen

Introduccin
Overview de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

Universidad Galileo

Anatoma de un Compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
Representacin Intermedia
Optimizador de Cdigo Intermedio
Representacin Intermedia Optimizada
Generador de Cdigo
Cdigo en Assembler

Anatoma de un Compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
High-level IR
Low-level IR

Representacin Intermedia
Generador de Cdigo
Cdigo en Assembler

Representacin en Formato Intermedio


entry

while (i < v.length && v[i] != 0) {


i = i+1;
}

cbr
<
ldl i len

cbr
!=

stl i
lda

+
ldl i

ldf v

ldf v ldl i

exit

El Generador de Cdigo debe...


Traducir todas las instrucciones en la
representacin intermedia a lenguaje
ensamblador
Asignar espacio para variables, arreglos, etc.
Adherirse a las convenciones de llamado
Crear la informacin simblica necesaria

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

Universidad Galileo

Resumen de un Procesador Moderno


ALU

Memory

Control
Memoria
Registros

Registers

ALU

Control

Arithmetic and Logic Unit


Hace la mayora de operaciones
Con forma:
OP Rdest, Rsrc1, Rsrc2
Operaciones son:
Operaciones aritmticas (add, sub, mul)
Operaciones lgicas (and, sll)
Operaciones de comparacin (seq, sge,
slt)

Memory

Registers

ALU

Control

Arithmetic and Logic Unit


Muchas operaciones aritmticas pueden
causar una excepcin

Memory

overflow y underflow

Puede operar en distintos tipos de datos

8, 16, 32 bits
Aritmtica con y sin signo
Operaciones de punto flotante (ALU separada)
Instrucciones para convertir entre formatos
(cvt.s.d)

Registers

ALU

Control

Control
Maneja la secuencia de Instrucciones
Ejecucin de Instrucciones
Todas las instrucciones estn en
memoria
Fetch de la instruccin a la que apunta
el PC y ejecutarla
Para instrucciones generales,
incrementar el PC para que apunte a la
siguiente posicin de memoria

Memory

Registers

ALU

Control

Control
Saltos no condicionales
Fetch de la siguiente instruccin de una localidad Memory
diferente
Salto incondicional a una direccin dada
Registers ALU
j label
Salto incondicional a una direccin en un registro
jr rsrc
Control
Para manejar llamadas a procedimientos, se hace
un salto incondicional, pero se guarda la
siguiente direccin en la secuencia actual en un
registro
jal label jalr rsrc

Control
Saltos Condicionales
Ejectuamos un test,
si es xitoso, fetch de instrucciones de
una nueva direccin,
de otra forma fetch de la siguiente
instruccin
Las instrucciones son de la forma:
brelop Rsrc1, Rsrc2, label
relop es de la forma:
eq, ne, gt, ge, lt, le

Memory

Registers

ALU

Control

Control
Transferencia de control en casos
especiales (raros)
traps y excepciones
Mecanismo
Guardar la posicin de la siguiente
instruccin (o la actual)
Encontrar la direccin a la que hay que
saltar (de un vector de excepciones)
Saltar a esa posicin

Memory

Registers

ALU

Control

Memory
Espacio de Direcciones plano

Memory

Compuesto de words
Direccionable por bytes

Necesitamos guardar

Programa
Variables locales
Stack
Heap

Registers

ALU

Control

Memory
Stack

locales
(parmetros)

Memory

Registers

Heap
Cdigo Generado

Objetos
Arrays

ALU

Control

Registers
Arquitectura load/store
Todas las operaciones se ejecutan en
registros
Necesitamos mover datos de/a memoria
a/de registros

Memory

Registers

ALU

Control

Importante para rendimiento


Limitados en nmero

Otras Interacciones
Otras operaciones
Input/Output
Operaciones Privilegiadas / seguras
Manejo de hardware especial

Memory

Registers

ALU

TLBs, Caches etc.


Control

La mayora via system calls


Codificadas a mano en assembler
El compilador las puede tratar como una llamada
normal a una funcin

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

19

Universidad Galileo

Las mquinas entienden...


location data
0x4009b0:
0x4009b4:
0x4009b8:
0x4009bc:
0x4009c0:
0x4009c4:
0x4009c8:
0x4009cc:
0x4009d0:
0x4009d4:
0x4009d8:
0x4009dc:
0x4009e0:
0x4009e4:
Oscar Bonilla

3c1c0fc0
279c7640
0399e021
8f998044
27bdffe0
afbf001c
afbc0018
0320f809
2404000a
8fbf001c
8fbc0018
27bd0020
03e00008
00001025
20

Universidad Galileo

Las mquinas entienden...


location data
main:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
[test.c:
Oscar Bonilla

3]
3]
3]
3]
3]
3]
3]
3]
3]
3]
3]
3]
3]
3]

assembly instruction

0x4009b0:
0x4009b4:
0x4009b8:
0x4009bc:
0x4009c0:
0x4009c4:
0x4009c8:
0x4009cc:
0x4009d0:
0x4009d4:
0x4009d8:
0x4009dc:
0x4009e0:
0x4009e4:

3c1c0fc0
279c7640
0399e021
8f998044
27bdffe0
afbf001c
afbc0018
0320f809
2404000a
8fbf001c
8fbc0018
27bd0020
03e00008
00001025
21

lui
addiu
addu
lw
addiu
sw
sw
jalr
li
lw
lw
addiu
jr
move

gp,0xfc0
gp,gp,30272
gp,gp,t9
t9,-32700(gp)
sp,sp,-32
ra,28(sp)
gp,24(sp)
ra,t9
a0,10
ra,28(sp)
gp,24(sp)
sp,sp,32
ra
v0,zero
Universidad Galileo

Programa (character stream)


Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
High-level IR
Low-level IR

Representacin Intermedia
Generador de Cdigo
Cdigo en Assembler

Programa (character stream)


Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
High-level IR
Low-level IR

Representacin Intermedia
Generador de Cdigo
Cdigo en Assembler
Assembler & linker
Binario Ejecutable
Procesador

Lenguaje Ensamblador
Ventajas
Simplifica la generacin de cdigo debido al uso de
instrucciones simblicas y nombres simblicos
Capa de abstraccin lgica
Las arquitecturas pueden ser descritas por un
lenguaje ensamblador
podemos modificar la implementacin
Instrucciones de macro assembler

Desventajas
Proceso adicional de ensamblaje y linking

Lenguaje Ensamblador
Lenguaje de Mquina Reposicionable (object
modules)
Todas las posiciones (direcciones) representadas por
smbolos
Mapeadas a direcciones de memoria en tiempo de linking y
loading
Flexibilidad de compilacin separada

Lenguaje de Mquina Absoluto


Direcciones hard-coded
Implementacin simple y directa
Inflexible difcil de recargar el cdigo generado

Ejemplo de Assembler
item:
.word
1
.text
fib:
subu
$sp, 40
sw $31, 28($sp)
sw $4, 40($sp)
sw $16, 20($sp)
.frame
$sp, 40, $31
#
7
if(n == 0) return 0;
lw $14, 40($sp)
bne $14, 0, $32
move
$2, $0
b
lab2
lab1:
lw $15, 40($sp)
bne $15, 1, $33
li $2, 1
b
lab1
Oscar Bonilla

26

Universidad Galileo

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

27

Universidad Galileo

Compatibilidad
Necesitamos Manejar
Procedimientos mltiples
Llamadas a libreras
Cdigo compilado por otros compiladores, escrito
en lenguajes distintos, assembler escrito a mano

Convenciones de llamado
Layout de memoria
Registros
Stack

Layout de Memoria
Inicio del Stack
Manejo del Heap

0x7fffffff

Stack

locals
(parameters)

free lists

Posicin de inicio
en el segmento de
texto

Heap

Objects
Arrays

Text segment
0x400000

Reserved

Disciplinas de paso de parmetros


Muchos mtodos distintos
Llamada por referencia
Llamada por valor
Llamada por valor-resultado

Cmo pasamos los parmetros?


Por el stack
Por los registros
O una combinacin

20

Registros
No es un registro, hard-wired a la constante 0

0 zero

hard-wired to zero

Registros
Return Address de una llamada (call)
Implicitamente copiada por jal y jalr
0 zero

31 ra

hard-wired to zero

return address

Registros
Frame pointer
Stack pointer
Pointer to global area
0 zero

28
29
30
31

gp
sp
fp
ra

hard-wired to zero

pointer to global area


stack pointer
frame pointer
return address

Registros
Reservado para uso del ensamblador
Se necesita almacenamiento para manejar
instrucciones de assembler compuestas
0 zero
1 at

28
29
30
31

gp
sp
fp
ra

hard-wired to zero
Reserved for asm

pointer to global area


stack pointer
frame pointer
return address

Registros
Retornan los resultados
Copiar el resultado cuando estamos listos para retornar
Usados para evaluar expresiones (si quieren)
0 zero
1 at
2 - 3 v0 - v1

28
29
30
31

gp
sp
fp
ra

hard-wired to zero
Reserved for asm
expr. eval and return of results

pointer to global area


stack pointer
frame pointer
return address

Registros
Primeros cuatro argumentos de una llamada
Se pueden usar para otra cosa si los argumentos no importan
Si hay ms argumentos se pasan por el stack
0
1
2-3
4-7

28
29
30
31

zero
at
v0 - v1
a0 - a3

hard-wired to zero
Reserved for asm
expr. eval and return of results
arguments 1 to 4

gp
sp
fp
ra

pointer to global area


stack pointer
frame pointer
return address

Registros
El resto son temporales
0
1
2-3
4-7

zero
at
v0 - v1
a0 - a3

8 - 25
28
29
30
31

hard-wired to zero
Reserved for asm
expr. eval and return of results
arguments 1 to 4
keep temporary values

gp
sp
fp
ra

pointer to global area


stack pointer
frame pointer
return address

Registros
En una llamada a procedimiento los temporales:
Son guardados por el caller
Son guardados por el callee
Alguna combinacin de ambos
0
1
2-3
4-7

zero
at
v0 - v1
a0 - a3

8 - 25
28
29
30
31

hard-wired to zero
Reserved for asm
expr. eval and return of results
arguments 1 to 4
keep temporary values

gp
sp
fp
ra

pointer to global area


stack pointer
frame pointer
return address

21

Pregunta:
Cules son las ventajas/desventajas de que:
El callee guarde los registros?
El caller guarde los registros?

Qu registros deben ser usados por el caller y


callee si la mitad es guardada por el caller y la
otra mitad es guardada por el callee?
Caller-saved t0 - t9
Calliee-saved s0-s7

Oscar Bonilla

39

Universidad Galileo

Registros
En una llamada a procedimiento los temporales:
Son guardados por el caller
Son guardados por el callee
Alguna combinacin de ambos
0
1
2-3
4-7
8-15
16 - 23
24, 25
28
29
30
31

zero
at
v0 - v1
a0 - a3
t0 - t7
s0 - s7
t8, t9
gp
sp
fp
ra

hard-wired to zero
Reserved for asm
expr. eval and return of results
arguments 1 to 4
caller saved temporary
calliee saved temporary
caller saved temporary
pointer to global area
stack pointer
frame pointer
return address

23

Stack
Guarda los parmetros y las variables locales
Cada invocacin obtiene una nueva copia

Caller tiene que guardar


Cualquier registro caller-saved que tiene un valor
Cualesquiera parmetros pasados
Return address (de cuando se hizo el branch)

Callee tiene que guardar


Direccin anterior del stack pointer
Cualquier registro callee-saved que use

Stack
Direccin del n-simo
argumento es -(n-4)*4*$fp
Variables locales son
constantes positivas de $fp

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area

sp

Stack

Al llamar un nuevo
procedimiento

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

24

fp

Local variables
Stack temporaries
Dynamic area

sp

Stack

Al llamar un nuevo
procedimiento, el caller:

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area

sp

Stack

Al llamar un nuevo
procedimiento, el caller:

push de cualquier t0-t9 que


tenga un valor importante al
stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers

sp

Stack

Al llamar un nuevo
procedimiento, el caller:

push de cualquier t0-t9 que


tenga un valor importante al
stack
poner argumentos 1-4 en
registros a0-a3
push del resto de los
argumentos al stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

sp

Stack

Al llamar un nuevo
procedimiento, el caller:

push de cualquier t0-t9 que


tenga un valor importante al
stack
poner argumentos 1-4 en
registros a0-a3
push del resto de los
argumentos al stack
hacer un jal o jalr

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

sp

Stack

En el procedimiento, el
calliee al principio:

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

25

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

sp

Stack

En el procedimiento, el
calliee al principio :
copiar $sp a $fp

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

fp
sp

Stack

En el procedimiento, el
calliee al principio :
copiar $sp a $fp
push $fp al stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer

fp
sp

Stack

En el procedimiento, el
calliee al principio :
copiar $sp a $fp
push $fp al stack
push $ra al stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address

fp
sp

Stack

En el procedimiento, el
calliee al principio :

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado
en el procedimiento,
guardarlo en el stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp
sp

Stack

En el procedimiento, el
calliee al principio :

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado
en el procedimiento,
guardarlo en el stack
crear espacio para variables
locales en el stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers
Local variables

fp

sp

Stack

En el procedimiento, el
calliee al principio :

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado en
el procedimiento, guardarlo
en el stack
crear espacio para variables
locales en el stack
ejecutar al calliee...

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Dynamic area

sp

Stack

En el procedimiento, el calliee
al final :

...
argument 5
argument 4

26

old frame pointer


return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Dynamic area

sp

Stack

En el procedimiento, el calliee
al final :

poner valores de retorno en v0,v1

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Dynamic area

sp

Stack

En el procedimiento, el calliee
al final :

poner valores de retorno en v0,v1


actualizar $sp usando $fp
($fp+4) + ...

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp
sp

Stack

En el procedimiento, el calliee
al final :

poner valores de retorno en v0,v1


actualizar $sp usando $fp
($fp+4) + ...
Pop los registros callee-saved del
stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp
sp

Stack

En el procedimiento, el calliee
al final :

poner valores de retorno en v0,v1


actualizar $sp usando $fp
($fp+4) + ...
Pop los registros callee-saved del
stack
restaurar $ra del stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers
Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer
return address

fp
sp

Stack

En el procedimiento, el calliee
al final :

poner valores de retorno en v0,v1


actualizar $sp usando $fp ($fp+4)
+ ...
Pop los registros callee-saved del
stack
restaurar $ra del stack
restaurar $fp del stack

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments
old frame pointer

sp

Stack

En el procedimiento, el calliee al
final :
poner valores de retorno en v0,v1
actualizar $sp usando $fp ($fp+4)
+ ...
Pop los registros callee-saved del
stack
restaurar $ra del stack
restaurar $fp del stack
ejecutar jr ra para regresar al
caller

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

sp

Stack

Al regresar de la llamada al
procedimiento, el caller:

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

27

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers
arguments

sp

Stack

Al regresar de la llamada al
procedimiento, el caller:
actualizar $sp para ignorar
argumentos

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers

sp

Stack

Al regresar de la llamada al
procedimiento, el caller:
actualizar $sp para ignorar
argumentos
pop de los registros caller
saved

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area
Caller saved registers

sp

Stack

Al regresar de la llamada al
procedimiento, el caller:
actualizar $sp para ignorar
argumentos
pop de los registros caller
saved
continuar...

...
argument 5
argument 4
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Stack temporaries
Dynamic area

sp

30

Pregunta:
es necesario el $fp?
cules son las ventajas y desventajas de tener
$fp?

Oscar Bonilla

66

Universidad Galileo

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;
else
dx = bx - ax;

retrun dx + dy + dz;
}
}

Oscar Bonilla

67

Universidad Galileo

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;
else
dx = bx - ax;

retrun dx + dy + dz;
}
}

int px, py, pz;

auxmath am;
am.sum3d(px, py, pz, 0, 0, 0);
Oscar Bonilla

68

Universidad Galileo

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;
else
dx = bx - ax;

retrun dx + dy + dz;
}
}

int px, py, pz;


px = 10; py = 20; pz = 30;
auxmath am;
am.sum3d(px, py, pz, 0, 1, -1);
Oscar Bonilla

69

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1

??
??
this
ax (10)
ay (20)
az (30)
??
??
??
??

Dynamic area
Caller saved registers
Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)

Universidad Galileo

fp

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;
else
dx = bx - ax;

retrun dx + dy + dz;
}
}

int px, py, pz;


px = 10; py = 20; pz = 30;
auxmath am;
am.sum3d(px, py, pz, 0, 1, -1);
Oscar Bonilla

70

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1

??
??
this
ax (10)
ay (20)
az (30)
??
??
??
??

Dynamic area
Caller saved registers
Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address

Universidad Galileo

fp
sp

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;
else
dx = bx - ax;

retrun dx + dy + dz;
}
}

int px, py, pz;


px = 10; py = 20; pz = 30;
auxmath am;
am.sum3d(px, py, pz, 0, 1, -1);
Oscar Bonilla

71

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1

??
??
this
ax (10)
ay (20)
az (30)
??
??
??
??

Dynamic area
Caller saved registers
Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)
Universidad Galileo

fp

sp

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

72

Universidad Galileo

Creacin de Expresiones
Algoritmo ingenuo de generacin de cdigo
x = y op z
Seleccionar un registro Rsrc1 (digamos $t0) para cargar el
valor y
Generar instruccin para copiar, si y est:

En otro registro (digamos $t7) add $t0, $t7, zero


Es constante (digamos 1024)
li $t0, 1024
En memoria (digamos que $t7 apunta a y) lw $t0, $t7
En una direccin simblica (digamos lab1) la $t0, lab1

Seleccionar registro Rsrc2 (digamos $t1) y cargar el valor z


Seleccionar registro Rdest (digamos $t2) para guardar x
Hacer la operacin (digamos and)
and $t2, $t1, $t0

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;

??
??
this
ax (10)
ay (20)
az (30)
??
??
??
??
??

Dynamic area
Caller saved registers
Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)
Oscar Bonilla

74

Universidad Galileo

fp

sp

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
class auxmath {
int sum3d(int ax, int ay, int az,
int bx, int by, int bz)
{
int dx, dy, dz;
if(ax > ay)
dx = ax - bx;

add
lw
sub
sw

Oscar Bonilla

??
??
this
ax (10)
ay (20)
az (30)
??address
??
?? src1
?? src2
?? dest

Dynamic area

$t0, $a1, zero


$t1, 0($fp)
$t2, $t0, $t1
$t2, -12($fp)

Caller saved registers


Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)
75

Universidad Galileo

fp

sp

Cuidado
Los temporales son limitados
Cundo el rbol es grande, 18 registros temporales pueden
ser insuficientes asignar espacio en el stack

No hay instruccin de mquina


Puede ser que haya que expandir la operacin intermedia a
mltiples operaciones de mquina

Muy ineficiente
Muchas copias, sumas con cero, etc.
No se preocupen, vamos a arreglarlas en la optimizacin
Mantengan el generador de cdigo muy muy simple

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

77

Universidad Galileo

Generacin de control de flujo


Aplanar la estructura del control
Usar un template

Poner etiquetas nicas para puntos donde el


control se une (join points)
Ahora generamos el cdigo apropiado

38

Template para condicionales


if (test)
true_body
else
false_body
<do the test>
boper , lab_true
<false_body>
j
lab_end
lab_true:
<true_body>
lab_end:

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
if(ax > bx)
dx = ax - bx;
else
dx = bx - ax;

<do test>
boper

..., ..., lab0

??
??
this
ax (10)
ay (20)
az (30)
??address
??
?? src1
?? src2
?? dest

Dynamic area
Caller saved registers

<false body>

Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)

j
lab1
lab0:
<true body>
lab1:
Oscar Bonilla

80

Universidad Galileo

fp

sp

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
if(ax > bx)
dx = ax - bx;
else
dx = bx - ax;

add
lw
bgt

$t0, $a1, zero


$t1, 0($fp)
$t0, $t1, lab0

??
??
this
ax (10)
ay (20)
az (30)
??address
??
?? src1
?? src2
?? dest

Dynamic area
Caller saved registers
<fale body>
j

Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)

lab1

lab0:
<true body>
lab1:
Oscar Bonilla

81

Universidad Galileo

fp

sp

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
if(ax > bx)
dx = ax - bx;
else
dx = bx - ax;

add
lw
bgt
lw
add
sub
sw
j
lab0:

$t0,
$t1,
$t0,
$t0,
$t1,
$t2,
$t2,
lab1

$a1, zero
0($fp)
$t1, lab0
0($fp)
$a1, zero
$t0, $t1
-12($fp)

Dynamic area
Caller saved registers
Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)

<true body>
lab1:
Oscar Bonilla

??
??
this
ax (10)
ay (20)
az (30)
??address
??
?? src1
?? src2
?? dest

82

Universidad Galileo

fp

sp

v0
v1
a0
a1
a2
a3
v0
v1
t0
t1
t2

Programa Ejemplo
if(ax > bx)
dx = ax - bx;
else
dx = bx - ax;

add
lw
bgt
lw
add
sub
sw
j
lab0:
lw
sub
sw
lab1:
Oscar Bonilla

$t0,
$t1,
$t0,
$t0,
$t1,
$t2,
$t2,
lab1
add
$t1,
$t2,
$t2,

$a1, zero
0($fp)
$t1, lab0
0($fp)
$a1, zero
$t0, $t1
-12($fp)

??
??
this
ax (10)
ay (20)
az (30)
??address
??
?? src1
?? src2
?? dest

Dynamic area
Caller saved registers

$t0, $a1, zero


0($fp)
$t0, $t1
-12($fp)
83

Argument 7: bz (-1)
Argument 6: by (1)
Argument 5: bx (0)
old frame pointer
return address
Local variable dx (??)
Local variable dy (??)
Local variable dz (??)
Universidad Galileo

fp

sp

Template para ciclos while


while (test)
body

Template para ciclos while


while (test)
body

lab_cont:
<do the test>
boper , lab_body
j
lab_end
lab_body:
<body>
j
lab_cont
lab_end:

43

Template para ciclos while


while (test)
body

lab_cont:
<do the test>
boper , lab_body
j
lab_end
lab_body:
<body>
j
lab_cont
lab_end:

Una template optimizada


lab_cont:
<do the test>
boper , lab_end
<body>
j
lab_cont
lab_end:

Pregunta:
Cul es la template para?
do
body
while (test)

Oscar Bonilla

87

Universidad Galileo

44

Question:
Cul es la template para?
do
body
while (test)

lab_begin:
<body>
<do test>
boper , lab_begin
Oscar Bonilla

88

Universidad Galileo

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

89

Universidad Galileo

Procedure Call

En el procedimiento, el calliee
al principio :

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado en el
procedimiento, guardarlo en el
stack
crear espacio para variables
locales en el stack
ejecutar al calliee...

Dynamic area
Caller saved registers
arguments
old frame pointer
return address
Calliee saved
registers

fp

Local variables
Dynamic area

sp

46

Procedure Call

En el procedimiento, el calliee
al principio :

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado en el
procedimiento, guardarlo en el
stack
crear espacio para variables
locales en el stack
ejecutar al calliee...

48

Procedure Call

proc_entry:
En el procedimiento, el calliee
add
al principio :
add

copiar $sp a $fp


push $fp al stack
push $ra al stack
si cualquier s0-s7 es usado en el
procedimiento, guardarlo en el
stack
crear espacio para variables
locales en el stack
ejecutar al calliee...

addi
sw
addi
sw

$t0,
$fp,
$sp,
$t0,
$sp,
$ra,

$fp, zero
$sp, zero
$sp, -4
($sp)
$sp, -4
($sp)

Procedure Call
Ejecutar el cuerpo del
procedimiento callee
Acceso a variables
locales y parmetros
como offsets del $fp

proc_entry:
add
add
addi
sw
addi
sw
. . .

$t0,
$fp,
$sp,
$t0,
$sp,
$ra,

$fp, zero
$sp, zero
$sp, -4
($sp)
$sp, -4
($sp)

Procedure Call

proc_entry:
En el procedimiento, el calliee al add
add
final :
addi
poner valores de retorno en v0,v1
sw
actualizar $sp usando $fp ($fp+4) + ...addi
sw
Pop los registros callee-saved del
. . .

stack
restaurar $ra del stack
restaurar $fp del stack
ejecutar jr ra para regresar al caller

$t0,
$fp,
$sp,
$t0,
$sp,
$ra,

$fp, zero
$sp, zero
$sp, -4
($sp)
$sp, -4
($sp)

51

Procedure Call
proc_entry:
add $t0, $fp, zero
add
$fp, $sp, zero
addi
$sp, $sp, -4
sw $t0, ($sp)
addi
$sp, $sp, -4
v0,v1
sw $ra, ($sp)
. . .

En el procedimiento, el calliee al
final :
poner valores de retorno en

actualizar $sp usando $fp ($fp+4) + ...

Pop los registros callee-saved del


add $v0,
stack
lw $sp,
restaurar $ra del stack
restaurar $fp del stack

$t2
-8($fp)
addi
$sp, $sp, -8
lw $ra, ($sp)
addi
$sp, $sp, 4
lw $fp, ($sp)
addi
$sp, $sp, 4
jr $ra

ejecutar jr ra para regresar al caller

Resumen

Introduccin
Resumen de un procesador moderno
Lenguaje de Mquina
Convenciones de Llamado
Generacin de Expresiones
Generacin de Control de Flujo
Generacin de Procedimientos
Linking

Oscar Bonilla

96

Universidad Galileo

Smbolos
Ejecutable es una coleccin
Compilaciones separadas
Libreras linkeadas esttica y dinmicamente

Por lo tanto, no podemos crear una imagen de


memoria en tiempo de compilacin
Fase adicional del linker para juntarlo todo y
crear la imagen final de memoria

Salida del compilador


Crear cdigo objeto con direcciones simblicas
que pueden ser reposicionadas
Direcciones simblicas de todos los datos y
principios de procedimientos que otros
necesitan accesar son exportados
Exportar los nombres de smbolos de
referencias externas

Smbolos exportados por el compilador


Symbols from test.o:
[Index]
[0]|
[1]|
[2]|
[3]|
[4]|
[5]|
[6]|
[7]|
[8]|

Oscar Bonilla

Value
0|
0|
56|
0|
0|
56|
0|
0|
0|

Class
File
Proc
Proc
Global
Proc
Proc
Global
Proc
Global

Type
|ref=6
|end=3 int
|end=5 int
|
|ref=1
|ref=3
|
|
|

99

Section
|Text
|
|Text
|
|Text
|
|Bss
|
|Text
|
|Text
|
|Undefined|
|Undefined|
|Undefined|

Name
test.c
main
fib
internal_var
main
fib
external_var
foo
_gp_disp

Universidad Galileo

Linker
Ver todos los object files para encontrar
smbolos no resueltos
Hacer match de los smbolos y encontrar las
partes necesarias en las libreras
Layout en una sola imagen de memoria
Resolver todos los nombres simblicos a las
direcciones correctas de memoria y offsets
adecuados

Lecturas
Ballena
Captulo 7

Dragn (opcional)
Captulo 9, 10.1, 10.2, 10.3, 10.4

Oscar Bonilla

101

Universidad Galileo

Das könnte Ihnen auch gefallen