xref: /inferno-os/libinterp/decgen.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "isa.h"
3*37da2899SCharles.Forsyth #include "interp.h"
4*37da2899SCharles.Forsyth 
5*37da2899SCharles.Forsyth void	decgen(int);
6*37da2899SCharles.Forsyth 
7*37da2899SCharles.Forsyth /*
8*37da2899SCharles.Forsyth  * Force intermediate dereference of $o(o(reg)) modes to ensure intermediate
9*37da2899SCharles.Forsyth  * pointer is valid. This is required if you want secure memory.
10*37da2899SCharles.Forsyth  */
11*37da2899SCharles.Forsyth #define	SOFTMMU		0
12*37da2899SCharles.Forsyth 
13*37da2899SCharles.Forsyth void
main(void)14*37da2899SCharles.Forsyth main(void)
15*37da2899SCharles.Forsyth {
16*37da2899SCharles.Forsyth 	int i;
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 	print("/* Machine generated by decgen.c */\n\n");
19*37da2899SCharles.Forsyth 
20*37da2899SCharles.Forsyth 	print("#include \"lib9.h\"\n");
21*37da2899SCharles.Forsyth 	print("#include \"isa.h\"\n");
22*37da2899SCharles.Forsyth 	print("#include \"interp.h\"\n\n");
23*37da2899SCharles.Forsyth 
24*37da2899SCharles.Forsyth 	print("#define DIND(reg, xxx) (uchar*)((*(ulong*)(R.reg+R.PC->xxx.i.f))+R.PC->xxx.i.s)\n");
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth 	for(i = 0; i < 256; i++)
27*37da2899SCharles.Forsyth 		decgen(i);
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth 	print("\nvoid	(*dec[])(void) =\n{\n");
30*37da2899SCharles.Forsyth 	for(i = 0; i < 256; i++)
31*37da2899SCharles.Forsyth 		print("\tD%.2uX%c\n", i, i != 255 ? ',' : ' ');
32*37da2899SCharles.Forsyth 	print("};\n");
33*37da2899SCharles.Forsyth }
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth void
decgen(int addr)36*37da2899SCharles.Forsyth decgen(int addr)
37*37da2899SCharles.Forsyth {
38*37da2899SCharles.Forsyth 	int nodst;
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth 	print("static void\nD%.2uX(void)\n{\n", addr);
41*37da2899SCharles.Forsyth 
42*37da2899SCharles.Forsyth 	switch(USRC(addr)) {
43*37da2899SCharles.Forsyth 	case AMP:
44*37da2899SCharles.Forsyth 		print("\tR.s = R.MP+R.PC->s.ind;\n");
45*37da2899SCharles.Forsyth 		break;
46*37da2899SCharles.Forsyth 	case AFP:
47*37da2899SCharles.Forsyth 		print("\tR.s = R.FP+R.PC->s.ind;\n");
48*37da2899SCharles.Forsyth 		break;
49*37da2899SCharles.Forsyth 	case AIMM:
50*37da2899SCharles.Forsyth 		print("\tR.s = (uchar*)&R.PC->s.imm;\n");
51*37da2899SCharles.Forsyth 		break;
52*37da2899SCharles.Forsyth 	case AMP|AIND:
53*37da2899SCharles.Forsyth 		if(SOFTMMU) {
54*37da2899SCharles.Forsyth 			print("R.s = R.MP+R.PC->s.i.f\n");
55*37da2899SCharles.Forsyth 			print("R.s = *(WORD**)R.s\n");
56*37da2899SCharles.Forsyth 			print("R.s = (uchar*)R.s + R.PC->s.i.s\n");
57*37da2899SCharles.Forsyth 		}
58*37da2899SCharles.Forsyth 		else
59*37da2899SCharles.Forsyth 			print("\tR.s = DIND(MP, s);\n");
60*37da2899SCharles.Forsyth 		break;
61*37da2899SCharles.Forsyth 	case AFP|AIND:
62*37da2899SCharles.Forsyth 		if(SOFTMMU) {
63*37da2899SCharles.Forsyth 			print("R.s = R.FP+R.PC->s.i.f\n");
64*37da2899SCharles.Forsyth 			print("R.s = *(WORD**)R.s\n");
65*37da2899SCharles.Forsyth 			print("R.s = (uchar*)R.s + R.PC->s.i.s\n");
66*37da2899SCharles.Forsyth 		}
67*37da2899SCharles.Forsyth 		else
68*37da2899SCharles.Forsyth 			print("\tR.s = DIND(FP, s);\n");
69*37da2899SCharles.Forsyth 		break;
70*37da2899SCharles.Forsyth 	}
71*37da2899SCharles.Forsyth 	nodst = 0;
72*37da2899SCharles.Forsyth 	switch(UDST(addr)) {
73*37da2899SCharles.Forsyth 	default:
74*37da2899SCharles.Forsyth 		nodst = 1;
75*37da2899SCharles.Forsyth 		break;
76*37da2899SCharles.Forsyth 	case AMP:
77*37da2899SCharles.Forsyth 		print("\tR.d = R.MP+R.PC->d.ind;\n");
78*37da2899SCharles.Forsyth 		break;
79*37da2899SCharles.Forsyth 	case AFP:
80*37da2899SCharles.Forsyth 		print("\tR.d = R.FP+R.PC->d.ind;\n");
81*37da2899SCharles.Forsyth 		break;
82*37da2899SCharles.Forsyth 	case AIMM:
83*37da2899SCharles.Forsyth 		print("\tR.d = (uchar*)&R.PC->d.imm;\n");
84*37da2899SCharles.Forsyth 		break;
85*37da2899SCharles.Forsyth 	case AMP|AIND:
86*37da2899SCharles.Forsyth 		if(SOFTMMU) {
87*37da2899SCharles.Forsyth 			print("R.d = R.MP+R.PC->d.i.f\n");
88*37da2899SCharles.Forsyth 			print("R.d = *(WORD**)R.d\n");
89*37da2899SCharles.Forsyth 			print("R.d = (uchar*)R.d + R.PC->d.i.s\n");
90*37da2899SCharles.Forsyth 		}
91*37da2899SCharles.Forsyth 		else
92*37da2899SCharles.Forsyth 			print("\tR.d = DIND(MP, d);\n");
93*37da2899SCharles.Forsyth 		break;
94*37da2899SCharles.Forsyth 	case AFP|AIND:
95*37da2899SCharles.Forsyth 		if(SOFTMMU) {
96*37da2899SCharles.Forsyth 			print("R.d = R.FP+R.PC->d.i.f\n");
97*37da2899SCharles.Forsyth 			print("R.d = *(WORD**)R.d\n");
98*37da2899SCharles.Forsyth 			print("R.d = (uchar*)R.d + R.PC->d.i.s\n");
99*37da2899SCharles.Forsyth 		}
100*37da2899SCharles.Forsyth 		else
101*37da2899SCharles.Forsyth 			print("\tR.d = DIND(FP, d);\n");
102*37da2899SCharles.Forsyth 		break;
103*37da2899SCharles.Forsyth 	}
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth 	if(nodst == 0)
106*37da2899SCharles.Forsyth 	switch(addr&ARM) {
107*37da2899SCharles.Forsyth 	case AXNON:
108*37da2899SCharles.Forsyth 		print("\tR.m = R.d;\n");
109*37da2899SCharles.Forsyth 		break;
110*37da2899SCharles.Forsyth 	case AXIMM:
111*37da2899SCharles.Forsyth 		print("\tR.t = (short)R.PC->reg;\n");
112*37da2899SCharles.Forsyth 		print("\tR.m = &R.t;\n");
113*37da2899SCharles.Forsyth 		break;
114*37da2899SCharles.Forsyth 	case AXINF:
115*37da2899SCharles.Forsyth 		print("\tR.m = R.FP+R.PC->reg;\n");
116*37da2899SCharles.Forsyth 		break;
117*37da2899SCharles.Forsyth 	case AXINM:
118*37da2899SCharles.Forsyth 		print("\tR.m = R.MP+R.PC->reg;\n");
119*37da2899SCharles.Forsyth 		break;
120*37da2899SCharles.Forsyth 	}
121*37da2899SCharles.Forsyth 	print("}\n");
122*37da2899SCharles.Forsyth }
123