]> pd.if.org Git - mmurtl/blob - msamples/cm32m/optimize.h
autocommit for file dated 1995-01-17 09:02:22
[mmurtl] / msamples / cm32m / optimize.h
1 /*\r
2  * Peephole Optimizer for the C Minus32 386 compiler.\r
3  *\r
4  * The strategy behind the peephole optimizer is to keep the peephole\r
5  * buffer completly filled.  The list of optimizations is in priority order\r
6  * in the table below. Each buffer full is checked against each entry\r
7  * in the table.  Even after a substitution is made, the new substituted\r
8  * code is left in the buffer to check for further optimization.\r
9  * See the rules for table entries\r
10  * just prior to the table below.  All entries are searched even after\r
11  * new code is inserted to ensure all optimization sequences used.\r
12  *\r
13  * Copyright 1990 Dave Dunfield\r
14  * Copyright 1992 R.A. Burgess\r
15  */\r
16 #include <ctype.h>\r
17 #include <stdio.h>\r
18 #include <string.h>\r
19 #include <stdlib.h>\r
20 \r
21 #define OBUF_SIZE               10              /* number of entries in peephole buffer */\r
22 #define OLINE_SIZE              100             /* maximum size of input line */\r
23 #define OSYMBOLS                8               /* maximum # symbols per peep */\r
24 #define OSYMBOL_SIZE    25              /* maximum size of symbol */\r
25 \r
26 /*\r
27  * Peephole optimization table:\r
28  *\r
29  * Each two entries represent the instruction sequences:\r
30  * The first is the string of instructions to SEARCH for,\r
31  * the second is the optimized REPLACEMENT string.\r
32  *\r
33  * 1) The REPLACEMENT instructions are in reverse order!\r
34  * 2) The highest priority entries should be entered first in the table.\r
35  * 3) Tabs (\t) should begin each entry.\r
36  * 4) Linefeeds (\n) should end each except for the last entry of a line.\r
37  *\r
38  */\r
39 \r
40 char *peep_table[] = {\r
41 \r
42 /* 80386/80486 Optimizations */\r
43 \r
44 /* data movement & register usage optimizations */\r
45 \r
46 "\tMOV \200,\201\n\tMOV \201,\200",\r
47 "\tMOV \200,\201",\r
48 \r
49 "\tMOV \200,\201\n\tMOV \200,\202",\r
50 "\tMOV \200,\202",\r
51 \r
52 "\tMOV \200,\201\n\tMOV \202,\200\n\tMOV \201,\200",\r
53 "\tMOV \202,\200\n\tMOV \200,\201",\r
54 \r
55 "\tMOV EAX,\200\n\tMOV ECX,EAX",\r
56 "\tMOV ECX,\200",\r
57 \r
58 "\tMOV ESI,\200\n\tMOV EAX,ESI",\r
59 "\tMOV EAX,\200",\r
60 \r
61 "\tLEA ESI,\200\n\tMOV EAX,ESI",\r
62 "\tLEA EAX,\200",\r
63 \r
64 "\tPUSH EAX\n\tLEA ESI,\200\n\tMOV EAX,ESI\n\tPOP EBX\n\tADD EAX,EBX",\r
65 "\tADD EAX,ESI\n\tLEA ESI,\200",\r
66 \r
67 "\tPOP EBX\n\tMOV EAX,EBX",\r
68 "\tPOP EAX",\r
69 \r
70 /* indexing operations */\r
71 \r
72 "\tMOV ECX,32\n\tMUL ECX",\r
73 "\tSHL EAX,5",\r
74 \r
75 "\tMOV ECX,32\n\tIMUL ECX",\r
76 "\tSHL EAX,5",\r
77 \r
78 "\tMOV ECX,16\n\tMUL ECX",\r
79 "\tSHL EAX,4",\r
80 \r
81 "\tMOV ECX,16\n\tIMUL ECX",\r
82 "\tSHL EAX,4",\r
83 \r
84 "\tMOV ECX,8\n\tMUL ECX",\r
85 "\tSHL EAX,3",\r
86 \r
87 "\tMOV ECX,8\n\tIMUL ECX",\r
88 "\tSHL EAX,3",\r
89 \r
90 "\tMOV ECX,4\n\tMUL ECX",\r
91 "\tSHL EAX,2",\r
92 \r
93 "\tMOV ECX,4\n\tIMUL ECX",\r
94 "\tSHL EAX,2",\r
95 \r
96 "\tMOV ECX,2\n\tMUL ECX",\r
97 "\tSHL EAX,1",\r
98 \r
99 "\tMOV ECX,2\n\tIMUL ECX",\r
100 "\tSHL EAX,1",\r
101 \r
102 /* jump optimizations */\r
103 \r
104 "\tJMP \200\n\200:",\r
105 "\200:",\r
106 \r
107 "\tJMP \200\n\201:\n\200:",\r
108 "\200:\n\201:",\r
109 \r
110 "\tJMP \200\n\tJMP \201",\r
111 "\tJMP \200",\r
112 \r
113 "\tJNZ \200\n\tJMP \201\n\200:\n\tJMP \202\n\201:",\r
114 "\201:\n\tJMP \202\n\tJZ \201",\r
115 \r
116 "\tJZ \200\n\tJMP \201\n\200:\n\tJMP \202\n\201:",\r
117 "\201:\n\tJMP \202\n\tJNZ \201",\r
118 \r
119 "\tJNZ \200\n\tJMP \201\n\200:\n\tJMP SHORT \202",\r
120 "\tJMP \201\n\tJNZ \202",\r
121 \r
122 "\tJZ \200\n\tJMP \201\n\200:\n\tJMP SHORT \202",\r
123 "\tJMP \201\n\tJZ \202",\r
124 \r
125 /* conversion optimizations */\r
126 \r
127 "\tMOV AL,\200\n\tMOVSX EAX,AL",\r
128 "\tMOVSX EAX,BYTE PTR \200",\r
129 \r
130 "\tMOV AL,\200\n\tMOVZX EAX,AL",\r
131 "\tMOVZX EAX,BYTE PTR \200",\r
132 \r
133 "\tMOV AX,\200\n\tMOVSX EAX,AX",\r
134 "\tMOVSX EAX,WORD PTR \200",\r
135 \r
136 "\tMOV AX,\200\n\tMOVZX EAX,AX",\r
137 "\tMOVZX EAX,WORD PTR \200",\r
138 \r
139 /* comparisons to ECX, or MOV into EAX for compare (when not needed) */\r
140 \r
141 "\tMOV ECX,\200\n\tCMP EAX,ECX",\r
142 "\tCMP EAX,\200",\r
143 \r
144 "\tMOVSX ECX,BYTE PTR\200\n\tCMP EAX,ECX",\r
145 "\tCMP AL,BYTE PTR\200",\r
146 \r
147 "\tMOVZX ECX,BYTE PTR\200\n\tCMP EAX,ECX",\r
148 "\tCMP AL,BYTE PTR\200",\r
149 \r
150 /* stack/parameters */\r
151 \r
152 "\tMOV EAX,[\200\n\tPUSH EAX",\r
153 "\tPUSH DWORD PTR [\200",\r
154 \r
155 "\tMOV EAX,\200\n\tPUSH EAX",\r
156 "\tPUSH \200",\r
157 \r
158 /* more simple optimizations */\r
159 \r
160 "\tMOV EAX,0",\r
161 "\tXOR EAX,EAX",\r
162 \r
163 "\tMOV AX,0",\r
164 "\tXOR AX,AX",\r
165 \r
166 "\tMOV AL,0",\r
167 "\tXOR AL,AL",\r
168 \r
169 "\tMOV AL,0",\r
170 "\tXOR AL,AL",\r
171 \r
172 0 };\r
173 \r
174 /* circular peep hole buffer & read/write pointers */\r
175 \r
176         char peep_buffer[OBUF_SIZE][OLINE_SIZE];\r
177 \r
178         unsigned peep_top = 0,          /* first entry in circular buffer */\r
179                          peep_next = 0;         /* Next place to put new entry    */\r
180 \r
181         /* If ((next+1) mod n entries) == top then buffer is full */\r
182         /* If next == top then buffer is empty */\r
183 \r
184 /* Symbol table */\r
185 \r
186         char symbols[OSYMBOLS][OSYMBOL_SIZE];\r
187 \r
188 /* End of Optimize.h */\r
189 \r
190 /* candidates\r
191 OLD:\r
192         SHL EAX,2\r\r
193         MOV ESI,OFFSET xxxx\r\r
194         ADD ESI,EAX\r\r
195         MOV EAX,[ESI]\r\r
196 NEW:\r
197         MOV ESI,OFFSET xxxx\r\r
198         MOV EAX, [ESI+EAX*2]\r
199 \r
200 OLD:\r
201         ADD ESI,xx\r
202         MOV rr,nnn\r
203         MOV [ESI],rr\r
204 NEW\r
205         MOV rr,nnn\r
206         MOV [ESI+xx],rr\r
207 \r
208 OLD\r
209         ADD ESI,xx\r
210         MOV rr, [ESI]\r
211 NEW\r
212         MOV rr, [ESI+xx]\r
213 \r
214 \r
215 OLD (candidates):\r
216         ADD ESI,EAX\r
217         ADD ESI,4\r
218         MOVZX EAX,WORD PTR _CrntStrucDef\r
219         MOV [ESI],AX\r
220 \r
221         ADD ESI,EAX\r
222         MOV EAX,[EBP-16]\r
223         MOV [ESI],EAX\r
224 \r
225         ADD ESI,EAX\r
226         ADD ESI,10\r
227         MOVZX EAX,WORD PTR [ESI]\r
228 \r
229         ADD ESI,EAX\r
230         ADD ESI,8\r
231         MOV EAX,DWORD PTR [ESI]\r
232 \r
233         ADD ESI,EAX\r
234         MOV EAX,DWORD PTR [ESI]\r
235 \r
236 */\r