-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeGenerator.java~
More file actions
125 lines (109 loc) · 3.5 KB
/
Copy pathCodeGenerator.java~
File metadata and controls
125 lines (109 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import java.io.*;
class CodeGenerator implements AATVisitor {
public CodeGenerator(String output_filename) {
try {
output = new PrintWriter(new FileOutputStream(output_filename));
} catch (IOException e) {
System.out.println("Could not open file "+output_filename+" for writing.");
}
/* Feel free to add code here, if you want to */
EmitSetupCode();
}
public Object VisitCallExpression(AATCallExpression expression) {
}
public Object VisitMemory(AATMemory expression) {
}
public Object VisitOperator(AATOperator expression) {
}
public Object VisitRegister(AATRegister expression) {
}
public Object VisitCallStatement(AATCallStatement statement) {
}
public Object VisitConditionalJump(AATConditionalJump statement) {
}
public Object VisitEmpty(AATEmpty statement) {
}
public Object VisitJump(AATJump statement) {
emit("j " + statement.label());
return null;
}
public Object VisitLabel(AATLabel statement) {
emit(statement.label() + ":");
return null;
}
public Object VisitMove(AATMove statement) {
}
public Object VisitReturn(AATReturn statement) {
emit("jr " + Register.ReturnAddr());
return null;
}
public Object VisitHalt(AATHalt halt) {
/* Don't need to implement halt -- you can leave
this as it is, if you like */
return null;
}
public Object VisitSequential(AATSequential statement) {
}
public Object VisitConstant(AATConstant expression) {
}
private void emit(String assem) {
assem = assem.trim();
if (assem.charAt(assem.length()-1) == ':')
output.println(assem);
else
output.println("\t" + assem);
}
public void GenerateLibrary() {
emit("Print:");
emit("lw $a0, 4(" + Register.SP() + ")");
emit("li $v0, 1");
emit("syscall");
emit("li $v0,4");
emit("la $a0, sp");
emit("syscall");
emit("jr $ra");
emit("Println:");
emit("li $v0,4");
emit("la $a0, cr");
emit("syscall");
emit("jr $ra");
emit("Read:");
emit("li $v0,5");
emit("syscall");
emit("jr $ra");
emit("allocate:");
emit("la " + Register.Tmp1() + ", HEAPPTR");
emit("lw " + Register.Result() + ",0(" + Register.Tmp1() + ")");
emit("lw " + Register.Tmp2() + ", 4(" + Register.SP() + ")");
emit("sub " + Register.Tmp2() + "," + Register.Result() + "," + Register.Tmp2());
emit("sw " + Register.Tmp2() + ",0(" + Register.Tmp1() + ")");
emit("jr $ra");
emit(".data");
emit("cr:");
emit(".asciiz \"\\n\"");
emit("sp:");
emit(".asciiz \" \"");
emit("HEAPPTR:");
emit(".word 0");
output.flush();
}
private void EmitSetupCode() {
emit(".globl main");
emit("main:");
emit("addi " + Register.ESP() + "," + Register.SP() + ",0");
emit("addi " + Register.SP() + "," + Register.SP() + "," +
- MachineDependent.WORDSIZE * STACKSIZE);
emit("addi " + Register.Tmp1() + "," + Register.SP() + ",0");
emit("addi " + Register.Tmp1() + "," + Register.Tmp1() + "," +
- MachineDependent.WORDSIZE * STACKSIZE);
emit("la " + Register.Tmp2() + ", HEAPPTR");
emit("sw " + Register.Tmp1() + ",0(" + Register.Tmp2() + ")");
emit("sw " + Register.ReturnAddr() + "," + MachineDependent.WORDSIZE + "("+ Register.SP() + ")");
emit("jal main1");
emit("lw " + Register.ReturnAddr() + "," + MachineDependent.WORDSIZE + "("+ Register.SP() + ")");
emit("jr " + Register.ReturnAddr());
}
private final int STACKSIZE = 1000;
private PrintWriter output;
/* Feel Free to add more instance variables, if you like */
}