segment iv roadmap lecture 8: unoptimized code...

15
1 Fall 2002 Lecture 8: Unoptimized Code Lecture 8: Unoptimized Code Lecture 8: Unoptimized Code Lecture 8: Unoptimized Code Generation Generation Generation Generation From the intermediate representation to the machine code Saman Amarasinghe 2 6.035 ©MIT Fall 2001 Segment IV Roadmap • Checkpoint – On Week 8 / Day 2 – Hand-in a tarball of what you have – If you get codegen to work, no effect – If you have problems at end, we will be very harsh if you haven’t done much work by the checkpoint Paper discussion – Canceled – Only 3 paper discussion for the semester Saman Amarasinghe 3 6.035 ©MIT Fall 2001 Outline • Introduction Machine Language Overview of a modern processor Procedure Abstraction Procedure Linkage Guidelines in Creating a Code Generator 5 Saman Amarasinghe 4 6.035 ©MIT Fall 2001 Anatomy of a compiler Intermediate Code Optimizer Code Generator Optimized Intermediate Representation Assembly code Semantic Analyzer Intermediate Representation Lexical Analyzer (Scanner) Syntax Analyzer (Parser) Token Stream Parse Tree Program (character stream) Saman Amarasinghe 5 6.035 ©MIT Fall 2001 Anatomy of a compiler Code Generator Intermediate Representation Assembly code High-level IR Lexical Analyzer (Scanner) Syntax Analyzer (Parser) Token Stream Parse Tree Program (character stream) Low-level IR Semantic Analyzer Saman Amarasinghe 6 6.035 ©MIT Fall 2001 Intermediate Representation while (i < v.length && v[i] != 0) { i = i+1; } entry ldl i len < cbr stl i exit ldf v lda 0 != cbr ldf v ldl i ldl i 0 +

Upload: others

Post on 24-Mar-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

1

Fall 2002

Lecture 8: Unoptimized CodeLecture 8: Unoptimized CodeLecture 8: Unoptimized CodeLecture 8: Unoptimized CodeGenerationGenerationGenerationGeneration

From the intermediate representation to the machine

code

Saman Amarasinghe 2 6.035 ©MIT Fall 2001

Segment IV Roadmap

• Checkpoint– On Week 8 / Day 2– Hand-in a tarball of what you have– If you get codegen to work, no effect– If you have problems at end, we will be very

harsh if you haven’t done much work by the checkpoint

• Paper discussion – Canceled– Only 3 paper discussion for the semester

Saman Amarasinghe 3 6.035 ©MIT Fall 2001

Outline

• Introduction• Machine Language • Overview of a modern processor• Procedure Abstraction• Procedure Linkage• Guidelines in Creating a Code Generator

5

Saman Amarasinghe 4 6.035 ©MIT Fall 2001

Anatomy of a compiler

Intermediate Code Optimizer

Code GeneratorOptimized Intermediate Representation

Assembly code

Semantic AnalyzerIntermediate Representation

Lexical Analyzer (Scanner)

Syntax Analyzer (Parser)Token Stream

Parse Tree

Program (character stream)

Saman Amarasinghe 5 6.035 ©MIT Fall 2001

Anatomy of a compiler

Code GeneratorIntermediate Representation

Assembly code

High-level IR

Lexical Analyzer (Scanner)

Syntax Analyzer (Parser)Token Stream

Parse Tree

Program (character stream)

Low-level IR

Semantic Analyzer

Saman Amarasinghe 6 6.035 ©MIT Fall 2001

Intermediate Representation

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

}

entry

ldl i len

<

cbr

stl iexit

ldf v

lda 0

!=

cbr

ldf v ldl ildl i 0

+

Page 2: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

7Machine Code Generator OutlineShould... • Translate all the instructions in the • Introduction

intermediate representation to assembly • Machine Language language • Overview of a modern processor

• Allocate space for the variables, arrays etc. • Procedure Abstraction • Procedure Linkage

• Adhere to calling conventions • Guidelines in Creating a Code Generator • Create the necessary symbolic information

Saman Amarasinghe 7 6.035 ©MIT Fall 2001 Saman Amarasinghe 8 6.035 ©MIT Fall 2001

Machines understand... location data

0x4009b0: 3c1c0fc0

0x4009b4: 279c7640

0x4009b8: 0399e021

0x4009bc: 8f998044

0x4009c0: 27bdffe0

0x4009c4: afbf001c

0x4009c8: afbc0018

0x4009cc: 0320f809

0x4009d0: 2404000a

0x4009d4: 8fbf001c

0x4009d8: 8fbc0018

0x4009dc: 27bd0020

0x4009e0: 03e00008

0x4009e4: 00001025

Machines understand...

location instruction

data assembly

main:

[test.c: 3] 0x4009b0: 3c1c0fc0 lui gp,0xfc0

[test.c: 3] 0x4009b4: 279c7640 addiu gp,gp,30272

[test.c: 3] 0x4009b8: 0399e021 addu gp,gp,t9

[test.c: 3] 0x4009bc: 8f998044 lw t9,-32700(gp)

[test.c: 3] 0x4009c0: 27bdffe0 addiu sp,sp,-32

[test.c: 3] 0x4009c4: afbf001c sw ra,28(sp)

[test.c: 3] 0x4009c8: afbc0018 sw gp,24(sp)

[test.c: 3] 0x4009cc: 0320f809 jalr ra,t9

[test.c: 3] 0x4009d0: 2404000a li a0,10

[test.c: 3] 0x4009d4: 8fbf001c lw ra,28(sp)

[test.c: 3] 0x4009d8: 8fbc0018 lw gp,24(sp)

[test.c: 3] 0x4009dc: 27bd0020 addiu sp,sp,32

[test.c: 3] 0x4009e0: 03e00008 jr ra

[test.c: 3] 0x4009e4: 00001025 move v0,zero 10 6.035 ©MIT Fall 2001Saman Amarasinghe 9 6.035 ©MIT Fall 2001 Saman Amarasinghe

Saman Amarasinghe 11 6.035 ©MIT Fall 2001

Intermediate Representation

Program (character stream)

Code Generator Assembly code

High-level IR

Lexical Analyzer (Scanner)

Syntax Analyzer (Parser) Token Stream

Parse Tree

Low-level IR

Intermediate Code Generator

Saman Amarasinghe 12 6.035 ©MIT Fall 2001

Intermediate Representation

Program (character stream)

Code Generator Assembly code

High-level IR

Lexical Analyzer (Scanner)

Syntax Analyzer (Parser) Token Stream

Parse Tree

Low-level IR

Intermediate Code Generator

Assembler & linker Binary executable

Processor

2

Page 3: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Assembly language • Advantages

– Simplifies code generation due to use of symbolic instructions and symbolic names

– Logical abstraction layer – Multiple Architectures can describe by a single

assembly language ⇒ can modify the implementation

• macro assembly instructions

• Disadvantages – Additional process of assembling and linking – Assembler adds overhead

Saman Amarasinghe 13 6.035 ©MIT Fall 2001

11

Assembly example .data

item:.word 1.text

fib:subu $sp, 40sw $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, $32move $2, $0b lab2

lab1:lw $15, 40($sp)bne $15, 1, $33

$2, 1b lab1

Saman Amarasinghe 15 6.035 ©MIT Fall 2001

Saman Amarasinghe 17 6.035 ©MIT Fall 2001

Overview of a modern processor

• ALU • Control • Memory • Registers

Memory

Registers ALU

Control

Assembly language

• Relocatable machine language (object modules) – all locations(addresses) represented by symbols – Mapped to memory addresses at link and load time – Flexibility of separate compilation

• Absolute machine language – addresses are hard-coded – simple and straightforward implementation – inflexible -- hard to reload generated code – Used in interrupt handlers and device drivers

Saman Amarasinghe 14 6.035 ©MIT Fall 2001

11

Outline

• Introduction • Machine Language • Overview of a modern processor • Procedure Abstraction • Procedure Linkage • Guidelines in Creating a Code Generator

Saman Amarasinghe 16 6.035 ©MIT Fall 2001

Saman Amarasinghe 18 6.035 ©MIT Fall 2001

Arithmetic and Logic Unit

• Performs most of the data operations

• Has the form: OP Rdest, Rsrc1, Rsrc2

• Operations are: – Arithmetic operations (add, sub, mulo) – Logical operations (and, sll) – Comparison operations (seq, sge, slt)

Memory

Registers

Control

ALU

3

li

Page 4: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 19 6.035 ©MIT Fall 2001

Arithmetic and Logic Unit

• Many arithmetic operations can cause an exception – overflow and underflow

• Can operate on different data types – 8, 16, 32 bits – signed and unsigned arithmetic – Floating-point operations

(separate ALU) – Instructions to convert between formats

(cvt.s.d)

Memory

Registers

Control

ALU

Saman Amarasinghe 20 6.035 ©MIT Fall 2001

Control

• Handles the instruction sequencing • Executing instructions

– All instructions are in memory – Fetch the instruction pointed by the

PC and execute it – For general instructions, increment

the PC to point to the next location in memory

Memory

Registers ALU

Control

Saman Amarasinghe 21 6.035 ©MIT Fall 2001

Control • Unconditional Branches

– Fetch the next instruction from a different location

– Unconditional jump to an address j label

– Unconditional jump to an address in a register jr rsrc

– To handle procedure calls, do an unconditional jump, but save the next address in the current stream in a register jal label jalr rsrc

Memory

Registers ALU

Control

Saman Amarasinghe 22 6.035 ©MIT Fall 2001

Control • Conditional Branches

– Perform a test, if successful fetch instructions from a new address, otherwise fetch the next instruction

– Instructions are of the form: brelop Rsrc1, Rsrc2, label

– relop is of the form: eq, ne, gt, ge, lt, le

Memory

Registers ALU

Control

Saman Amarasinghe 23 6.035 ©MIT Fall 2001

Control • Control transfer in special (rare)

cases – traps and exceptions – Mechanism

• Save the next(or current) instruction location

• find the address to jump to from an exception vector)

• jump to that location

Memory

Registers ALU

Control (

18

When to use what?

• Give an example where each of the branch instructions can be used

1. j label 2. jal label 3. jr rsrc

4. jalr rsrc

5. beq Rsrc1, Rsrc2, label

Saman Amarasinghe 24 6.035 ©MIT Fall 2001

4

Page 5: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 25 6.035 ©MIT Fall 2001

Memory

• Flat Address Space – composed of words – byte addressable

• Need to store – Program – Local variables – Global variables and data – Stack – Heap

Memory

Registers ALU

Control

Saman Amarasinghe 26 6.035 ©MIT Fall 2001

Memory

Memory

Registers ALU

Control

Stack

Generated Code

Heap Objects Arrays

locals (parameters)

Saman Amarasinghe 27 6.035 ©MIT Fall 2001

Registers

• Load/store architecture – All operations are on register values – Need to bring data in-to/out-of

registers

• Important for performance – limited in number

ALU

Control

Memory

Registers

Saman Amarasinghe 28 6.035 ©MIT Fall 2001

Other interactions

• Other operations – Input/Output – Privilege / secure operations – Handling special hardware

• TLBs, Caches etc.

• Mostly via system calls – hand-coded in assembly – compiler can treat them as a normal function call

ALU

Control

Memory

Registers

The MIPS ISA and MIPS Processor

• One of the earliest RISC processors – Has evolved from 1980’s – ISA has also evolved

• Always backward compatible, I.e. add more to the ISA • MIPS-I, MIPS-II….MIPS-V

– Many processor incarnation • From a simple 5-stage pipeline

to an out-of-order superscalar • R2000, R4000, R8000, R10000 …..

• You will be generating code for it Saman Amarasinghe 29 6.035 ©MIT Fall 2001

Diversity of Processors

• General Purpose Processors – x86, PowerPC, MIPS R4000, HP PA-RISC, Alpha

• Digital Signal Processors (DSP) – TI 56000

• Supercomputing Processors – Cray

• Embedded Processors – StrongARM

• Network Processors Saman Amarasinghe 30 6.035 ©MIT Fall 2001

5

Page 6: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

22

Diversity of Processors Outline • Diversity in execution • Introduction

– VLIW, Superscalar, Vector, Systolic Arrays • Machine Language

• Diversity in the memory system • Overview of a modern processor – Multiple memories in DSPs • Procedure Abstraction – register windows in SPARC • Procedure Linkage

• Different/unique ISAs • Guidelines in Creating a Code Generator • Different goals/markets

– All out performance in supercompuers – Maximum energy savings in embedded

processors Saman Amarasinghe 31 6.035 ©MIT Fall 2001 Saman Amarasinghe 32 6.035 ©MIT Fall 2001

Procedure Abstraction Procedure Abstraction • Requires system-wide compact

– Broad agreement on memory layout, protection, resource • In practical terms it leads to... allocation calling sequences, & error handling

– Must involve architecture (ISA), OS, & compiler – multiple procedures

• Provides shared access to system-wide facilities – library calls – Storage management, flow of control, interrupts – compiled by many compilers, written in different – Interface to input/output devices, protection facilities, timers, languages, hand-written assembly

synchronization flags, counters, … • Establishes the need for a private context

• For the project, we need to worry about – Create private storage for each procedure invocation – Memory layout – Encapsulate information about control flow & data – Registers

abstractions – Stack The procedure abstraction is a social contract (Rousseau)

Saman Amarasinghe 33 6.035 ©MIT Fall 2001 Saman Amarasinghe 34 6.035 ©MIT Fall 2001

Memory Layout Parameter passing disciplines 0x7fffffff

• Start of the stack locals • Many different methods • Heap management

(parameters) – call by reference – free lists – call by value

• starting location in – call by value-result

the text segment Objects Arrays

Stack

Heap

Data segment

Text segment

Reserved

0x400000

Saman Amarasinghe 35 6.035 ©MIT Fall 2001 Saman Amarasinghe 36 6.035 ©MIT Fall 2001

6

Page 7: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

25

Parameter Passing Disciplines A = 10; Call foo(A)

Subroutine foo(B) B = B + 1 B = B + A

• Call by value A is ??? • Call by reference A is ??? • Call by value-result A is ???

Saman Amarasinghe 37 6.035 ©MIT Fall 2001

Parameter passing disciplines

• Many different methods – call by reference – call by value – call by value-result

• How do you pass the parameters? – via. the stack – via. the registers – or a combination

Saman Amarasinghe 39 6.035 ©MIT Fall 2001

Saman Amarasinghe 41 6.035 ©MIT Fall 2001

Registers

• Return Address from a call – implicitly copied by jal and jalr instructions

0 zero hard-wired to zero

31 ra return address

25

Parameter Passing Disciplines A = 10; Call foo(A)

Subroutine foo(B) B = B + 1 B = B + A

• Call by value A is 10 • Call by reference A is 22 • Call by value-result A is 21

Saman Amarasinghe 38 6.035 ©MIT Fall 2001

26

Registers

• Not a register, hard-wired to the constant 0

Saman Amarasinghe 40 6.035 ©MIT Fall 2001

Saman Amarasinghe 42 6.035 ©MIT Fall 2001

Registers

• Frame pointer • Stack pointer • Pointer to global area

0 zero hard-wired to zero

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

0 zero hard-wired to zero

7

Page 8: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 43 6.035 ©MIT Fall 2001

Registers

• Reserved for assembler to use – need storage to handle compound asm

instructions 0 zero hard-wired to zero 1 at Reserved for asm

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

Saman Amarasinghe 44 6.035 ©MIT Fall 2001

Registers

• Returns the results – copy the result when ready to return – used to evaluate expressions (up to you)

0 zero hard-wired to zero 1 at Reserved for asm

2 - 3 v0 - v1 expr. eval and return of results

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

Saman Amarasinghe 45 6.035 ©MIT Fall 2001

Registers

• First four arguments to a call – Can use it for other purposes when args are

dead – If more arguments ⇒ pass them via the stack0 zero hard-wired to zero

1 at Reserved for asm 2 - 3 v0 - v1 expr. eval and return of results 4 - 7 a0 - a3 arguments 1 to 4

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

Saman Amarasinghe 46 6.035 ©MIT Fall 2001

Registers

• Rest are temporaries

0 zero hard-wired to zero 1 at Reserved for asm

2 - 3 v0 - v1 expr. eval and return of results 4 - 7 a0 - a3 arguments 1 to 4

8 - 25 keep temporary values

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

Saman Amarasinghe 47 6.035 ©MIT Fall 2001

Registers • Across a procedure call temporaries need to

be: – Saved by the caller – Saved by the calliee – Some combination of both0 zero hard-wired to zero

1 at Reserved for asm 2 - 3 v0 - v1 expr. eval and return of results 4 - 7 a0 - a3 arguments 1 to 4

8 - 25 keep temporary values

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

Saman Amarasinghe 48 6.035 ©MIT Fall 2001

Registers

0 zero hard-wired to zero 1 at Reserved for asm

2 - 3 v0 - v1 expr. eval and return of results 4 - 7 a0 - a3 arguments 1 to 4 8-15 t0 - t7 caller saved temporary

16 - 23 s0 - s7 calliee saved temporary 24, 25 t8, t9 caller saved temporary

28 gp pointer to global area 29 sp stack pointer 30 fp frame pointer 31 ra return address

• Across a procedure call temporaries need to be: – Saved by the caller – Saved by the calliee – Some combination of both

8

Page 9: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

30

Question: Homes for Variables?

• What are the advantages/disadvantages of: • A Simplistic model

– Allocate a data area for each distinct scope – Calliee saving of registers? – One data area per “sheaf” in scoped table

– Caller saving of registers? • What about recursion? • What registers should be used at the caller – Need a data area per invocation (or activation) of a

and calliee if half is caller-saved and the scope

other half is calliee-saved? – We call this the scope’s activation record– The compiler can also store control information there !

– Caller-saved t0 - t9 – Calliee-saved s0-s7 • More complex scheme

– One activation record (AR) per procedure instance – All the procedure’s scopes share a single AR – Use a stack to keep the activation records

Saman Amarasinghe 49 6.035 ©MIT Fall 2001 Saman Amarasinghe 50 6.035 ©MIT Fall 2001

33 34

Question: Outline

• Why use a stack? Why not use the heap or • Introduction pre-allocated in the data segment? • Machine Language

• Overview of a modern processor • Procedure Abstraction • Procedure Linkage • Guidelines in Creating a Code Generator

Saman Amarasinghe 51 6.035 ©MIT Fall 2001 Saman Amarasinghe 52 6.035 ©MIT Fall 2001

Saman Amarasinghe 53 6.035 ©MIT Fall 2001

Procedure Linkages

Standard procedure linkage procedure p

prolog

epilog

pre-call

post-return

procedure q

prolog

epilog

Procedure has

• standard prolog

• standard epilog

Each call involves a

• pre-call sequence

• post-return sequence

Saman Amarasinghe 54 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

fp

sp

• Address of the nth argument is -(n-4)*4*$fp

• Local variables are a positive constant off $fp

9

Page 10: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 55 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

fp

sp

• When calling a new procedure

33

Saman Amarasinghe 56 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

fp

sp

• When calling a new procedure, caller:

Saman Amarasinghe 57 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers

fp• When calling a new procedure, caller: – push any t0-t9 that has a

live value the stack

sp

Saman Amarasinghe 58 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

fp• When calling a new procedure, caller: – push any t0-t9 that has a

live value the stack – put arguments 1-4 on a0-

a3 – push rest of the

arguments on the stack

sp

on on

Saman Amarasinghe 59 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

fp

sp

• When calling a new procedure, caller: – push any t0-t9 that has a

live value the stack – put arguments 1-4 on a0-

a3 – push rest of the

arguments on the stack – do a jal or jalr

Saman Amarasinghe 60 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

fp

sp

• In a procedure call, the calliee at the beginning:

34

on

10

Page 11: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 61 6.035 ©MIT Fall 2001

old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the beginning: – push $fp on the stack

fp

sp

Saman Amarasinghe 62 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the beginning: – push $fp on the stack – copy $sp+4 to $fp

old frame pointer sp

fp

Saman Amarasinghe 63 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

fp

• In a procedure call, the calliee at the beginning: – push $fp on the stack – copy $sp+4 to $fp – push $ra on the stack

sp

Saman Amarasinghe 64 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Calliee saved registers

Caller saved registers arguments

fp

• In a procedure call, the calliee at the beginning: – push $fp on the stack – copy $sp+4 to $fp – push $ra on the stack – if any s0-s7 is used in the

procedure save it on the stack sp

Saman Amarasinghe 65 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Local variables

Calliee saved registers

Caller saved registers arguments

fp

• In a procedure call, the calliee at the beginning: – push $fp on the stack – copy $sp+4 to $fp – push $ra on the stack – if any s0-s7 is used in the

procedure save it on the stack

– create space for local variables on the stack

sp

Saman Amarasinghe 66 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Local variables

Calliee saved registers

Caller saved registers arguments

Dynamic area

fp

• In a procedure call, the calliee at the beginning: – push $fp on the stack – copy $sp+4 to $fp – push $ra on the stack – if any s0-s7 is used in the

procedure save it on the stack

– create space for local variables on the stack

– execute the calliee... sp

11

Page 12: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 67 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Local variables

Calliee saved registers

Caller saved registers arguments

Dynamic area

• In a procedure call, the calliee at the end:

fp

sp

43

Saman Amarasinghe 68 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Calliee saved registers

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1

fp

Local variables

Dynamic area sp

Saman Amarasinghe 69 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Calliee saved registers

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ...

fp

sp Local variables

Dynamic area sp

Saman Amarasinghe 70 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ... – Pop the calliee saved

registers from stack fp

Calliee saved registers sp

Saman Amarasinghe 71 6.035 ©MIT Fall 2001

return address old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ... – Pop the calliee saved

registers from stack – restore $ra from stack

fpsp

Saman Amarasinghe 72 6.035 ©MIT Fall 2001

old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ... – Pop the calliee saved

registers from stack – restore $ra from stack – restore $fp from stack

fp

sp

12

Page 13: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

Saman Amarasinghe 73 6.035 ©MIT Fall 2001

old frame pointer

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ... – Pop the calliee saved

registers from stack – restore $ra from stack – restore $fp from stack

fp

sp

Saman Amarasinghe 74 6.035 ©MIT Fall 2001

return address old frame pointer

Stack

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers arguments

• In a procedure call, the calliee at the end: – put return values on v0,v1 – update $sp using $fp

($fp+8) + ... – Pop the calliee saved

registers from stack – restore $ra from stack – restore $fp from stack – execute ra and return to

caller

fp

sp

jr

Saman Amarasinghe 75 6.035 ©MIT Fall 2001

Stack • On return from a

procedure call, the caller:

return address old frame pointer

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers

fp

arguments sp

46

Saman Amarasinghe 76 6.035 ©MIT Fall 2001

Stack • On return from a

procedure call, the caller: – Update $sp to ignore

arguments

return address old frame pointer

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers

fp

sparguments sp

Saman Amarasinghe 77 6.035 ©MIT Fall 2001

Stack • On return from a

procedure call, the caller: – Update $sp to ignore

arguments – pop the caller saved

registers

return address old frame pointer

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

Caller saved registers

fp

sp

Saman Amarasinghe 78 6.035 ©MIT Fall 2001

Stack • On return from a

procedure call, the caller: – Update $sp to ignore

arguments – pop the caller saved

registers – Continue...

return address old frame pointer

Local variables

Calliee saved registers

Stack temporaries

... argument 5 argument 4

Dynamic area

fp

sp

13

Page 14: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

{

else

} }

{

else

} }

47

Question:

• Do you need the $fp? • What are the advantages and disadvantages

of having $fp?

Saman Amarasinghe 79 6.035 ©MIT Fall 2001

Example Program 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;

dx = bx - ax;

retrun dx + dy + dz;

int px, py, pz;

auxmath am;am.sum3d(px, py, pz, 0, 0, 0);Saman Amarasinghe 81 6.035 ©MIT Fall 2001

Example Program 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;

dx = bx - ax;

retrun dx + dy + dz;

Saman Amarasinghe 80 6.035 ©MIT Fall 2001

Saman Amarasinghe 82 6.035 ©MIT Fall 2001

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);

fp

Example Program v0 ?? v1 ?? a0 this a1 ax (10) a2 ay (20) a3 az (30) v0 ?? v1 ?? t0 ?? t1 ??

Dynamic area

Caller saved registers

Argument 7: bz (-1) Argument 6: by (1) Argument 5: bx (0)

Saman Amarasinghe 83 6.035 ©MIT Fall 2001

Example Program 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);

return address old frame pointer

Dynamic area

Caller saved registers

Argument 7: bz (-1)

fp sp

Argument 6: by (1) Argument 5: bx (0)

v0 ?? v1 ?? a0 this a1 ax (10) a2 ay (20) a3 az (30) v0 ?? v1 ?? t0 ?? t1 ??

Saman Amarasinghe 84 6.035 ©MIT Fall 2001

Example Program 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);

return address old frame pointer

Dynamic area

Caller saved registers

Argument 7: bz (-1)

fp

sp

Argument 6: by (1) Argument 5: bx (0)

Local variable dx (??)Local variable dy (??)Local variable dz (??)

v0 ?? v1 ?? a0 this a1 ax (10) a2 ay (20) a3 az (30) v0 ?? v1 ?? t0 ?? t1 ??

14

Page 15: Segment IV Roadmap Lecture 8: Unoptimized Code Generationdspace.mit.edu/.../D2D63495-2D26-4EDB-ABD5-E79A10E28692/0/lecture_8.pdf · Lecture 8: Unoptimized Code Generation From the

49

Outline

• Introduction • Machine Language • Overview of a modern processor • Procedure Abstraction • Procedure Linkage • Guidelines in Creating a Code Generator

Saman Amarasinghe 85 6.035 ©MIT Fall 2001

Guidelines for the code generator

• Do the simplest but dumb thing – it is ok to generate 0 + 1*x + 0*y

• Make sure you know want can be done at… – Compile time in the compiler – Runtime in a runtime library – Runtime using generated code

• Runtime library is your friend! – Don’t generate complex code sequences when it

can be done in a runtime library assembly hack – Example: malloc

Saman Amarasinghe 87 6.035 ©MIT Fall 2001

Guidelines for the code generator

• Lower the abstraction level slowly – Do many passes, that do few things (or one thing)

• Easier to break the project down, generate and debug

• Keep the abstraction level consistent – IR should have ‘correct’ semantics at all time

• At least you should know the semantics – You may want to run some of the optimizations

between the passes. • Use assertions liberally

– Use an assertion to check your assumption Saman Amarasinghe 86 6.035 ©MIT Fall 2001

Guidelines for the code generator

• Remember that optimizations will come later – Let the optimizer do the optimizations – Think about what optimizer will need and structure

your code accordingly – Example: Register allocation, algebraic

simplification, constant propagation • Setup a good testing infrastructure

– regression tests • If a input program creates a bug, use it as a regression

test – Learn good bug hunting procedures

• Example: binary search Saman Amarasinghe 88 6.035 ©MIT Fall 2001

15