@@ -34,13 +34,15 @@ void funcCodeGen(Tnode *root)
3434 fprintf (fp ,"PUSH BP\n" );
3535 fprintf (fp ,"MOV BP SP\n" );
3636
37+ regcnt = -1 ;
3738 pushLocalVar (& Lhead );
3839 codeGenerate (root -> Ptr3 ,& Lhead );
3940
4041 return ;
4142
4243 case MAINBLOCK : fprintf (fp ,"START\n" );
4344 fprintf (fp ,"MOV SP -1\n" );
45+ regcnt = -1 ;
4446 pushGlobalVar ();
4547
4648 fprintf (fp ,"PUSH BP\n" );
@@ -51,7 +53,6 @@ void funcCodeGen(Tnode *root)
5153
5254 pushLocalVar (& Lhead );
5355
54- regcnt = -1 ;
5556 codeGenerate (root -> Ptr2 ,& Lhead );
5657 fprintf (fp ,"HALT\n" );
5758
@@ -113,33 +114,29 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
113114 return r ;
114115
115116 //Call by Reference
116- /* case IDADDR : lnode = Llookup(root->NAME,Lhead);*/
117- /* gnode = Glookup(root->NAME);*/
118- /* */
119- /* if(lnode != NULL)*/
120- /* binding = lnode->LOCATION;*/
121- /* else binding = gnode->LOCATION;*/
122- /* */
123- /* return *binding;*/
117+ /* case IDADDR : if(*/
118+ /* r = lookupBinding(root->NAME,Lhead);*/
124119/* */
125120/* case ARRAYIDADDR : gnode = Glookup(root->NAME);*/
126121/* t = evalBody(root->Ptr1,Lhead);*/
127122/* binding = gnode->LOCATION + t;*/
128123/* */
129124/* return *binding;*/
130125
131- case RET : r1 = getReg ( );
126+ case RET : r1 = codeGenerate ( root -> Ptr1 , Lhead );
132127 r2 = getReg ();
133- fprintf (fp ,"MOV R%d BP\n" ,r1 );
134- fprintf (fp ,"MOV R%d 2\n" ,r2 );
135- fprintf (fp ,"SUB R%d R%d\n" ,r1 ,r2 );
136- fprintf (fp ,"MOV [R%d] R0\n" ,r1 );
128+ r = getReg ();
129+ fprintf (fp ,"MOV R%d BP\n" ,r2 );
130+ fprintf (fp ,"MOV R%d 2\n" ,r );
131+ fprintf (fp ,"SUB R%d R%d\n" ,r2 ,r );
132+ fprintf (fp ,"MOV [R%d] R%d\n" ,r2 ,r1 );
137133 freeReg ();
138134 freeReg ();
139135 freeReg ();
140136
141- fprintf (fp ,"POP BP" );
142- fprintf (fp ,"RET" );
137+ popAllLocal (Lhead );
138+ fprintf (fp ,"POP BP\n" );
139+ fprintf (fp ,"RET\n" );
143140
144141 return ;
145142
@@ -184,7 +181,7 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
184181 freeReg ();
185182 freeReg ();
186183
187- return -1 ;
184+ return ;
188185
189186 case ARRAYRD : r = getReg ();
190187 fprintf (fp ,"IN R%d\n" ,r );
@@ -201,13 +198,13 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
201198 freeReg ();
202199 freeReg ();
203200
204- return -1 ;
201+ return ;
205202
206203 case WRIT : r = codeGenerate (root -> Ptr1 ,Lhead );
207204 fprintf (fp ,"OUT R%d\n" ,r );
208205 freeReg ();
209206
210- return -1 ;
207+ return ;
211208
212209 case ASSIGN : loc = lookupBinding (root -> NAME ,Lhead );
213210 r = codeGenerate (root -> Ptr1 ,Lhead );
@@ -225,12 +222,12 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
225222 fprintf (fp ,"ADD R%d R%d\n" ,r1 ,r2 );
226223 freeReg ();
227224
228- r = codeGenerate (root -> Ptr2 ,Lhead );
229- fprintf (fp ,"MOV [R%d] R%d\n" ,r1 ,r );
225+ r2 = codeGenerate (root -> Ptr2 ,Lhead );
226+ fprintf (fp ,"MOV [R%d] R%d\n" ,r1 ,r2 );
230227 freeReg ();
231228 freeReg ();
232229
233- return -1 ;
230+ return ;
234231
235232 case ADD : r1 = codeGenerate (root -> Ptr1 ,Lhead );
236233 r2 = codeGenerate (root -> Ptr2 ,Lhead );
@@ -312,20 +309,20 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
312309 case And : r1 = codeGenerate (root -> Ptr1 ,Lhead );
313310 r2 = codeGenerate (root -> Ptr2 ,Lhead );
314311 fprintf (fp ,"MUL R%d R%d\n" ,r1 ,r2 );
315-
312+ freeReg ();
316313 return r1 ;
317314
318315 case Or : r1 = codeGenerate (root -> Ptr1 ,Lhead );
319316 r2 = codeGenerate (root -> Ptr2 ,Lhead );
320317 fprintf (fp ,"ADD R%d R%d\n" ,r1 ,r2 );
321-
318+ freeReg ();
322319 return r1 ;
323320
324321 case Not : r1 = getReg ();
325322 r2 = codeGenerate (root -> Ptr1 ,Lhead );
326323 fprintf (fp ,"MOV R%d %d\n" ,r1 ,1 );
327324 fprintf (fp ,"SUB R%d R%d\n" ,r1 ,r2 );
328-
325+ freeReg ();
329326 return r1 ;
330327
331328 case True :
@@ -339,22 +336,20 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead)
339336
340337 r1 = getReg ();
341338 fprintf (fp ,"MOV R%d [R%d]\n" ,r1 ,loc );
342- freeReg ();
343339
344340 return r1 ;
345341
346- case ARRAYIDFR : r1 = codeGenerate (root -> Ptr1 ,Lhead );
342+ case ARRAYIDFR : r1 = getReg ();
343+ r2 = codeGenerate (root -> Ptr1 ,Lhead );
347344 loc = Glookup (root -> NAME )-> BINDING ;
348- r2 = getReg ();
349- fprintf (fp ,"MOV R%d %d\n" ,r2 ,loc );
350- fprintf (fp ,"ADD R%d R%d\n" ,r1 ,r2 );
351- fprintf (fp ,"MOV R%d [R%d]\n" ,r2 ,r1 );
345+ fprintf (fp ,"MOV R%d %d\n" ,r1 ,loc );
346+ fprintf (fp ,"ADD R%d R%d\n" ,r2 ,r1 );
347+ fprintf (fp ,"MOV R%d [R%d]\n" ,r1 ,r2 );
352348 freeReg ();
353-
354- return r2 ;
349+ return r1 ;
355350
356351 case NUM : r = getReg ();
357- fprintf (fp ,"MOV R%d %d \n" ,r ,root -> VALUE );
352+ fprintf (fp ,"MOV R%d %d\n" ,r ,root -> VALUE );
358353
359354 return r ;
360355 }
@@ -493,13 +488,24 @@ void pushCallParams(Tnode *root,struct Lsymbol **Lhead)
493488 }
494489}
495490
491+ void popAllLocal (struct Lsymbol * * Lhead )
492+ {
493+ struct Lsymbol * ptr = * Lhead ;
494+
495+ while (ptr )
496+ {
497+ fprintf (fp ,"POP R0\n" );
498+ ptr = ptr -> NEXT ;
499+ }
500+ }
501+
496502void popAllArgs (ArgStruct * Ahead )
497503{
498504 ArgStruct * ptr = Ahead ;
499505
500506 while (ptr )
501507 {
502- fprintf (fp ,"POP R0" );
508+ fprintf (fp ,"POP R0\n " );
503509 ptr = ptr -> NEXT ;
504510 }
505511}
@@ -510,5 +516,8 @@ void restoreRegs(int cnt)
510516
511517 int r = cnt ;
512518 while (r >= 0 )
519+ {
513520 fprintf (fp ,"POP R%d\n" ,r );
521+ r -- ;
522+ }
514523}
0 commit comments