Presentation is loading. Please wait.

Presentation is loading. Please wait.

Code Generation Example Mooly Sagiv html://www.cs.tau.ac.il/~msagiv/courses/wcc06.html.

Similar presentations


Presentation on theme: "Code Generation Example Mooly Sagiv html://www.cs.tau.ac.il/~msagiv/courses/wcc06.html."— Presentation transcript:

1 Code Generation Example Mooly Sagiv html://www.cs.tau.ac.il/~msagiv/courses/wcc06.html

2 Basic Compiler Phases

3 Outline A possible structure of the activation records Example compilation Executing the assembly code

4 Typical Virtual Memory Content Lower addresses static area Stack area Heap area Machine Registers

5 The problem The compiler needs to allocate memory for variables Consistent with program semantics –Scope –Duration –Recursion Efficient (moderate runtime cost) Solution?

6 A Typical Stack Frame

7 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Example Program

8 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part SP FP R03 R1 R2 main

9 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R03 R1 R2 Administrative part SP FP main fact

10 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R1 R2 Administrative part SP FP main fact 5 3

11 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R1 R2 Administrative part SP FP main fact 5 3 Administrative part fact 5

12 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R1 R2 Administrative part SP FP main fact 5 3 Administrative part fact 5 2

13 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5

14 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R00 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1

15 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R00 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1

16 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R11 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1

17 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R12 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP

18 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R13 R2 Administrative part main fact 5 3 SP FP

19 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R0x87 R16 R2 main SP FP x87 “%d\n”

20 void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R0x87 R16 R2 main SP FP x87 “%d\n” Administrative part _printf

21 Register Instructions InstructionActions Load_Const c, RiRi=c Load_Local c(Ri), RjRj=*(Ri+c) Store_Local Ri, c(Rj)*(Rj+c)=Ri Add_Constant c, RiRi = Ri+c Add_Reg Ri, RjRj = Rj+Ri CMP Ri, RjCC = Ri -Rj CMP_Const C, RiCC = Ri - C Branch LPC = L; Branch_EQ Lif (CC==EQ) PC =L JSR L*(--SP) = FP; *(--SP) = PC; FP=SP-1;PC =L RTSPC=*(SP++); FP=*(SP++)

22 void main() { printf(“%d\n”, fact(3)); }. global _main Add_Constant -K1, SP L1: Load_Const 3, R0 JSR _fact Load_Reg R0, R1 Load_Const L2, R0 JSR _printf Add_Constant K1, SP RTS.data L2 : “%d\n”.end Code Generated for ‘main’

23 Code generated for ‘fact’ int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end

24 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part

25 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact

26 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact

27 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact

28 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact

29 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact 5 3

30 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R02 R1 R2 main Administrative part fact 5 3

31 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part R02 R1 R2 main Administrative part fact 5 3 SP FP Administrative part

32 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part R02 R1 R2 main Administrative part fact 5 3 SP FP Administrative part fact 5

33 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L6: Add_Constant K2, SP RTS.end R00 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1 Administrative part main

34 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L6: Add_Constant K2, SP RTS.end R00 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1 Administrative part main

35 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end

36 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end

37 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end

38 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end

39 L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R02 R13 R2 Administrative part fact 5 3 SP FP Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end


Download ppt "Code Generation Example Mooly Sagiv html://www.cs.tau.ac.il/~msagiv/courses/wcc06.html."

Similar presentations


Ads by Google