xref: /inferno-os/limbo/optab.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 #include "limbo.h"
2 
3 uchar movetab[Mend][Tend] =
4 {
5 	/* Mas */
6 	{
7 		/* Tnone */	0,
8 		/* Tadt */	IMOVM,
9 		/* Tadtpick */	IMOVM,
10 		/* Tarray */	IMOVP,
11 		/* Tbig */	IMOVL,
12 		/* Tbyte */	IMOVB,
13 		/* Tchan */	IMOVP,
14 		/* Treal */	IMOVF,
15 		/* Tfn */	0,
16 		/* Tint */	IMOVW,
17 		/* Tlist */	IMOVP,
18 		/* Tmodule */	IMOVP,
19 		/* Tref */	IMOVP,
20 		/* Tstring */	IMOVP,
21 		/* Ttuple */	IMOVM,
22 		/* Texception */	IMOVM,
23 		/* Tfix */	IMOVW,
24 		/* Tpoly */	IMOVP,
25 
26 		/* Tainit */	0,
27 		/* Talt */	0,
28 		/* Tany */	IMOVP,
29 		/* Tarrow */	0,
30 		/* Tcase */	0,
31 		/* Tcasel */	0,
32 		/* Tcasec */	0,
33 		/* Tdot */	0,
34 		/* Terror */	0,
35 		/* Tgoto */	0,
36 		/* Tid */	0,
37 	},
38 	/* Mcons */
39 	{
40 		/* Tnone */	0,
41 		/* Tadt */	ICONSM,
42 		/* Tadtpick */	0,
43 		/* Tarray */	ICONSP,
44 		/* Tbig */	ICONSL,
45 		/* Tbyte */	ICONSB,
46 		/* Tchan */	ICONSP,
47 		/* Treal */	ICONSF,
48 		/* Tfn */	0,
49 		/* Tint */	ICONSW,
50 		/* Tlist */	ICONSP,
51 		/* Tmodule */	ICONSP,
52 		/* Tref */	ICONSP,
53 		/* Tstring */	ICONSP,
54 		/* Ttuple */	ICONSM,
55 		/* Texception */	ICONSM,
56 		/* Tfix */	ICONSW,
57 		/* Tpoly */	ICONSP,
58 
59 		/* Tainit */	0,
60 		/* Talt */	0,
61 		/* Tany */	ICONSP,
62 		/* Tarrow */	0,
63 		/* Tcase */	0,
64 		/* Tcasel */	0,
65 		/* Tcasec */	0,
66 		/* Tdot */	0,
67 		/* Terror */	0,
68 		/* Tgoto */	0,
69 		/* Tid */	0,
70 	},
71 	/* Mhd */
72 	{
73 		/* Tnone */	0,
74 		/* Tadt */	IHEADM,
75 		/* Tadtpick */	0,
76 		/* Tarray */	IHEADP,
77 		/* Tbig */	IHEADL,
78 		/* Tbyte */	IHEADB,
79 		/* Tchan */	IHEADP,
80 		/* Treal */	IHEADF,
81 		/* Tfn */	0,
82 		/* Tint */	IHEADW,
83 		/* Tlist */	IHEADP,
84 		/* Tmodule */	IHEADP,
85 		/* Tref */	IHEADP,
86 		/* Tstring */	IHEADP,
87 		/* Ttuple */	IHEADM,
88 		/* Texception */	IHEADM,
89 		/* Tfix */	IHEADW,
90 		/* Tpoly */	IHEADP,
91 
92 		/* Tainit */	0,
93 		/* Talt */	0,
94 		/* Tany */	IHEADP,
95 		/* Tarrow */	0,
96 		/* Tcase */	0,
97 		/* Tcasel */	0,
98 		/* Tcasec */	0,
99 		/* Tdot*/	0,
100 		/* Terror */	0,
101 		/* Tgoto */	0,
102 		/* Tid */	0,
103 	},
104 	/* Mtl */
105 	{
106 		/* Tnone */	0,
107 		/* Tadt */	0,
108 		/* Tadtpick */	0,
109 		/* Tarray */	0,
110 		/* Tbig */	0,
111 		/* Tbyte */	0,
112 		/* Tchan */	0,
113 		/* Treal */	0,
114 		/* Tfn */	0,
115 		/* Tint */	0,
116 		/* Tlist */	ITAIL,
117 		/* Tmodule */	0,
118 		/* Tref */	0,
119 		/* Tstring */	0,
120 		/* Ttuple */	0,
121 		/* Texception */	0,
122 		/* Tfix */	0,
123 		/* Tpoly */	0,
124 
125 		/* Tainit */	0,
126 		/* Talt */	0,
127 		/* Tany */	0,
128 		/* Tarrow */	0,
129 		/* Tcase */	0,
130 		/* Tcasel */	0,
131 		/* Tcasec */	0,
132 		/* Tdot */	0,
133 		/* Terror */	0,
134 		/* Tgoto */	0,
135 		/* Tid */	0,
136 	},
137 };
138 
139 uchar chantab[Tend] =
140 {
141 	/* Tnone */	0,
142 	/* Tadt */	INEWCM,
143 	/* Tadtpick */	0,
144 	/* Tarray */	INEWCP,
145 	/* Tbig */	INEWCL,
146 	/* Tbyte */	INEWCB,
147 	/* Tchan */	INEWCP,
148 	/* Treal */	INEWCF,
149 	/* Tfn */	0,
150 	/* Tint */	INEWCW,
151 	/* Tlist */	INEWCP,
152 	/* Tmodule */	INEWCP,
153 	/* Tref */	INEWCP,
154 	/* Tstring */	INEWCP,
155 	/* Ttuple */	INEWCM,
156 	/* Texception */	INEWCM,
157 	/* Tfix */	INEWCW,
158 	/* Tpoly */	INEWCP,
159 
160 	/* Tainit */	0,
161 	/* Talt */	0,
162 	/* Tany */	INEWCP,
163 	/* Tarrow */	0,
164 	/* Tcase */	0,
165 	/* Tcasel */	0,
166 	/* Tcasec */	0,
167 	/* Tdot */	0,
168 	/* Terror */	0,
169 	/* Tgoto */	0,
170 	/* Tid */	0,
171 };
172 
173 uchar disoptab[Oend+1][7] = {
174 	/* opcode	default	byte	word	big	real	string	fixed	*/
175 			{0},
176 	/* Oadd */	{0,	IADDB,	IADDW,	IADDL,	IADDF,	IADDC,	IADDW,},
177 	/* Oaddas */	{0,	IADDB,	IADDW,	IADDL,	IADDF,	IADDC,	IADDW,},
178 	/* Oadr */	{0},
179 	/* Oadtdecl */	{0},
180 	/* Oalt */	{0},
181 	/* Oand */	{0,	IANDB,	IANDW,	IANDL,	0,	0,	0,},
182 	/* Oandand */	{0},
183 	/* Oandas */	{0,	IANDB,	IANDW,	IANDL,	0, 	0,	0,},
184 	/* Oarray */	{0},
185 	/* Oas */	{0},
186 	/* Obreak */	{0},
187 	/* Ocall */	{0},
188 	/* Ocase */	{0},
189 	/* Ocast */	{0},
190 	/* Ochan */	{0},
191 	/* Ocomma */	{0},
192 	/* Ocomp */	{0},
193 	/* Ocondecl */	{0},
194 	/* Ocons */	{0},
195 	/* Oconst */	{0},
196 	/* Ocont */	{0},
197 	/* Odas */	{0},
198 	/* Odec */	{0,	ISUBB,	ISUBW,	ISUBL,	ISUBF,	0,	ISUBW,},
199 	/* Odiv */	{0,	IDIVB,	IDIVW,	IDIVL,	IDIVF,	0,	IDIVX,},
200 	/* Odivas */	{0,	IDIVB,	IDIVW,	IDIVL,	IDIVF,	0,	IDIVX,},
201 	/* Odo */	{0},
202 	/* Odot */	{0},
203 	/* Oelem */	{0},
204 	/* Oeq */	{IBEQW,	IBEQB,	IBEQW,	IBEQL,	IBEQF,	IBEQC,	IBEQW,},
205 	/* Oexcept */	{0},
206 	/* Oexdecl */	{0},
207 	/* Oexit */	{0},
208 	/* Oexp */	{0,	0,	IEXPW,	IEXPL,	IEXPF,	0,	0,},
209 	/* Oexpas */	{0,	0,	IEXPW,	IEXPL,	IEXPF,	0,	0,},
210 	/* Oexstmt */	{0},
211 	/* Ofielddecl */{0},
212 	/* Ofnptr */	{0},
213 	/* Ofor */	{0},
214 	/* Ofunc */	{0},
215 	/* Ogeq */	{0,	IBGEB,	IBGEW,	IBGEL,	IBGEF,	IBGEC,	IBGEW,},
216 	/* Ogt */	{0,	IBGTB,	IBGTW,	IBGTL,	IBGTF,	IBGTC,	IBGTW,},
217 	/* Ohd */	{0},
218 	/* Oif */	{0},
219 	/* Oimport */	{0},
220 	/* Oinc */	{0,	IADDB,	IADDW,	IADDL,	IADDF,	0,	IADDW,},
221 	/* Oind */	{0},
222 	/* Oindex */	{0,},
223 	/* Oinds */	{0,	0,	IINDC,	0,	0,	0,	0,},
224 	/* Oindx */	{0,	0,	IINDX,	0,	0,	0,	0,},
225 	/* Oinv */	{0},
226 	/* Ojmp */	{0},
227 	/* Olabel */	{0},
228 	/* Olen */	{ILENA,	0,	0,	0,	0,	ILENC,	0,},
229 	/* Oleq */	{0,	IBLEB,	IBLEW,	IBLEL,	IBLEF,	IBLEC,	IBLEW,},
230 	/* Oload */	{0},
231 	/* Olsh */	{0,	ISHLB,	ISHLW,	ISHLL,	0,	0,	0,},
232 	/* Olshas */	{0,	ISHLB,	ISHLW,	ISHLL,	0,	0,	0,},
233 	/* Olt */	{0,	IBLTB,	IBLTW,	IBLTL,	IBLTF,	IBLTC,	IBLTW,},
234 	/* Omdot */	{0},
235 	/* Omod */	{0,	IMODB,	IMODW,	IMODL,	0,	0,	0,},
236 	/* Omodas */	{0,	IMODB,	IMODW,	IMODL,	0,	0,	0,},
237 	/* Omoddecl */	{0},
238 	/* Omul */	{0,	IMULB,	IMULW,	IMULL,	IMULF,	0,	IMULX,},
239 	/* Omulas */	{0,	IMULB,	IMULW,	IMULL,	IMULF,	0,	IMULX,},
240 	/* Oname */	{0},
241 	/* Oneg */	{0,	0,	0,	0,	INEGF,	0, 	0,},
242 	/* Oneq */	{IBNEW,	IBNEB,	IBNEW,	IBNEL,	IBNEF,	IBNEC,	IBNEW,},
243 	/* Onot */	{0},
244 	/* Onothing */	{0},
245 	/* Oor */	{0,	IORB,	IORW,	IORL,	0,	0,	0,},
246 	/* Ooras */	{0,	IORB,	IORW,	IORL,	0,	0,	0,},
247 	/* Ooror */	{0},
248 	/* Opick */	{0},
249 	/* Opickdecl */	{0},
250 	/* Opredec */	{0},
251 	/* Opreinc */	{0},
252 	/* Oraise */	{0},
253 	/* Orange */	{0},
254 	/* Orcv */	{0},
255 	/* Oref */	{0},
256 	/* Oret */	{0},
257 	/* Orsh */	{0,	ISHRB,	ISHRW,	ISHRL,	0,	0,	0,},
258 	/* Orshas */	{0,	ISHRB,	ISHRW,	ISHRL,	0,	0,	0,},
259 	/* Oscope */	{0},
260 	/* Oself */	{0},
261 	/* Oseq */	{0},
262 	/* Oslice */	{ISLICEA,0,	0,	0,	0,	ISLICEC,	0,},
263 	/* Osnd */	{0},
264 	/* Ospawn */	{0},
265 	/* Osub */	{0,	ISUBB,	ISUBW,	ISUBL,	ISUBF,	0,	ISUBW,},
266 	/* Osubas */	{0,	ISUBB,	ISUBW,	ISUBL,	ISUBF,	0,	ISUBW,},
267 	/* Otagof */	{0},
268 	/* Otl */	{0},
269 	/* Otuple */	{0},
270 	/* Otype */	{0},
271 	/* Otypedecl */	{0},
272 	/* Oused */	{0},
273 	/* Ovardecl */	{0},
274 	/* Ovardecli */	{0},
275 	/* Owild */	{0},
276 	/* Oxor */	{0,	IXORB,	IXORW,	IXORL,	0,	0,	0,},
277 	/* Oxoras */	{0,	IXORB,	IXORW,	IXORL,	0,	0,	0,},
278 
279 	/* Oend	*/	{0}
280 };
281 
282 int setisused[] = {
283 	Oas,
284 	Odas,
285 	Oaddas,
286 	Osubas,
287 	Omulas,
288 	Odivas,
289 	Omodas,
290 	Oexpas,
291 	Oandas,
292 	Ooras,
293 	Oxoras,
294 	Olshas,
295 	Onothing,
296 	Orshas,
297 	Oinc,
298 	Odec,
299 	Opreinc,
300 	Opredec,
301 	Ocall,
302 	Oraise,
303 	Ospawn,
304 	Osnd,
305 	Orcv,
306 
307 	-1
308 };
309 
310 int setsideeffect[] = {
311 	Oas,
312 	Odas,
313 	Oaddas,
314 	Osubas,
315 	Omulas,
316 	Odivas,
317 	Omodas,
318 	Oexpas,
319 	Oandas,
320 	Ooras,
321 	Oxoras,
322 	Olshas,
323 	Orshas,
324 	Oinc,
325 	Odec,
326 	Opreinc,
327 	Opredec,
328 	Ocall,
329 	Oraise,
330 	Ospawn,
331 	Osnd,
332 	Orcv,
333 
334 	Oadr,
335 	Oarray,
336 	Ocast,
337 	Ochan,
338 	Ocons,
339 	Odiv,
340 	Odot,
341 	Oind,
342 	Oindex,
343 	Oinds,
344 	Oindx,
345 	Olen,
346 	Oload,
347 	Omod,
348 	Oref,
349 
350 	-1
351 };
352 
353 char *opname[Oend+1] = {
354 			"unknown",
355 	/* Oadd */	"+",
356 	/* Oaddas */	"+=",
357 	/* Oadr */	"adr",
358 	/* Oadtdecl */	"adtdecl",
359 	/* Oalt */	"alt",
360 	/* Oand */	"&",
361 	/* Oandand */	"&&",
362 	/* Oandas */	"&=",
363 	/* Oarray */	"array",
364 	/* Oas */	"=",
365 	/* Obreak */	"break",
366 	/* Ocall */	"call",
367 	/* Ocase */	"case",
368 	/* Ocast */	"cast",
369 	/* Ochan */	"chan",
370 	/* Ocomma */	",",
371 	/* Ocomp */	"~",
372 	/* Ocondecl */	"condecl",
373 	/* Ocons */	"::",
374 	/* Oconst */	"const",
375 	/* Ocont */	"continue",
376 	/* Odas */	":=",
377 	/* Odec */	"--",
378 	/* Odiv */	"/",
379 	/* Odivas */	"/=",
380 	/* Odo */	"do",
381 	/* Odot */	".",
382 	/* Oelem */	"elem",
383 	/* Oeq */	"==",
384 	/* Oexcept */	"except",
385 	/* Oexdecl */	"exdecl",
386 	/* Oexit */	"exit",
387 	/* Oexp */	"**",
388 	/* Oexpas */	"**=",
389 	/* Oexstmt */	"exstat",
390 	/* Ofielddecl */"fielddecl",
391 	/* Ofnptr */	"fnptr",
392 	/* Ofor */	"for",
393 	/* Ofunc */	"fn(){}",
394 	/* Ogeq */	">=",
395 	/* Ogt */	">",
396 	/* Ohd */	"hd",
397 	/* Oif */	"if",
398 	/* Oimport */	"import",
399 	/* Oinc */	"++",
400 	/* Oind */	"*",
401 	/* Oindex */	"index",
402 	/* Oinds */	"inds",
403 	/* Oindx */	"indx",
404 	/* Oinv */		"inv",
405 	/* Ojmp */	"jmp",
406 	/* Olabel */	"label",
407 	/* Olen */	"len",
408 	/* Oleq */	"<=",
409 	/* Oload */	"load",
410 	/* Olsh */	"<<",
411 	/* Olshas */	"<<=",
412 	/* Olt */	"<",
413 	/* Omdot */	"->",
414 	/* Omod */	"%",
415 	/* Omodas */	"%=",
416 	/* Omoddecl */	"moddecl",
417 	/* Omul */	"*",
418 	/* Omulas */	"*=",
419 	/* Oname */	"name",
420 	/* Oneg */	"-",
421 	/* Oneq */	"!=",
422 	/* Onot */	"!",
423 	/* Onothing */	"nothing",
424 	/* Oor */	"|",
425 	/* Ooras */	"|=",
426 	/* Ooror */	"||",
427 	/* Opick */	"pick",
428 	/* Opickdecl */	"pickdecl",
429 	/* Opredec */	"--",
430 	/* Opreinc */	"++",
431 	/* Oraise */	"raise",
432 	/* Orange */	"range",
433 	/* Orcv */	"<-",
434 	/* Oref */	"ref",
435 	/* Oret */	"return",
436 	/* Orsh */	">>",
437 	/* Orshas */	">>=",
438 	/* Oscope */	"scope",
439 	/* Oself */	"self",
440 	/* Oseq */	"seq",
441 	/* Oslice */	"slice",
442 	/* Osnd */	"<-=",
443 	/* Ospawn */	"spawn",
444 	/* Osub */	"-",
445 	/* Osubas */	"-=",
446 	/* Otl */	"tagof",
447 	/* Otl */	"tl",
448 	/* Otuple */	"tuple",
449 	/* Otype */	"type",
450 	/* Otypedecl */	"typedecl",
451 	/* Oused */	"used",
452 	/* Ovardecl */	"vardecl",
453 	/* Ovardecli */	"vardecli",
454 	/* Owild */	"*",
455 	/* Oxor */	"^",
456 	/* Oxoras */	"^=",
457 
458 	/* Oend */	"unknown"
459 };
460 
461 int setisbyteinst[] = {
462 	IMULB,
463 	ISUBB,
464 	IADDB,
465 	IDIVB,
466 	IORB,
467 	IXORB,
468 	ISHLB,
469 	ISHRB,
470 	IMODB,
471 	IANDB,
472 	IBEQB,
473 	IBNEB,
474 	IBLTB,
475 	IBLEB,
476 	IBGTB,
477 	IBGEB,
478 
479 	-1
480 };
481 
482 char *instname[256] = {
483 	"nop",
484 	"alt",
485 	"nbalt",
486 	"goto",
487 	"call",
488 	"frame",
489 	"spawn",
490 	"runt",
491 	"load",
492 	"mcall",
493 	"mspawn",
494 	"mframe",
495 	"ret",
496 	"jmp",
497 	"case",
498 	"exit",
499 	"new",
500 	"newa",
501 	"newcb",
502 	"newcw",
503 	"newcf",
504 	"newcp",
505 	"newcm",
506 	"newcmp",
507 	"send",
508 	"recv",
509 	"consb",
510 	"consw",
511 	"consp",
512 	"consf",
513 	"consm",
514 	"consmp",
515 	"headb",
516 	"headw",
517 	"headp",
518 	"headf",
519 	"headm",
520 	"headmp",
521 	"tail",
522 	"lea",
523 	"indx",
524 	"movp",
525 	"movm",
526 	"movmp",
527 	"movb",
528 	"movw",
529 	"movf",
530 	"cvtbw",
531 	"cvtwb",
532 	"cvtfw",
533 	"cvtwf",
534 	"cvtca",
535 	"cvtac",
536 	"cvtwc",
537 	"cvtcw",
538 	"cvtfc",
539 	"cvtcf",
540 	"addb",
541 	"addw",
542 	"addf",
543 	"subb",
544 	"subw",
545 	"subf",
546 	"mulb",
547 	"mulw",
548 	"mulf",
549 	"divb",
550 	"divw",
551 	"divf",
552 	"modw",
553 	"modb",
554 	"andb",
555 	"andw",
556 	"orb",
557 	"orw",
558 	"xorb",
559 	"xorw",
560 	"shlb",
561 	"shlw",
562 	"shrb",
563 	"shrw",
564 	"insc",
565 	"indc",
566 	"addc",
567 	"lenc",
568 	"lena",
569 	"lenl",
570 	"beqb",
571 	"bneb",
572 	"bltb",
573 	"bleb",
574 	"bgtb",
575 	"bgeb",
576 	"beqw",
577 	"bnew",
578 	"bltw",
579 	"blew",
580 	"bgtw",
581 	"bgew",
582 	"beqf",
583 	"bnef",
584 	"bltf",
585 	"blef",
586 	"bgtf",
587 	"bgef",
588 	"beqc",
589 	"bnec",
590 	"bltc",
591 	"blec",
592 	"bgtc",
593 	"bgec",
594 	"slicea",
595 	"slicela",
596 	"slicec",
597 	"indw",
598 	"indf",
599 	"indb",
600 	"negf",
601 	"movl",
602 	"addl",
603 	"subl",
604 	"divl",
605 	"modl",
606 	"mull",
607 	"andl",
608 	"orl",
609 	"xorl",
610 	"shll",
611 	"shrl",
612 	"bnel",
613 	"bltl",
614 	"blel",
615 	"bgtl",
616 	"bgel",
617 	"beql",
618 	"cvtlf",
619 	"cvtfl",
620 	"cvtlw",
621 	"cvtwl",
622 	"cvtlc",
623 	"cvtcl",
624 	"headl",
625 	"consl",
626 	"newcl",
627 	"casec",
628 	"indl",
629 	"movpc",
630 	"tcmp",
631 	"mnewz",
632 	"cvtrf",
633 	"cvtfr",
634 	"cvtws",
635 	"cvtsw",
636 	"lsrw",
637 	"lsrl",
638 	"eclr",
639 	"newz",
640 	"newaz",
641 	"raise",
642 	"casel",
643 	"mulx",
644 	"divx",
645 	"cvtxx",
646 	"mulx0",
647 	"divx0",
648 	"cvtxx0",
649 	"mulx1",
650 	"divx1",
651 	"cvtxx1",
652 	"cvtfx",
653 	"cvtxf",
654 	"expw",
655 	"expl",
656 	"expf",
657 	"self",
658 };
659