|
|
1.1 root 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: 000400, /* () empty arglist */
39: 034213, /* ++pre */
40: 034213, /* --pre */
41: 034213, /* ++post */
42: 034213, /* --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: 030001, /* 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: 032001, /* unsigned / */
127: 032001, /* unsigned % */
128: 012213, /* unsigned /= */
129: 012213, /* unsigned %= */
130: };
131:
132: char *opntab[] = {
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: ":",
142: ",",
143: "field select",
144: 0,
145: 0,
146: "int->ptr",
147: "ptr->int",
148: "long->ptr",
149: "field assign",
150: ">>",
151: ">>",
152: 0,
153: "name",
154: "short constant",
155: "string",
156: "float",
157: "double",
158: "long constant",
159: "long constant",
160: "*r++",
161: "*--r",
162: "()",
163: "++pre",
164: "--pre",
165: "++post",
166: "--post",
167: "!un",
168: "&",
169: "*",
170: "-",
171: "~",
172: ".",
173: "+",
174: "-",
175: "*",
176: "/",
177: "%",
178: ">>",
179: "<<",
180: "&",
181: "|",
182: "^",
183: "->",
184: "int->double",
185: "double->int",
186: "&&",
187: "||",
188: "&~",
189: "double->long",
190: "long->double",
191: "integer->long",
192: "long->integer",
193: "==",
194: "!=",
195: "<=",
196: "<",
197: ">=",
198: ">",
199: "<p",
200: "<=p",
201: ">p",
202: ">=p",
203: "+=",
204: "-=",
205: "*=",
206: "/=",
207: "%=",
208: ">>=",
209: "<<=",
210: "&=",
211: "|=",
212: "^=",
213: "=",
214: "& for tests",
215: "*",
216: "/",
217: "%",
218: "&= ~",
219: "*=",
220: "/=",
221: "%=",
222: 0,
223: "?",
224: "<<",
225: "<<=",
226: "\\/",
227: "\\/",
228: "/\\",
229: "/\\",
230: 0,
231: "call",
232: "call",
233: "call",
234: 0,
235: "goto",
236: "jump cond",
237: "branch cond",
238: "set nregs",
239: "load value",
240: "ptr->integer",
241: 0,
242: "int->char",
243: "force register",
244: "",
245: "",
246: "",
247: "",
248: "=structure",
249: "= (struct setup)",
250: "/",
251: "%",
252: "/=",
253: "%=",
254: };
255:
256: /*
257: * Strings for instruction tables.
258: */
259: char mov[] = "mov";
260: char clr[] = "clr";
261: char cmp[] = "cmp";
262: char tst[] = "tst";
263: char add[] = "add";
264: char sub[] = "sub";
265: char inc[] = "inc";
266: char dec[] = "dec";
267: char mul[] = "mul";
268: char div[] = "div";
269: char asr[] = "asr";
270: char ash[] = "ash";
271: char asl[] = "asl";
272: char bic[] = "bic";
273: char bic1[] = "bic $1,";
274: char bit[] = "bit";
275: char bit1[] = "bit $1,";
276: char bis[] = "bis";
277: char bis1[] = "bis $1,";
278: char xor[] = "xor";
279: char neg[] = "neg";
280: char com[] = "com";
281: char stdol[] = "*$";
282: char ashc[] = "ashc";
283: char slmul[] = "lmul";
284: char sldiv[] = "ldiv";
285: char slrem[] = "lrem";
286: char almul[] = "almul";
287: char aldiv[] = "aldiv";
288: char alrem[] = "alrem";
289: char udiv[] = "udiv";
290: char urem[] = "urem";
291: char jeq[] = "jeq";
292: char jne[] = "jne";
293: char jle[] = "jle";
294: char jgt[] = "jgt";
295: char jlt[] = "jlt";
296: char jge[] = "jge";
297: char jlos[] = "jlos";
298: char jhi[] = "jhi";
299: char jlo[] = "jlo";
300: char jhis[] = "jhis";
301: char nop[] = "/nop";
302: char jbr[] = "jbr";
303:
304: /*
305: * Instruction tables, accessed by
306: * I (first operand) or I' (second) macros.
307: */
308:
309: struct instab instab[] = {
310: LOAD, mov, tst,
311: ASSIGN, mov, clr,
312: EQUAL, cmp, tst,
313: NEQUAL, cmp, tst,
314: LESSEQ, cmp, tst,
315: LESS, cmp, tst,
316: GREATEQ,cmp, tst,
317: GREAT, cmp, tst,
318: LESSEQP,cmp, tst,
319: LESSP, cmp, tst,
320: GREATQP,cmp, tst,
321: GREATP, cmp, tst,
322: PLUS, add, inc,
323: ASPLUS, add, inc,
324: MINUS, sub, dec,
325: ASMINUS,sub, dec,
326: INCBEF, add, inc,
327: DECBEF, sub, dec,
328: INCAFT, add, inc,
329: DECAFT, sub, dec,
330: TIMES, mul, mul,
331: ASTIMES,mul, mul,
332: DIVIDE, div, div,
333: ASDIV, div, div,
334: MOD, div, div,
335: ASMOD, div, div,
336: PTOI, div, div,
337: RSHIFT, ash, asr,
338: ASRSH, ash, asr,
339: LSHIFT, ash, asl,
340: ASLSH, ash, asl,
341: AND, bic, bic1,
342: ANDN, bic, bic1,
343: ASANDN, bic, bic1,
344: TAND, bit, bit1,
345: OR, bis, bis1,
346: ASOR, bis, bis1,
347: EXOR, xor, xor,
348: ASXOR, xor, xor,
349: NEG, neg, neg,
350: COMPL, com, com,
351: CALL1, stdol, stdol,
352: CALL2, "", "",
353: LLSHIFT,ashc, ashc,
354: ASLSHL, ashc, ashc,
355: LTIMES, slmul, slmul,
356: LDIV, sldiv, sldiv,
357: LMOD, slrem, slrem,
358: LASTIMES,almul, almul,
359: LASDIV, aldiv, aldiv,
360: LASMOD, alrem, alrem,
361: ULSH, ashc, ashc,
362: ASULSH, ashc, ashc,
363: UDIV, udiv, udiv,
364: UMOD, urem, urem,
365: ASUDIV, udiv, udiv,
366: ASUMOD, urem, urem,
367: 0, 0, 0};
368:
369: /*
370: * Similar table for relationals.
371: * The first string is for the positive
372: * test, the second for the inverted one.
373: * The '200+' entries are
374: * used in tests against 0 where a 'tst'
375: * instruction is used; it clears the c-bit
376: * the c-bit so ptr tests are funny.
377: */
378: struct instab branchtab[] = {
379: EQUAL, jeq, jne,
380: NEQUAL, jne, jeq,
381: LESSEQ, jle, jgt,
382: LESS, jlt, jge,
383: GREATEQ,jge, jlt,
384: GREAT, jgt, jle,
385: LESSEQP,jlos, jhi,
386: LESSP, jlo, jhis,
387: GREATQP,jhis, jlo,
388: GREATP, jhi, jlos,
389: 200+EQUAL, jeq, jne,
390: 200+NEQUAL, jne, jeq,
391: 200+LESSEQ, jle, jgt,
392: 200+LESS, jlt, jge,
393: 200+GREATEQ, jge, jlt,
394: 200+GREAT, jgt, jle,
395: 200+LESSEQP, jeq, jne,
396: 200+LESSP, nop, jbr,
397: 200+GREATQP, jbr, nop,
398: 200+GREATP, jne, jeq,
399: 0, 0, 0 };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.