Research V7 development
[unix-history] / usr / src / cmd / c / c13.c
CommitLineData
1a3b21a9
DR
1/*
2 * C second pass -- tables
3 */
4#include "c1.h"
5/*
6 * Operator dope table-- see description in c0.
7 */
8int 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
128char *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 */
251char mov[] "mov";
252char clr[] "clr";
253char cmp[] "cmp";
254char tst[] "tst";
255char add[] "add";
256char sub[] "sub";
257char inc[] "inc";
258char dec[] "dec";
259char mul[] "mul";
260char div[] "div";
261char asr[] "asr";
262char ash[] "ash";
263char asl[] "asl";
264char bic[] "bic";
265char bic1[] "bic $1,";
266char bit[] "bit";
267char bit1[] "bit $1,";
268char bis[] "bis";
269char bis1[] "bis $1,";
270char xor[] "xor";
271char neg[] "neg";
272char com[] "com";
273char stdol[] "*$";
274char ashc[] "ashc";
275char slmul[] "lmul";
276char sldiv[] "ldiv";
277char slrem[] "lrem";
278char almul[] "almul";
279char aldiv[] "aldiv";
280char alrem[] "alrem";
281char jeq[] "jeq";
282char jne[] "jne";
283char jle[] "jle";
284char jgt[] "jgt";
285char jlt[] "jlt";
286char jge[] "jge";
287char jlos[] "jlos";
288char jhi[] "jhi";
289char jlo[] "jlo";
290char jhis[] "jhis";
291char nop[] "/nop";
292char jbr[] "jbr";
293
294/*
295 * Instruction tables, accessed by
296 * I (first operand) or I' (second) macros.
297 */
298
299struct 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 */
364struct 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 };