88import java .io .*;
99import IR .*;
1010import helper .Label ;
11- import symboltable .Variable ;
11+ import symboltable .* ;
1212import java .util .List ;
1313import java .util .Hashtable ;
1414import regalloc .RegisterAllocator ;
@@ -19,13 +19,29 @@ public class CodeGenerator
1919 private List <Quadruple > IRList ;
2020 private Hashtable <Quadruple , List <Label >> labels ;
2121 private RegisterAllocator allocator ;
22+ private SymbolTable symbolTable ;
2223
23- public CodeGenerator (List <Quadruple > list , Hashtable <Quadruple , List <Label >> label , String fileName )
24+ public CodeGenerator (List <Quadruple > list , Hashtable <Quadruple , List <Label >> label , RegisterAllocator alloc , Scope symTable , String fileName )
2425 {
2526 IRList = list ;
2627 output = fileName ;
2728 labels = label ;
28- allocator = new RegisterAllocator ();
29+ allocator = alloc ;
30+ symbolTable = (SymbolTable )symTable ;
31+ }
32+
33+ //Helper function to get size of a class (in bytes)
34+ public int getClassSize (String name )
35+ {
36+ ClassSymbolTable cst = symbolTable .getClass (name );
37+
38+ if (cst == null )
39+ {
40+ System .err .println ("Error - Invalid Class Lookup in CodeGenerator!" );
41+ return -1 ;
42+ }
43+
44+ return cst .getSize ();
2945 }
3046
3147 public void generateMIPS ()
@@ -136,15 +152,28 @@ else if(arg1.getType().equals("temporary"))
136152 }
137153 else //Variable arg1
138154 {
139- temp = "lw " + resultReg + ", " + arg1 .getName () + "\n " ;
155+ if (arg1 .getOffset () == -1 )
156+ {
157+ temp = "move " + resultReg + ", " + arg1 .getRegister () + "\n " ;
158+ }
159+ else //Class variable
160+ {
161+ //Todo
162+ }
140163 }
141164
142165 bw .write (temp , 0 , temp .length ());
143166
144167 if (!result .getType ().equals ("temporary" )) //Variable result
145168 {
146- //Store result from resultReg into the variable address
147- temp = "sw " + resultReg + result .getName () + "\n " ;
169+ if (result .getOffset () == -1 )
170+ {
171+ temp = "move " + result .getRegister () + ", " + resultReg + "\n " ;
172+ }
173+ else //Class variable
174+ {
175+ //Todo
176+ }
148177 bw .write (temp , 0 , temp .length ());
149178 }
150179 }
@@ -184,7 +213,15 @@ else if(arg1.getType().equals("temporary"))
184213 }
185214 else //Variable arg1
186215 {
187- temp = "lw " + resultReg + ", " + arg1 .getName () + "\n " ;
216+ if (arg1 .getOffset () == -1 )
217+ {
218+ temp = "move " + resultReg + ", " + arg1 .getRegister () + "\n " ;
219+ }
220+ else //Class variable
221+ {
222+ //Todo
223+ temp = "" ;
224+ }
188225 }
189226
190227 bw .write (temp , 0 , temp .length ());
@@ -219,8 +256,14 @@ else if(arg1.getType().equals("temporary"))
219256
220257 if (!result .getType ().equals ("temporary" )) //Variable result
221258 {
222- //Store result from resultReg into the variable address
223- temp = "sw " + resultReg + result .getName () + "\n " ;
259+ if (result .getOffset () == -1 )
260+ {
261+ temp = "sw " + result .getRegister () + ", " + resultReg + "\n " ;
262+ }
263+ else //Class variable
264+ {
265+ //Todo
266+ }
224267 bw .write (temp , 0 , temp .length ());
225268 }
226269 }
@@ -247,7 +290,14 @@ else if(arg1.getType().equals("temporary"))
247290 }
248291 else //Variable
249292 {
250- temp = "lw $v0, " + arg1 .getName () + "\n " ;
293+ if (arg1 .getOffset () == -1 )
294+ {
295+ temp = "move $v0, " + arg1 .getRegister () + "\n " ;
296+ }
297+ else //Class variable
298+ {
299+ //Todo
300+ }
251301 }
252302
253303 bw .write (temp , 0 , temp .length ());
@@ -271,17 +321,14 @@ private void handleAssignment(Quadruple instruction, BufferedWriter bw)
271321 Variable arg2 = (Variable )instruction .getArg2 ();
272322 String temp = "" ;
273323 String resultReg ;
274- String tempReg ;
275324
276325 if (result .getType ().equals ("temporary" ))
277326 {
278327 resultReg = allocator .allocateReg (result .getName ());
279- tempReg = allocator .allocateTempReg (0 );
280328 }
281329 else //Variable result
282330 {
283331 resultReg = allocator .allocateTempReg (0 );
284- tempReg = allocator .allocateTempReg (1 );
285332 }
286333
287334 //Handle arg1 -- Store the first parameter in the result register
@@ -295,7 +342,14 @@ else if(arg1.getType().equals("temporary"))
295342 }
296343 else //Variable arg1
297344 {
298- temp = "lw " + resultReg + ", " + arg1 .getName () + "\n " ;
345+ if (arg1 .getOffset () == -1 )
346+ {
347+ temp = "move " + resultReg + ", " + arg1 .getRegister () + "\n " ;
348+ }
349+ else //Class variable
350+ {
351+ //Todo
352+ }
299353 }
300354
301355 bw .write (temp , 0 , temp .length ());
@@ -398,20 +452,28 @@ else if(op.equals("&&"))
398452 }
399453 else //Variable arg2
400454 {
401- temp = "lw " + tempReg + ", " + arg2 .getName () + "\n " ;
402- bw .write (temp , 0 , temp .length ());
455+ String varReg = "" ;
456+
457+ if (arg1 .getOffset () == -1 )
458+ {
459+ varReg = arg1 .getRegister ();
460+ }
461+ else //Class variable
462+ {
463+ //Todo
464+ }
403465
404466 if (op .equals ("+" ))
405467 {
406- temp = "add " + resultReg + ", " + resultReg + ", " + tempReg + "\n " ;
468+ temp = "add " + resultReg + ", " + resultReg + ", " + varReg + "\n " ;
407469 }
408470 else if (op .equals ("-" ))
409471 {
410- temp = "sub " + resultReg + ", " + resultReg + ", " + tempReg + "\n " ;
472+ temp = "sub " + resultReg + ", " + resultReg + ", " + varReg + "\n " ;
411473 }
412474 else if (op .equals ("*" ))
413475 {
414- temp = "mult " + resultReg + ", " + tempReg + "\n " ;
476+ temp = "mult " + resultReg + ", " + varReg + "\n " ;
415477 bw .write (temp , 0 , temp .length ());
416478
417479 temp = "mflo " + resultReg + "\n " ;
@@ -422,7 +484,7 @@ else if(op.equals("<"))
422484 Label L2 = new Label (false );
423485
424486 //If arg 1 < arg2, branch to L1 and store "1" inside resultReg
425- temp = "blt " + resultReg + ", " + tempReg + ", " + L1 .getName () + "\n " ;
487+ temp = "blt " + resultReg + ", " + varReg + ", " + L1 .getName () + "\n " ;
426488 bw .write (temp , 0 , temp .length ());
427489
428490 //Else fallthrough and store "0" inside resultReg
@@ -442,16 +504,23 @@ else if(op.equals("<"))
442504 }
443505 else if (op .equals ("&&" ))
444506 {
445- temp = "and " + resultReg + ", " + resultReg + ", " + tempReg + "\n " ;
507+ temp = "and " + resultReg + ", " + resultReg + ", " + varReg + "\n " ;
446508 }
447509 }
448510
449511 bw .write (temp , 0 , temp .length ());
450512
451513 if (!result .getType ().equals ("temporary" )) //Variable result
452514 {
453- //Store result from resultReg into the variable address
454- temp = "sw " + resultReg + result .getName () + "\n " ;
515+ if (result .getOffset () == -1 )
516+ {
517+ temp = "move " + result .getRegister () + ", " + resultReg + "\n " ;
518+ }
519+ else //Class variable
520+ {
521+ //Todo
522+ }
523+
455524 bw .write (temp , 0 , temp .length ());
456525 }
457526 }
@@ -518,20 +587,26 @@ private void functionCall(List<Quadruple>IRList, int index, BufferedWriter bw)
518587 ParameterIR param = (ParameterIR )IRList .get (paramIndex +i );
519588 String reg = "$a" + i ;
520589
521- String argName = ((Variable )param .getArg1 ()).getName ();
522- String argType = ((Variable )param .getArg1 ()).getType ();
590+ Variable arg1 = (Variable )param .getArg1 ();
523591
524- if (argType .equals ("constant" ))
592+ if (arg1 . getType () .equals ("constant" ))
525593 {
526- temp = "li " + reg + ", " + argName + "\n " ;
594+ temp = "li " + reg + ", " + arg1 . getName () + "\n " ;
527595 }
528- else if (argType .equals ("temporary" ))
596+ else if (arg1 . getType () .equals ("temporary" ))
529597 {
530- temp = "move " + reg + ", " + allocator .allocateReg (argName ) + "\n " ;
598+ temp = "move " + reg + ", " + allocator .allocateReg (arg1 . getName () ) + "\n " ;
531599 }
532600 else //Variable
533601 {
534- temp = "lw " + reg + ", " + argName + "\n " ;
602+ if (arg1 .getOffset () == -1 )
603+ {
604+ temp = "move " + reg + ", " + arg1 .getRegister () + "\n " ;
605+ }
606+ else //Class variable
607+ {
608+ //Todo
609+ }
535610 }
536611
537612 bw .write (temp , 0 , temp .length ());
@@ -566,7 +641,14 @@ else if(argType.equals("temporary"))
566641 }
567642 else //Variable
568643 {
569- temp = "sw $v0, " + result .getName () + "\n " ;
644+ if (result .getOffset () == -1 )
645+ {
646+ temp = "move " + result .getRegister () + ", $v0\n " ;
647+ }
648+ else //Class variable
649+ {
650+ //Todo
651+ }
570652 }
571653
572654 bw .write (temp , 0 , temp .length ());
0 commit comments