Rev 7597 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7597 | Rev 7693 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | 10 | ||
Line 11... | Line 11... | ||
11 | CONST |
11 | CONST |
Line 12... | Line 12... | ||
12 | 12 | ||
- | 13 | N = 16; |
|
13 | N = 16; |
14 | |
- | 15 | R0* = 0; R1* = 1; R2* = 2; R3* = 3; |
|
Line 14... | Line 16... | ||
14 | 16 | R4* = 4; R5* = 5; R6* = 6; R7* = 7; |
|
Line 15... | Line 17... | ||
15 | R0* = 0; R1* = 1; R2* = 2; |
17 | R8* = 8; R9* = 9; R10* = 10; R11* = 11; |
Line 16... | Line 18... | ||
16 | R8* = 8; R9* = 9; R10* = 10; R11* = 11; |
18 | R12* = 12; R13* = 13; R14* = 14; R15* = 15; |
17 | 19 | ||
18 | NVR = 32; |
20 | NVR = 32; |
Line 19... | Line 21... | ||
19 | 21 | ||
Line 20... | Line 22... | ||
20 | 22 | ||
21 | TYPE |
23 | TYPE |
22 | 24 | ||
23 | OP1 = PROCEDURE (arg: INTEGER); |
25 | OP1 = PROCEDURE (arg: INTEGER); |
Line 40... | Line 42... | ||
40 | load, save: OP3 |
42 | load, save: OP3 |
Line 41... | Line 43... | ||
41 | 43 | ||
Line 42... | Line 44... | ||
42 | END; |
44 | END; |
43 | 45 | ||
44 | 46 | ||
Line 45... | Line 47... | ||
45 | PROCEDURE push (R: REGS); |
47 | PROCEDURE push (VAR R: REGS); |
46 | VAR |
48 | VAR |
Line 56... | Line 58... | ||
56 | DEC(R.top); |
58 | DEC(R.top); |
57 | INC(R.pushed) |
59 | INC(R.pushed) |
58 | END push; |
60 | END push; |
Line 59... | Line 61... | ||
59 | 61 | ||
60 | 62 | ||
61 | PROCEDURE pop (R: REGS; reg: INTEGER); |
63 | PROCEDURE pop (VAR R: REGS; reg: INTEGER); |
Line 62... | Line 64... | ||
62 | VAR |
64 | VAR |
63 | i: INTEGER; |
65 | i: INTEGER; |
Line 109... | Line 111... | ||
109 | 111 | ||
110 | RETURN i |
112 | RETURN i |
Line 111... | Line 113... | ||
111 | END GetFreeReg; |
113 | END GetFreeReg; |
112 | 114 | ||
113 | 115 | ||
114 | PROCEDURE Put (R: REGS; reg: INTEGER); |
116 | PROCEDURE Put (VAR R: REGS; reg: INTEGER); |
115 | BEGIN |
117 | BEGIN |
116 | EXCL(R.regs, reg); |
118 | EXCL(R.regs, reg); |
Line 117... | Line 119... | ||
117 | INC(R.top); |
119 | INC(R.top); |
118 | R.stk[R.top] := reg |
120 | R.stk[R.top] := reg |
119 | END Put; |
121 | END Put; |
Line 120... | Line 122... | ||
120 | 122 | ||
121 | 123 | ||
Line 132... | Line 134... | ||
132 | 134 | ||
133 | RETURN reg |
135 | RETURN reg |
Line 134... | Line 136... | ||
134 | END PopAnyReg; |
136 | END PopAnyReg; |
135 | 137 | ||
136 | 138 | ||
Line 137... | Line 139... | ||
137 | PROCEDURE GetAnyReg* (R: REGS): INTEGER; |
139 | PROCEDURE GetAnyReg* (VAR R: REGS): INTEGER; |
138 | VAR |
140 | VAR |
Line 150... | Line 152... | ||
150 | 152 | ||
151 | RETURN reg |
153 | RETURN reg |
Line 152... | Line 154... | ||
152 | END GetAnyReg; |
154 | END GetAnyReg; |
153 | 155 | ||
154 | 156 | ||
155 | PROCEDURE GetReg* (R: REGS; reg: INTEGER): BOOLEAN; |
157 | PROCEDURE GetReg* (VAR R: REGS; reg: INTEGER): BOOLEAN; |
Line 156... | Line 158... | ||
156 | VAR |
158 | VAR |
157 | free, n: INTEGER; |
159 | free, n: INTEGER; |
158 | res: BOOLEAN; |
160 | res: BOOLEAN; |
Line 159... | Line 161... | ||
159 | 161 | ||
160 | 162 | ||
Line 199... | Line 201... | ||
199 | 201 | ||
200 | RETURN res |
202 | RETURN res |
Line 201... | Line 203... | ||
201 | END GetReg; |
203 | END GetReg; |
202 | 204 | ||
203 | 205 | ||
204 | PROCEDURE Exchange* (R: REGS; reg1, reg2: INTEGER): BOOLEAN; |
206 | PROCEDURE Exchange* (VAR R: REGS; reg1, reg2: INTEGER): BOOLEAN; |
Line 205... | Line 207... | ||
205 | VAR |
207 | VAR |
Line 237... | Line 239... | ||
237 | 239 | ||
238 | RETURN res |
240 | RETURN res |
Line 239... | Line 241... | ||
239 | END Exchange; |
241 | END Exchange; |
240 | 242 | ||
241 | 243 | ||
242 | PROCEDURE Drop* (R: REGS); |
244 | PROCEDURE Drop* (VAR R: REGS); |
243 | BEGIN |
245 | BEGIN |
Line 244... | Line 246... | ||
244 | INCL(R.regs, R.stk[R.top]); |
246 | INCL(R.regs, R.stk[R.top]); |
245 | DEC(R.top) |
247 | DEC(R.top) |
246 | END Drop; |
248 | END Drop; |
247 | 249 | ||
248 | 250 | ||
249 | PROCEDURE BinOp* (R: REGS; VAR reg1, reg2: INTEGER); |
251 | PROCEDURE BinOp* (VAR R: REGS; VAR reg1, reg2: INTEGER); |
Line 259... | Line 261... | ||
259 | reg1 := PopAnyReg(R) |
261 | reg1 := PopAnyReg(R) |
260 | END |
262 | END |
261 | END BinOp; |
263 | END BinOp; |
Line 262... | Line 264... | ||
262 | 264 | ||
263 | 265 | ||
264 | PROCEDURE UnOp* (R: REGS; VAR reg: INTEGER); |
266 | PROCEDURE UnOp* (VAR R: REGS; VAR reg: INTEGER); |
265 | BEGIN |
267 | BEGIN |
266 | IF R.top >= 0 THEN |
268 | IF R.top >= 0 THEN |
267 | reg := R.stk[R.top] |
269 | reg := R.stk[R.top] |
268 | ELSE |
270 | ELSE |
269 | reg := PopAnyReg(R) |
271 | reg := PopAnyReg(R) |
Line 270... | Line 272... | ||
270 | END |
272 | END |
271 | END UnOp; |
273 | END UnOp; |
272 | 274 | ||
273 | 275 | ||
274 | PROCEDURE PushAll* (R: REGS); |
276 | PROCEDURE PushAll* (VAR R: REGS); |
275 | BEGIN |
277 | BEGIN |
Line -... | Line 278... | ||
- | 278 | WHILE R.top >= 0 DO |
|
- | 279 | push(R) |
|
- | 280 | END |
|
- | 281 | END PushAll; |
|
- | 282 | ||
- | 283 | ||
- | 284 | PROCEDURE PushAll_1* (VAR R: REGS); |
|
- | 285 | BEGIN |
|
276 | WHILE R.top >= 0 DO |
286 | WHILE R.top >= 1 DO |
277 | push(R) |
287 | push(R) |
278 | END |
288 | END |
279 | END PushAll; |
289 | END PushAll_1; |
280 | 290 | ||
281 | 291 | ||
Line 289... | Line 299... | ||
289 | END; |
299 | END; |
290 | R.size[reg] := size |
300 | R.size[reg] := size |
291 | END Lock; |
301 | END Lock; |
Line 292... | Line 302... | ||
292 | 302 | ||
293 | 303 | ||
294 | PROCEDURE Release* (R: REGS; reg: INTEGER); |
304 | PROCEDURE Release* (VAR R: REGS; reg: INTEGER); |
295 | BEGIN |
305 | BEGIN |
296 | ASSERT(reg IN R.vregs); |
306 | ASSERT(reg IN R.vregs); |
Line 348... | Line 358... | ||
348 | END |
358 | END |
349 | END |
359 | END |
350 | END Restore; |
360 | END Restore; |
Line 351... | Line 361... | ||
351 | 361 | ||
352 | 362 | ||
353 | PROCEDURE Reset* (R: REGS); |
363 | PROCEDURE Reset* (VAR R: REGS); |
Line 354... | Line 364... | ||
354 | VAR |
364 | VAR |
355 | i: INTEGER; |
365 | i: INTEGER; |
Line 399... | Line 409... | ||
399 | 409 | ||
400 | RETURN res |
410 | RETURN res |
Line 401... | Line 411... | ||
401 | END GetAnyVarReg; |
411 | END GetAnyVarReg; |
402 | 412 | ||
403 | - | ||
404 | PROCEDURE Create* (push, pop: OP1; mov, xch: OP2; load, save: OP3; regs, vregs: SET): REGS; |
413 | |
Line 405... | Line 414... | ||
405 | VAR |
414 | PROCEDURE Init* (VAR R: REGS; push, pop: OP1; mov, xch: OP2; load, save: OP3; regs, vregs: SET); |
406 | R: REGS; |
- | |
407 | i: INTEGER; |
- | |
408 | 415 | VAR |
|
409 | BEGIN |
416 | i: INTEGER; |
410 | NEW(R); |
417 | |
Line 411... | Line 418... | ||
411 | 418 | BEGIN |
|
Line 425... | Line 432... | ||
425 | FOR i := 0 TO NVR - 1 DO |
432 | FOR i := 0 TO NVR - 1 DO |
426 | R.offs[i] := 0; |
433 | R.offs[i] := 0; |
427 | R.size[i] := 0 |
434 | R.size[i] := 0 |
428 | END |
435 | END |
Line 429... | Line -... | ||
429 | - | ||
430 | RETURN R |
436 | |
Line 431... | Line 437... | ||
431 | END Create; |
437 | END Init; |
432 | 438 |