Skip to content

Commit e164acf

Browse files
author
guest
committed
Bugs
1 parent c35bbe7 commit e164acf

File tree

8 files changed

+187
-38
lines changed

8 files changed

+187
-38
lines changed

Main/SILsource5

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
decl
2+
integer f(integer x);
3+
enddecl
4+
5+
integer f(integer x)
6+
{
7+
decl
8+
integer t;
9+
enddecl
10+
11+
begin
12+
if(x>=11) then
13+
t = 11;
14+
else
15+
t = f(f(x+1));
16+
endif;
17+
18+
return t;
19+
end
20+
}
21+
22+
integer main()
23+
{
24+
decl
25+
integer n;
26+
enddecl
27+
28+
begin
29+
read(n);
30+
write(f(n));
31+
32+
return 1;
33+
end
34+
}

Main/SIM_Simulator/SIMcode

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
2+
LABEL0:
3+
PUSH BP
4+
MOV BP SP
5+
PUSH R0
6+
PUSH R0
7+
MOV R0 BP
8+
MOV R1 -3
9+
ADD R0 R1
10+
MOV R1 [R0]
11+
MOV R2 11
12+
GE R1 R2
13+
JZ R1 LABEL1
14+
MOV R1 BP
15+
MOV R2 -4
16+
ADD R1 R2
17+
MOV R2 11
18+
MOV [R1] R2
19+
JMP LABEL2
20+
LABEL1:
21+
MOV R1 BP
22+
MOV R2 -4
23+
ADD R1 R2
24+
PUSH R0
25+
PUSH R1
26+
PUSH R0
27+
PUSH R1
28+
MOV R2 BP
29+
MOV R3 -3
30+
ADD R2 R3
31+
MOV R3 [R2]
32+
MOV R4 1
33+
ADD R3 R4
34+
MOV R4 R3
35+
PUSH R4
36+
PUSH R3
37+
CALL LABEL0
38+
MOV R3 SP
39+
POP R0
40+
POP R1
41+
POP R0
42+
MOV R2 R3
43+
PUSH R2
44+
PUSH R1
45+
CALL LABEL0
46+
MOV R1 SP
47+
POP R0
48+
POP R1
49+
POP R0
50+
MOV [R1] R1
51+
LABEL2:
52+
MOV R0 BP
53+
MOV R1 -4
54+
ADD R0 R1
55+
MOV R1 [R0]
56+
MOV R2 BP
57+
MOV R3 2
58+
SUB R2 R3
59+
MOV [R2] R1
60+
POP R0
61+
POP R0
62+
POP BP
63+
RET
64+
START
65+
MOV SP -1
66+
PUSH BP
67+
MOV BP SP
68+
PUSH R0
69+
IN R0
70+
MOV R1 BP
71+
MOV R2 -5
72+
ADD R1 R2
73+
MOV [R1] R0
74+
MOV R0 BP
75+
MOV R1 -5
76+
ADD R0 R1
77+
MOV R1 [R0]
78+
MOV R2 R1
79+
PUSH R2
80+
PUSH R1
81+
CALL LABEL0
82+
MOV R1 SP
83+
POP R0
84+
OUT R1
85+
MOV R-1 1
86+
MOV R0 BP
87+
MOV R1 2
88+
SUB R0 R1
89+
MOV [R0] R-1
90+
POP R0
91+
POP BP
92+
RET
93+
HALT
94+
95+
96+
Get = 39
97+
98+
Get = 35

Main/SIMcode

Whitespace-only changes.

SILCompiler/codeGen.c

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
496502
void 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
}

SILCompiler/codeGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ int codeGenerate(Tnode *root,struct Lsymbol **Lhead);
1313
int lookupBinding(char *NAME,struct Lsymbol **Lhead);
1414
int pushAllRegs();
1515
void pushCallParams(Tnode *root,struct Lsymbol **Lhead);
16+
void popAllLocal(struct Lsymbol **Lhead);
1617
void popAllArgs(ArgStruct *Ahead);
1718
void restoreRegs(int cnt);
1819
void pushLocalVar(struct Lsymbol **Lhead);

SILCompiler/compilerLib.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,11 +396,13 @@ int getNegativeLoc()
396396

397397
int getReg()
398398
{
399+
get++;
399400
return ++regcnt;
400401
}
401402

402403
void freeReg()
403404
{
405+
fre++;
404406
--regcnt;
405407
}
406408

SILCompiler/compilerLib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,5 @@ int *binding;
206206
int locpos,locneg,regcnt,labelcnt;
207207
FILE *fp;
208208

209+
int get,fre;
209210
#endif

SILCompiler/startCompile.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,16 @@ void compile(Tnode *gdeclroot,Tnode *fdefroot,Tnode *mainroot)
3636

3737
struct Lsymbol *Ltable;
3838
Ltable = NULL;
39-
interpreter(mainroot,&Ltable);
40-
39+
/* interpreter(mainroot,&Ltable);*/
40+
41+
get = 0;
42+
fre = 0;
4143
module = CODEGEN;
42-
fp = fopen("SIMCode","w");
44+
fp = fopen("SIM_Simulator/SIMcode","w");
4345
funcCodeGen(fdefroot);
4446
funcCodeGen(mainroot);
47+
fprintf(fp,"\n\nGet = %d",get);
48+
fprintf(fp,"\n\nGet = %d",fre);
4549
fclose(fp);
4650
}
4751
}

0 commit comments

Comments
 (0)