Commit | Line | Data |
---|---|---|
1a3b21a9 DR |
1 | /* |
2 | * C second pass -- tables | |
3 | */ | |
4 | #include "c1.h" | |
5 | /* | |
6 | * Operator dope table-- see description in c0. | |
7 | */ | |
8 | int opdope[] { | |
9 | 000000, /* EOFC */ | |
10 | 000000, /* ; */ | |
11 | 000000, /* { */ | |
12 | 000000, /* } */ | |
13 | 036000, /* [ */ | |
14 | 002000, /* ] */ | |
15 | 036000, /* ( */ | |
16 | 002000, /* ) */ | |
17 | 014201, /* : */ | |
18 | 007001, /* , */ | |
19 | 000000, /* field selection */ | |
20 | 000000, /* reverse field selection */ | |
21 | 000001, /* temporary field selection */ | |
22 | 000001, /* int->ptr */ | |
23 | 000001, /* ptr->int */ | |
24 | 000001, /* long->ptr */ | |
25 | 000001, /* field assignment */ | |
26 | 000001, /* >> unsigned */ | |
27 | 000001, /* >> unsigned */ | |
28 | 000000, /* 19 */ | |
29 | 000400, /* name */ | |
30 | 000400, /* short constant */ | |
31 | 000400, /* string */ | |
32 | 000400, /* float */ | |
33 | 000400, /* double */ | |
34 | 0000400, /* long const */ | |
35 | 000400, /* long const <= 16 bits */ | |
36 | 000400, /* autoi, *r++ */ | |
37 | 000400, /* autod, *--r */ | |
38 | 000000, /* 29 */ | |
39 | 034203, /* ++pre */ | |
40 | 034203, /* --pre */ | |
41 | 034203, /* ++post */ | |
42 | 034203, /* --post */ | |
43 | 034220, /* !un */ | |
44 | 034202, /* &un */ | |
45 | 034220, /* *un */ | |
46 | 034200, /* -un */ | |
47 | 034220, /* ~un */ | |
48 | 036001, /* . (structure reference) */ | |
49 | 030101, /* + */ | |
50 | 030001, /* - */ | |
51 | 032101, /* * */ | |
52 | 032001, /* / */ | |
53 | 032001, /* % */ | |
54 | 026061, /* >> */ | |
55 | 026061, /* << */ | |
56 | 020161, /* & */ | |
57 | 016161, /* | */ | |
58 | 016161, /* ^ */ | |
59 | 036001, /* -> */ | |
60 | 001000, /* int -> double */ | |
61 | 001000, /* double -> int */ | |
62 | 000001, /* && */ | |
63 | 000001, /* || */ | |
64 | 030001, /* &~ */ | |
65 | 001000, /* double -> long */ | |
66 | 001000, /* long -> double */ | |
67 | 001000, /* integer -> long */ | |
68 | 000000, /* long -> integer */ | |
69 | 022005, /* == */ | |
70 | 022005, /* != */ | |
71 | 024005, /* <= */ | |
72 | 024005, /* < */ | |
73 | 024005, /* >= */ | |
74 | 024005, /* > */ | |
75 | 024005, /* <p */ | |
76 | 024005, /* <=p */ | |
77 | 024005, /* >p */ | |
78 | 024005, /* >=p */ | |
79 | 012213, /* =+ */ | |
80 | 012213, /* =- */ | |
81 | 012213, /* =* */ | |
82 | 012213, /* =/ */ | |
83 | 012213, /* =% */ | |
84 | 012253, /* =>> */ | |
85 | 012253, /* =<< */ | |
86 | 012253, /* =& */ | |
87 | 012253, /* =| */ | |
88 | 012253, /* =^ */ | |
89 | 012213, /* = */ | |
90 | 030001, /* & for tests */ | |
91 | 032001, /* * (long) */ | |
92 | 032001, /* / (long) */ | |
93 | 032001, /* % (long) */ | |
94 | 012253, /* =& ~ */ | |
95 | 012213, /* =* (long) */ | |
96 | 012213, /* / (long) */ | |
97 | 012213, /* % (long) */ | |
98 | 000000, /* 89 */ | |
99 | 014201, /* ? */ | |
100 | 026061, /* long << */ | |
101 | 012253, /* long =<< */ | |
102 | 000101, /* max */ | |
103 | 000101, /* maxp */ | |
104 | 000101, /* min */ | |
105 | 000101, /* minp */ | |
106 | 000001, /* , */ | |
107 | 000000, /* 98 */ | |
108 | 000000, /* 99 */ | |
109 | 036001, /* call */ | |
110 | 036000, /* mcall */ | |
111 | 000000, /* goto */ | |
112 | 000000, /* jump cond */ | |
113 | 000000, /* branch cond */ | |
114 | 000400, /* set nregs */ | |
115 | 000000, /* 106 */ | |
116 | 000000, /* 107 */ | |
117 | 000000, /* 108 */ | |
118 | 000000, /* int->char */ | |
119 | 000000, /* force r0 */ | |
120 | 000000, /* 111 */ | |
121 | 000000, /* 112 */ | |
122 | 000000, /* 113 */ | |
123 | 000000, /* 114 */ | |
124 | 000000, /* structure assign */ | |
125 | 000001, /* struct assignment setup */ | |
126 | }; | |
127 | ||
128 | char *opntab[] { | |
129 | 0, | |
130 | 0, | |
131 | 0, | |
132 | 0, | |
133 | 0, | |
134 | 0, | |
135 | 0, | |
136 | 0, | |
137 | ":", | |
138 | ",", | |
139 | "field select", | |
140 | 0, | |
141 | 0, | |
142 | "int->ptr", | |
143 | "ptr->int", | |
144 | "long->ptr", | |
145 | "field assign", | |
146 | ">>", | |
147 | ">>", | |
148 | 0, | |
149 | "name", | |
150 | "short constant", | |
151 | "string", | |
152 | "float", | |
153 | "double", | |
154 | "long constant", | |
155 | "long constant", | |
156 | "*r++", | |
157 | "*--r", | |
158 | 0, | |
159 | "++pre", | |
160 | "--pre", | |
161 | "++post", | |
162 | "--post", | |
163 | "!un", | |
164 | "&", | |
165 | "*", | |
166 | "-", | |
167 | "~", | |
168 | ".", | |
169 | "+", | |
170 | "-", | |
171 | "*", | |
172 | "/", | |
173 | "%", | |
174 | ">>", | |
175 | "<<", | |
176 | "&", | |
177 | "|", | |
178 | "^", | |
179 | "->", | |
180 | "int->double", | |
181 | "double->int", | |
182 | "&&", | |
183 | "||", | |
184 | "&~", | |
185 | "double->long", | |
186 | "long->double", | |
187 | "integer->long", | |
188 | "long->integer", | |
189 | "==", | |
190 | "!=", | |
191 | "<=", | |
192 | "<", | |
193 | ">=", | |
194 | ">", | |
195 | "<p", | |
196 | "<=p", | |
197 | ">p", | |
198 | ">=p", | |
199 | "+=", | |
200 | "-=", | |
201 | "*=", | |
202 | "/=", | |
203 | "%=", | |
204 | ">>=", | |
205 | "<<=", | |
206 | "&=", | |
207 | "|=", | |
208 | "^=", | |
209 | "=", | |
210 | "& for tests", | |
211 | "*", | |
212 | "/", | |
213 | "%", | |
214 | "&= ~", | |
215 | "*=", | |
216 | "/=", | |
217 | "%=", | |
218 | 0, | |
219 | "?", | |
220 | "<<", | |
221 | "<<=", | |
222 | "\\/", | |
223 | "\\/", | |
224 | "/\\", | |
225 | "/\\", | |
226 | 0, | |
227 | "call", | |
228 | "call", | |
229 | "call", | |
230 | 0, | |
231 | "goto", | |
232 | "jump cond", | |
233 | "branch cond", | |
234 | "set nregs", | |
235 | "load value", | |
236 | 0, | |
237 | 0, | |
238 | "int->char", | |
239 | "force register", | |
240 | "", | |
241 | "", | |
242 | "", | |
243 | "", | |
244 | "=structure", | |
245 | "= (struct setup)", | |
246 | }; | |
247 | ||
248 | /* | |
249 | * Strings for instruction tables. | |
250 | */ | |
251 | char mov[] "mov"; | |
252 | char clr[] "clr"; | |
253 | char cmp[] "cmp"; | |
254 | char tst[] "tst"; | |
255 | char add[] "add"; | |
256 | char sub[] "sub"; | |
257 | char inc[] "inc"; | |
258 | char dec[] "dec"; | |
259 | char mul[] "mul"; | |
260 | char div[] "div"; | |
261 | char asr[] "asr"; | |
262 | char ash[] "ash"; | |
263 | char asl[] "asl"; | |
264 | char bic[] "bic"; | |
265 | char bic1[] "bic $1,"; | |
266 | char bit[] "bit"; | |
267 | char bit1[] "bit $1,"; | |
268 | char bis[] "bis"; | |
269 | char bis1[] "bis $1,"; | |
270 | char xor[] "xor"; | |
271 | char neg[] "neg"; | |
272 | char com[] "com"; | |
273 | char stdol[] "*$"; | |
274 | char ashc[] "ashc"; | |
275 | char slmul[] "lmul"; | |
276 | char sldiv[] "ldiv"; | |
277 | char slrem[] "lrem"; | |
278 | char almul[] "almul"; | |
279 | char aldiv[] "aldiv"; | |
280 | char alrem[] "alrem"; | |
281 | char jeq[] "jeq"; | |
282 | char jne[] "jne"; | |
283 | char jle[] "jle"; | |
284 | char jgt[] "jgt"; | |
285 | char jlt[] "jlt"; | |
286 | char jge[] "jge"; | |
287 | char jlos[] "jlos"; | |
288 | char jhi[] "jhi"; | |
289 | char jlo[] "jlo"; | |
290 | char jhis[] "jhis"; | |
291 | char nop[] "/nop"; | |
292 | char jbr[] "jbr"; | |
293 | ||
294 | /* | |
295 | * Instruction tables, accessed by | |
296 | * I (first operand) or I' (second) macros. | |
297 | */ | |
298 | ||
299 | struct instab instab[] { | |
300 | LOAD, mov, tst, | |
301 | ASSIGN, mov, clr, | |
302 | EQUAL, cmp, tst, | |
303 | NEQUAL, cmp, tst, | |
304 | LESSEQ, cmp, tst, | |
305 | LESS, cmp, tst, | |
306 | GREATEQ,cmp, tst, | |
307 | GREAT, cmp, tst, | |
308 | LESSEQP,cmp, tst, | |
309 | LESSP, cmp, tst, | |
310 | GREATQP,cmp, tst, | |
311 | GREATP, cmp, tst, | |
312 | PLUS, add, inc, | |
313 | ASPLUS, add, inc, | |
314 | MINUS, sub, dec, | |
315 | ASMINUS,sub, dec, | |
316 | INCBEF, add, inc, | |
317 | DECBEF, sub, dec, | |
318 | INCAFT, add, inc, | |
319 | DECAFT, sub, dec, | |
320 | TIMES, mul, mul, | |
321 | ASTIMES,mul, mul, | |
322 | DIVIDE, div, div, | |
323 | ASDIV, div, div, | |
324 | MOD, div, div, | |
325 | ASMOD, div, div, | |
326 | PTOI, div, div, | |
327 | RSHIFT, ash, asr, | |
328 | ASRSH, ash, asr, | |
329 | LSHIFT, ash, asl, | |
330 | ASLSH, ash, asl, | |
331 | AND, bic, bic1, | |
332 | ANDN, bic, bic1, | |
333 | ASANDN, bic, bic1, | |
334 | TAND, bit, bit1, | |
335 | OR, bis, bis1, | |
336 | ASOR, bis, bis1, | |
337 | EXOR, xor, xor, | |
338 | ASXOR, xor, xor, | |
339 | NEG, neg, neg, | |
340 | COMPL, com, com, | |
341 | CALL1, stdol, stdol, | |
342 | CALL2, "", "", | |
343 | LLSHIFT,ashc, ashc, | |
344 | ASLSHL, ashc, ashc, | |
345 | LTIMES, slmul, slmul, | |
346 | LDIV, sldiv, sldiv, | |
347 | LMOD, slrem, slrem, | |
348 | LASTIMES,almul, almul, | |
349 | LASDIV, aldiv, aldiv, | |
350 | LASMOD, alrem, alrem, | |
351 | ULSH, ashc, ashc, | |
352 | ASULSH, ashc, ashc, | |
353 | 0, 0, 0}; | |
354 | ||
355 | /* | |
356 | * Similar table for relationals. | |
357 | * The first string is for the positive | |
358 | * test, the second for the inverted one. | |
359 | * The '200+' entries are | |
360 | * used in tests against 0 where a 'tst' | |
361 | * instruction is used; it clears the c-bit | |
362 | * the c-bit so ptr tests are funny. | |
363 | */ | |
364 | struct instab branchtab[] { | |
365 | EQUAL, jeq, jne, | |
366 | NEQUAL, jne, jeq, | |
367 | LESSEQ, jle, jgt, | |
368 | LESS, jlt, jge, | |
369 | GREATEQ,jge, jlt, | |
370 | GREAT, jgt, jle, | |
371 | LESSEQP,jlos, jhi, | |
372 | LESSP, jlo, jhis, | |
373 | GREATQP,jhis, jlo, | |
374 | GREATP, jhi, jlos, | |
375 | 200+EQUAL, jeq, jne, | |
376 | 200+NEQUAL, jne, jeq, | |
377 | 200+LESSEQ, jle, jgt, | |
378 | 200+LESS, jlt, jge, | |
379 | 200+GREATEQ, jge, jlt, | |
380 | 200+GREAT, jgt, jle, | |
381 | 200+LESSEQP, jeq, jne, | |
382 | 200+LESSP, nop, jbr, | |
383 | 200+GREATQP, jbr, nop, | |
384 | 200+GREATP, jne, jeq, | |
385 | 0, 0, 0 }; |