996
|
1 #include "egobfi.h"
|
|
2 #include "optim2.h"
|
|
3
|
|
4 void optim2()
|
|
5 {
|
|
6 struct bfi *cur;
|
|
7
|
|
8 /* second-level optimization, searches for add-to loops */
|
|
9 for (pptr = 0; prog[pptr].cmd != FIN; pptr++) {
|
|
10 if (prog[pptr].cmd == LPO) {
|
|
11 cur = prog + pptr;
|
|
12 /* two types of add-tos:
|
|
13 >x +x <x -x
|
|
14 -x >x +x <x
|
|
15 */
|
|
16 if (cur[1].cmd == RHT &&
|
|
17 cur[3].cmd == RHT &&
|
|
18 cur[1].arg1 == cur[3].arg1 * -1 &&
|
|
19 cur[5].cmd == LPC) {
|
|
20 if (cur[2].cmd == ADD &&
|
|
21 cur[4].cmd == ADD &&
|
|
22 cur[4].arg1 == -1) {
|
|
23 /* YAY! */
|
|
24 cur->cmd = ADDTO;
|
|
25 cur->arg1 = cur[1].arg1;
|
|
26 cur->arg2 = cur[2].arg1;
|
|
27
|
|
28 cur[1].cmd = NIL;
|
|
29 cur[2].cmd = NIL;
|
|
30 cur[3].cmd = NIL;
|
|
31 cur[4].cmd = NIL;
|
|
32 cur[5].cmd = NIL;
|
|
33 pptr += 5;
|
|
34 }
|
|
35 } else if (cur[2].cmd == RHT &&
|
|
36 cur[4].cmd == RHT &&
|
|
37 cur[2].arg1 == cur[4].arg1 * -1 &&
|
|
38 cur[5].cmd == LPC) {
|
|
39 if (cur[1].cmd == ADD &&
|
|
40 cur[3].cmd == ADD &&
|
|
41 cur[1].arg1 == -1) {
|
|
42 /* YAY! */
|
|
43 cur->cmd = ADDTO;
|
|
44 cur->arg1 = cur[2].arg1;
|
|
45 cur->arg2 = cur[3].arg1;
|
|
46
|
|
47 cur[1].cmd = NIL;
|
|
48 cur[2].cmd = NIL;
|
|
49 cur[3].cmd = NIL;
|
|
50 cur[4].cmd = NIL;
|
|
51 cur[5].cmd = NIL;
|
|
52 pptr += 5;
|
|
53 }
|
|
54 }
|
|
55 }
|
|
56 }
|
|
57 pptr = 0;
|
|
58 }
|