xref: /plan9-contrib/sys/src/cmd/9a/lex.c (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
1*fbadb1c4SDavid du Colombier #define	EXTERN
2*fbadb1c4SDavid du Colombier #include "a.h"
3*fbadb1c4SDavid du Colombier #include "y.tab.h"
4*fbadb1c4SDavid du Colombier #include <ctype.h>
5*fbadb1c4SDavid du Colombier 
6*fbadb1c4SDavid du Colombier void
main(int argc,char * argv[])7*fbadb1c4SDavid du Colombier main(int argc, char *argv[])
8*fbadb1c4SDavid du Colombier {
9*fbadb1c4SDavid du Colombier 	char *p;
10*fbadb1c4SDavid du Colombier 	int nout, nproc, status, i, c;
11*fbadb1c4SDavid du Colombier 
12*fbadb1c4SDavid du Colombier 	thechar = '9';
13*fbadb1c4SDavid du Colombier 	thestring = "power64";
14*fbadb1c4SDavid du Colombier 	memset(debug, 0, sizeof(debug));
15*fbadb1c4SDavid du Colombier 	cinit();
16*fbadb1c4SDavid du Colombier 	outfile = 0;
17*fbadb1c4SDavid du Colombier 	include[ninclude++] = ".";
18*fbadb1c4SDavid du Colombier 	ARGBEGIN {
19*fbadb1c4SDavid du Colombier 	default:
20*fbadb1c4SDavid du Colombier 		c = ARGC();
21*fbadb1c4SDavid du Colombier 		if(c >= 0 || c < sizeof(debug))
22*fbadb1c4SDavid du Colombier 			debug[c] = 1;
23*fbadb1c4SDavid du Colombier 		break;
24*fbadb1c4SDavid du Colombier 
25*fbadb1c4SDavid du Colombier 	case 'o':
26*fbadb1c4SDavid du Colombier 		outfile = ARGF();
27*fbadb1c4SDavid du Colombier 		break;
28*fbadb1c4SDavid du Colombier 
29*fbadb1c4SDavid du Colombier 	case 'D':
30*fbadb1c4SDavid du Colombier 		p = ARGF();
31*fbadb1c4SDavid du Colombier 		if(p)
32*fbadb1c4SDavid du Colombier 			Dlist[nDlist++] = p;
33*fbadb1c4SDavid du Colombier 		break;
34*fbadb1c4SDavid du Colombier 
35*fbadb1c4SDavid du Colombier 	case 'I':
36*fbadb1c4SDavid du Colombier 		p = ARGF();
37*fbadb1c4SDavid du Colombier 		setinclude(p);
38*fbadb1c4SDavid du Colombier 		break;
39*fbadb1c4SDavid du Colombier 	} ARGEND
40*fbadb1c4SDavid du Colombier 	if(*argv == 0) {
41*fbadb1c4SDavid du Colombier 		print("usage: %ca [-options] file.s\n", thechar);
42*fbadb1c4SDavid du Colombier 		errorexit();
43*fbadb1c4SDavid du Colombier 	}
44*fbadb1c4SDavid du Colombier 	if(argc > 1 && systemtype(Windows)){
45*fbadb1c4SDavid du Colombier 		print("can't assemble multiple files on windows\n");
46*fbadb1c4SDavid du Colombier 		errorexit();
47*fbadb1c4SDavid du Colombier 	}
48*fbadb1c4SDavid du Colombier 	if(argc > 1) {
49*fbadb1c4SDavid du Colombier 		nproc = 1;
50*fbadb1c4SDavid du Colombier 		if(p = getenv("NPROC"))
51*fbadb1c4SDavid du Colombier 			nproc = atol(p);
52*fbadb1c4SDavid du Colombier 		c = 0;
53*fbadb1c4SDavid du Colombier 		nout = 0;
54*fbadb1c4SDavid du Colombier 		for(;;) {
55*fbadb1c4SDavid du Colombier 			while(nout < nproc && argc > 0) {
56*fbadb1c4SDavid du Colombier 				i = myfork();
57*fbadb1c4SDavid du Colombier 				if(i < 0) {
58*fbadb1c4SDavid du Colombier 					i = mywait(&status);
59*fbadb1c4SDavid du Colombier 					if(i < 0)
60*fbadb1c4SDavid du Colombier 						errorexit();
61*fbadb1c4SDavid du Colombier 					if(status)
62*fbadb1c4SDavid du Colombier 						c++;
63*fbadb1c4SDavid du Colombier 					nout--;
64*fbadb1c4SDavid du Colombier 					continue;
65*fbadb1c4SDavid du Colombier 				}
66*fbadb1c4SDavid du Colombier 				if(i == 0) {
67*fbadb1c4SDavid du Colombier 					print("%s:\n", *argv);
68*fbadb1c4SDavid du Colombier 					if(assemble(*argv))
69*fbadb1c4SDavid du Colombier 						errorexit();
70*fbadb1c4SDavid du Colombier 					exits(0);
71*fbadb1c4SDavid du Colombier 				}
72*fbadb1c4SDavid du Colombier 				nout++;
73*fbadb1c4SDavid du Colombier 				argc--;
74*fbadb1c4SDavid du Colombier 				argv++;
75*fbadb1c4SDavid du Colombier 			}
76*fbadb1c4SDavid du Colombier 			i = mywait(&status);
77*fbadb1c4SDavid du Colombier 			if(i < 0) {
78*fbadb1c4SDavid du Colombier 				if(c)
79*fbadb1c4SDavid du Colombier 					errorexit();
80*fbadb1c4SDavid du Colombier 				exits(0);
81*fbadb1c4SDavid du Colombier 			}
82*fbadb1c4SDavid du Colombier 			if(status)
83*fbadb1c4SDavid du Colombier 				c++;
84*fbadb1c4SDavid du Colombier 			nout--;
85*fbadb1c4SDavid du Colombier 		}
86*fbadb1c4SDavid du Colombier 	}
87*fbadb1c4SDavid du Colombier 	if(assemble(argv[0]))
88*fbadb1c4SDavid du Colombier 		errorexit();
89*fbadb1c4SDavid du Colombier 	exits(0);
90*fbadb1c4SDavid du Colombier }
91*fbadb1c4SDavid du Colombier 
92*fbadb1c4SDavid du Colombier int
assemble(char * file)93*fbadb1c4SDavid du Colombier assemble(char *file)
94*fbadb1c4SDavid du Colombier {
95*fbadb1c4SDavid du Colombier 	char ofile[100], incfile[20], *p;
96*fbadb1c4SDavid du Colombier 	int i, of;
97*fbadb1c4SDavid du Colombier 
98*fbadb1c4SDavid du Colombier 	strcpy(ofile, file);
99*fbadb1c4SDavid du Colombier 	if(p = strrchr(ofile, pathchar())) {
100*fbadb1c4SDavid du Colombier 		include[0] = ofile;
101*fbadb1c4SDavid du Colombier 		*p++ = 0;
102*fbadb1c4SDavid du Colombier 	} else
103*fbadb1c4SDavid du Colombier 		p = ofile;
104*fbadb1c4SDavid du Colombier 	if(outfile == 0) {
105*fbadb1c4SDavid du Colombier 		outfile = p;
106*fbadb1c4SDavid du Colombier 		if(p = strrchr(outfile, '.'))
107*fbadb1c4SDavid du Colombier 			if(p[1] == 's' && p[2] == 0)
108*fbadb1c4SDavid du Colombier 				p[0] = 0;
109*fbadb1c4SDavid du Colombier 		p = strrchr(outfile, 0);
110*fbadb1c4SDavid du Colombier 		p[0] = '.';
111*fbadb1c4SDavid du Colombier 		p[1] = thechar;
112*fbadb1c4SDavid du Colombier 		p[2] = 0;
113*fbadb1c4SDavid du Colombier 	}
114*fbadb1c4SDavid du Colombier 	p = getenv("INCLUDE");
115*fbadb1c4SDavid du Colombier 	if(p) {
116*fbadb1c4SDavid du Colombier 		setinclude(p);
117*fbadb1c4SDavid du Colombier 	} else {
118*fbadb1c4SDavid du Colombier 		if(systemtype(Plan9)) {
119*fbadb1c4SDavid du Colombier 			sprint(incfile,"/%s/include", thestring);
120*fbadb1c4SDavid du Colombier 			setinclude(strdup(incfile));
121*fbadb1c4SDavid du Colombier 		}
122*fbadb1c4SDavid du Colombier 	}
123*fbadb1c4SDavid du Colombier 
124*fbadb1c4SDavid du Colombier 	of = mycreat(outfile, 0664);
125*fbadb1c4SDavid du Colombier 	if(of < 0) {
126*fbadb1c4SDavid du Colombier 		yyerror("%ca: cannot create %s", thechar, outfile);
127*fbadb1c4SDavid du Colombier 		errorexit();
128*fbadb1c4SDavid du Colombier 	}
129*fbadb1c4SDavid du Colombier 	Binit(&obuf, of, OWRITE);
130*fbadb1c4SDavid du Colombier 
131*fbadb1c4SDavid du Colombier 	pass = 1;
132*fbadb1c4SDavid du Colombier 	nosched = 0;
133*fbadb1c4SDavid du Colombier 	pinit(file);
134*fbadb1c4SDavid du Colombier 	for(i=0; i<nDlist; i++)
135*fbadb1c4SDavid du Colombier 		dodefine(Dlist[i]);
136*fbadb1c4SDavid du Colombier 	yyparse();
137*fbadb1c4SDavid du Colombier 	if(nerrors) {
138*fbadb1c4SDavid du Colombier 		cclean();
139*fbadb1c4SDavid du Colombier 		return nerrors;
140*fbadb1c4SDavid du Colombier 	}
141*fbadb1c4SDavid du Colombier 
142*fbadb1c4SDavid du Colombier 	pass = 2;
143*fbadb1c4SDavid du Colombier 	nosched = 0;
144*fbadb1c4SDavid du Colombier 	outhist();
145*fbadb1c4SDavid du Colombier 	pinit(file);
146*fbadb1c4SDavid du Colombier 	for(i=0; i<nDlist; i++)
147*fbadb1c4SDavid du Colombier 		dodefine(Dlist[i]);
148*fbadb1c4SDavid du Colombier 	yyparse();
149*fbadb1c4SDavid du Colombier 	cclean();
150*fbadb1c4SDavid du Colombier 	return nerrors;
151*fbadb1c4SDavid du Colombier }
152*fbadb1c4SDavid du Colombier 
153*fbadb1c4SDavid du Colombier struct
154*fbadb1c4SDavid du Colombier {
155*fbadb1c4SDavid du Colombier 	char	*name;
156*fbadb1c4SDavid du Colombier 	ushort	type;
157*fbadb1c4SDavid du Colombier 	ushort	value;
158*fbadb1c4SDavid du Colombier } itab[] =
159*fbadb1c4SDavid du Colombier {
160*fbadb1c4SDavid du Colombier 	"SP",		LSP,	D_AUTO,
161*fbadb1c4SDavid du Colombier 	"SB",		LSB,	D_EXTERN,
162*fbadb1c4SDavid du Colombier 	"FP",		LFP,	D_PARAM,
163*fbadb1c4SDavid du Colombier 	"PC",		LPC,	D_BRANCH,
164*fbadb1c4SDavid du Colombier 
165*fbadb1c4SDavid du Colombier 	"LR",		LLR,	D_LR,
166*fbadb1c4SDavid du Colombier 	"CTR",		LCTR,	D_CTR,
167*fbadb1c4SDavid du Colombier 
168*fbadb1c4SDavid du Colombier 	"XER",		LSPREG,	D_XER,
169*fbadb1c4SDavid du Colombier 	"MSR",		LMSR,	D_MSR,
170*fbadb1c4SDavid du Colombier 	"FPSCR",	LFPSCR,	D_FPSCR,
171*fbadb1c4SDavid du Colombier 	"SPR",		LSPR,	D_SPR,
172*fbadb1c4SDavid du Colombier 	"DCR",		LSPR,	D_DCR,
173*fbadb1c4SDavid du Colombier 
174*fbadb1c4SDavid du Colombier 	"CR",		LCR,	0,
175*fbadb1c4SDavid du Colombier 	"CR0",		LCREG,	0,
176*fbadb1c4SDavid du Colombier 	"CR1",		LCREG,	1,
177*fbadb1c4SDavid du Colombier 	"CR2",		LCREG,	2,
178*fbadb1c4SDavid du Colombier 	"CR3",		LCREG,	3,
179*fbadb1c4SDavid du Colombier 	"CR4",		LCREG,	4,
180*fbadb1c4SDavid du Colombier 	"CR5",		LCREG,	5,
181*fbadb1c4SDavid du Colombier 	"CR6",		LCREG,	6,
182*fbadb1c4SDavid du Colombier 	"CR7",		LCREG,	7,
183*fbadb1c4SDavid du Colombier 
184*fbadb1c4SDavid du Colombier 	"R",		LR,	0,
185*fbadb1c4SDavid du Colombier 	"R0",		LREG,	0,
186*fbadb1c4SDavid du Colombier 	"R1",		LREG,	1,
187*fbadb1c4SDavid du Colombier 	"R2",		LREG,	2,
188*fbadb1c4SDavid du Colombier 	"R3",		LREG,	3,
189*fbadb1c4SDavid du Colombier 	"R4",		LREG,	4,
190*fbadb1c4SDavid du Colombier 	"R5",		LREG,	5,
191*fbadb1c4SDavid du Colombier 	"R6",		LREG,	6,
192*fbadb1c4SDavid du Colombier 	"R7",		LREG,	7,
193*fbadb1c4SDavid du Colombier 	"R8",		LREG,	8,
194*fbadb1c4SDavid du Colombier 	"R9",		LREG,	9,
195*fbadb1c4SDavid du Colombier 	"R10",		LREG,	10,
196*fbadb1c4SDavid du Colombier 	"R11",		LREG,	11,
197*fbadb1c4SDavid du Colombier 	"R12",		LREG,	12,
198*fbadb1c4SDavid du Colombier 	"R13",		LREG,	13,
199*fbadb1c4SDavid du Colombier 	"R14",		LREG,	14,
200*fbadb1c4SDavid du Colombier 	"R15",		LREG,	15,
201*fbadb1c4SDavid du Colombier 	"R16",		LREG,	16,
202*fbadb1c4SDavid du Colombier 	"R17",		LREG,	17,
203*fbadb1c4SDavid du Colombier 	"R18",		LREG,	18,
204*fbadb1c4SDavid du Colombier 	"R19",		LREG,	19,
205*fbadb1c4SDavid du Colombier 	"R20",		LREG,	20,
206*fbadb1c4SDavid du Colombier 	"R21",		LREG,	21,
207*fbadb1c4SDavid du Colombier 	"R22",		LREG,	22,
208*fbadb1c4SDavid du Colombier 	"R23",		LREG,	23,
209*fbadb1c4SDavid du Colombier 	"R24",		LREG,	24,
210*fbadb1c4SDavid du Colombier 	"R25",		LREG,	25,
211*fbadb1c4SDavid du Colombier 	"R26",		LREG,	26,
212*fbadb1c4SDavid du Colombier 	"R27",		LREG,	27,
213*fbadb1c4SDavid du Colombier 	"R28",		LREG,	28,
214*fbadb1c4SDavid du Colombier 	"R29",		LREG,	29,
215*fbadb1c4SDavid du Colombier 	"R30",		LREG,	30,
216*fbadb1c4SDavid du Colombier 	"R31",		LREG,	31,
217*fbadb1c4SDavid du Colombier 
218*fbadb1c4SDavid du Colombier 	"F",		LF,	0,
219*fbadb1c4SDavid du Colombier 	"F0",		LFREG,	0,
220*fbadb1c4SDavid du Colombier 	"F1",		LFREG,	1,
221*fbadb1c4SDavid du Colombier 	"F2",		LFREG,	2,
222*fbadb1c4SDavid du Colombier 	"F3",		LFREG,	3,
223*fbadb1c4SDavid du Colombier 	"F4",		LFREG,	4,
224*fbadb1c4SDavid du Colombier 	"F5",		LFREG,	5,
225*fbadb1c4SDavid du Colombier 	"F6",		LFREG,	6,
226*fbadb1c4SDavid du Colombier 	"F7",		LFREG,	7,
227*fbadb1c4SDavid du Colombier 	"F8",		LFREG,	8,
228*fbadb1c4SDavid du Colombier 	"F9",		LFREG,	9,
229*fbadb1c4SDavid du Colombier 	"F10",		LFREG,	10,
230*fbadb1c4SDavid du Colombier 	"F11",		LFREG,	11,
231*fbadb1c4SDavid du Colombier 	"F12",		LFREG,	12,
232*fbadb1c4SDavid du Colombier 	"F13",		LFREG,	13,
233*fbadb1c4SDavid du Colombier 	"F14",		LFREG,	14,
234*fbadb1c4SDavid du Colombier 	"F15",		LFREG,	15,
235*fbadb1c4SDavid du Colombier 	"F16",		LFREG,	16,
236*fbadb1c4SDavid du Colombier 	"F17",		LFREG,	17,
237*fbadb1c4SDavid du Colombier 	"F18",		LFREG,	18,
238*fbadb1c4SDavid du Colombier 	"F19",		LFREG,	19,
239*fbadb1c4SDavid du Colombier 	"F20",		LFREG,	20,
240*fbadb1c4SDavid du Colombier 	"F21",		LFREG,	21,
241*fbadb1c4SDavid du Colombier 	"F22",		LFREG,	22,
242*fbadb1c4SDavid du Colombier 	"F23",		LFREG,	23,
243*fbadb1c4SDavid du Colombier 	"F24",		LFREG,	24,
244*fbadb1c4SDavid du Colombier 	"F25",		LFREG,	25,
245*fbadb1c4SDavid du Colombier 	"F26",		LFREG,	26,
246*fbadb1c4SDavid du Colombier 	"F27",		LFREG,	27,
247*fbadb1c4SDavid du Colombier 	"F28",		LFREG,	28,
248*fbadb1c4SDavid du Colombier 	"F29",		LFREG,	29,
249*fbadb1c4SDavid du Colombier 	"F30",		LFREG,	30,
250*fbadb1c4SDavid du Colombier 	"F31",		LFREG,	31,
251*fbadb1c4SDavid du Colombier 
252*fbadb1c4SDavid du Colombier 	"CREQV",	LCROP, ACREQV,
253*fbadb1c4SDavid du Colombier 	"CRXOR",	LCROP, ACRXOR,
254*fbadb1c4SDavid du Colombier 	"CRAND",	LCROP, ACRAND,
255*fbadb1c4SDavid du Colombier 	"CROR",		LCROP, ACROR,
256*fbadb1c4SDavid du Colombier 	"CRANDN",	LCROP, ACRANDN,
257*fbadb1c4SDavid du Colombier 	"CRORN",	LCROP, ACRORN,
258*fbadb1c4SDavid du Colombier 	"CRNAND",	LCROP, ACRNAND,
259*fbadb1c4SDavid du Colombier 	"CRNOR",	LCROP, ACRNOR,
260*fbadb1c4SDavid du Colombier 
261*fbadb1c4SDavid du Colombier 	"ADD",		LADDW, AADD,
262*fbadb1c4SDavid du Colombier 	"ADDV",		LADDW, AADDV,
263*fbadb1c4SDavid du Colombier 	"ADDCC",	LADDW, AADDCC,
264*fbadb1c4SDavid du Colombier 	"ADDVCC",	LADDW, AADDVCC,
265*fbadb1c4SDavid du Colombier 	"ADDC",		LADDW, AADDC,
266*fbadb1c4SDavid du Colombier 	"ADDCV",	LADDW, AADDCV,
267*fbadb1c4SDavid du Colombier 	"ADDCCC",	LADDW, AADDCCC,
268*fbadb1c4SDavid du Colombier 	"ADDCVCC",	LADDW, AADDCVCC,
269*fbadb1c4SDavid du Colombier 	"ADDE",		LLOGW, AADDE,
270*fbadb1c4SDavid du Colombier 	"ADDEV",	LLOGW, AADDEV,
271*fbadb1c4SDavid du Colombier 	"ADDECC",	LLOGW, AADDECC,
272*fbadb1c4SDavid du Colombier 	"ADDEVCC",	LLOGW, AADDEVCC,
273*fbadb1c4SDavid du Colombier 
274*fbadb1c4SDavid du Colombier 	"ADDME",	LABS, AADDME,
275*fbadb1c4SDavid du Colombier 	"ADDMEV",	LABS, AADDMEV,
276*fbadb1c4SDavid du Colombier 	"ADDMECC",	LABS, AADDMECC,
277*fbadb1c4SDavid du Colombier 	"ADDMEVCC",	LABS, AADDMEVCC,
278*fbadb1c4SDavid du Colombier 	"ADDZE",	LABS, AADDZE,
279*fbadb1c4SDavid du Colombier 	"ADDZEV",	LABS, AADDZEV,
280*fbadb1c4SDavid du Colombier 	"ADDZECC",	LABS, AADDZECC,
281*fbadb1c4SDavid du Colombier 	"ADDZEVCC",	LABS, AADDZEVCC,
282*fbadb1c4SDavid du Colombier 
283*fbadb1c4SDavid du Colombier 	"SUB",		LADDW, ASUB,
284*fbadb1c4SDavid du Colombier 	"SUBV",		LADDW, ASUBV,
285*fbadb1c4SDavid du Colombier 	"SUBCC",	LADDW, ASUBCC,
286*fbadb1c4SDavid du Colombier 	"SUBVCC",	LADDW, ASUBVCC,
287*fbadb1c4SDavid du Colombier 	"SUBE",		LLOGW, ASUBE,
288*fbadb1c4SDavid du Colombier 	"SUBECC",	LLOGW, ASUBECC,
289*fbadb1c4SDavid du Colombier 	"SUBEV",	LLOGW, ASUBEV,
290*fbadb1c4SDavid du Colombier 	"SUBEVCC",	LLOGW, ASUBEVCC,
291*fbadb1c4SDavid du Colombier 	"SUBC",		LADDW, ASUBC,
292*fbadb1c4SDavid du Colombier 	"SUBCCC",	LADDW, ASUBCCC,
293*fbadb1c4SDavid du Colombier 	"SUBCV",	LADDW, ASUBCV,
294*fbadb1c4SDavid du Colombier 	"SUBCVCC",	LADDW, ASUBCVCC,
295*fbadb1c4SDavid du Colombier 
296*fbadb1c4SDavid du Colombier 	"SUBME",	LABS, ASUBME,
297*fbadb1c4SDavid du Colombier 	"SUBMEV",	LABS, ASUBMEV,
298*fbadb1c4SDavid du Colombier 	"SUBMECC",	LABS, ASUBMECC,
299*fbadb1c4SDavid du Colombier 	"SUBMEVCC",	LABS, ASUBMEVCC,
300*fbadb1c4SDavid du Colombier 	"SUBZE",	LABS, ASUBZE,
301*fbadb1c4SDavid du Colombier 	"SUBZEV",	LABS, ASUBZEV,
302*fbadb1c4SDavid du Colombier 	"SUBZECC",	LABS, ASUBZECC,
303*fbadb1c4SDavid du Colombier 	"SUBZEVCC",	LABS, ASUBZEVCC,
304*fbadb1c4SDavid du Colombier 
305*fbadb1c4SDavid du Colombier 	"AND",		LADDW, AAND,
306*fbadb1c4SDavid du Colombier 	"ANDCC",	LADDW, AANDCC,	/* includes andil & andiu */
307*fbadb1c4SDavid du Colombier 	"ANDN",		LLOGW, AANDN,
308*fbadb1c4SDavid du Colombier 	"ANDNCC",	LLOGW, AANDNCC,
309*fbadb1c4SDavid du Colombier 	"EQV",		LLOGW, AEQV,
310*fbadb1c4SDavid du Colombier 	"EQVCC",	LLOGW, AEQVCC,
311*fbadb1c4SDavid du Colombier 	"NAND",		LLOGW, ANAND,
312*fbadb1c4SDavid du Colombier 	"NANDCC",	LLOGW, ANANDCC,
313*fbadb1c4SDavid du Colombier 	"NOR",		LLOGW, ANOR,
314*fbadb1c4SDavid du Colombier 	"NORCC",	LLOGW, ANORCC,
315*fbadb1c4SDavid du Colombier 	"OR",		LADDW, AOR,	/* includes oril & oriu */
316*fbadb1c4SDavid du Colombier 	"ORCC",		LADDW, AORCC,
317*fbadb1c4SDavid du Colombier 	"ORN",		LLOGW, AORN,
318*fbadb1c4SDavid du Colombier 	"ORNCC",	LLOGW, AORNCC,
319*fbadb1c4SDavid du Colombier 	"XOR",		LADDW, AXOR,	/* includes xoril & xoriu */
320*fbadb1c4SDavid du Colombier 	"XORCC",	LLOGW, AXORCC,
321*fbadb1c4SDavid du Colombier 
322*fbadb1c4SDavid du Colombier 	"EXTSB",	LABS,	AEXTSB,
323*fbadb1c4SDavid du Colombier 	"EXTSBCC",	LABS,	AEXTSBCC,
324*fbadb1c4SDavid du Colombier 	"EXTSH",	LABS, AEXTSH,
325*fbadb1c4SDavid du Colombier 	"EXTSHCC",	LABS, AEXTSHCC,
326*fbadb1c4SDavid du Colombier 
327*fbadb1c4SDavid du Colombier 	"CNTLZW",	LABS, ACNTLZW,
328*fbadb1c4SDavid du Colombier 	"CNTLZWCC",	LABS, ACNTLZWCC,
329*fbadb1c4SDavid du Colombier 
330*fbadb1c4SDavid du Colombier 	"RLWMI",	LRLWM, ARLWMI,
331*fbadb1c4SDavid du Colombier 	"RLWMICC",	LRLWM, ARLWMICC,
332*fbadb1c4SDavid du Colombier 	"RLWNM",	LRLWM, ARLWNM,
333*fbadb1c4SDavid du Colombier 	"RLWNMCC", LRLWM, ARLWNMCC,
334*fbadb1c4SDavid du Colombier 
335*fbadb1c4SDavid du Colombier 	"SLW",		LSHW, ASLW,
336*fbadb1c4SDavid du Colombier 	"SLWCC",	LSHW, ASLWCC,
337*fbadb1c4SDavid du Colombier 	"SRW",		LSHW, ASRW,
338*fbadb1c4SDavid du Colombier 	"SRWCC",	LSHW, ASRWCC,
339*fbadb1c4SDavid du Colombier 	"SRAW",		LSHW, ASRAW,
340*fbadb1c4SDavid du Colombier 	"SRAWCC",	LSHW, ASRAWCC,
341*fbadb1c4SDavid du Colombier 
342*fbadb1c4SDavid du Colombier 	"BR",		LBRA, ABR,
343*fbadb1c4SDavid du Colombier 	"BC",		LBRA, ABC,
344*fbadb1c4SDavid du Colombier 	"BCL",		LBRA, ABC,
345*fbadb1c4SDavid du Colombier 	"BL",		LBRA, ABL,
346*fbadb1c4SDavid du Colombier 	"BEQ",		LBRA, ABEQ,
347*fbadb1c4SDavid du Colombier 	"BNE",		LBRA, ABNE,
348*fbadb1c4SDavid du Colombier 	"BGT",		LBRA, ABGT,
349*fbadb1c4SDavid du Colombier 	"BGE",		LBRA, ABGE,
350*fbadb1c4SDavid du Colombier 	"BLT",		LBRA, ABLT,
351*fbadb1c4SDavid du Colombier 	"BLE",		LBRA, ABLE,
352*fbadb1c4SDavid du Colombier 	"BVC",		LBRA, ABVC,
353*fbadb1c4SDavid du Colombier 	"BVS",		LBRA, ABVS,
354*fbadb1c4SDavid du Colombier 
355*fbadb1c4SDavid du Colombier 	"CMP",		LCMP, ACMP,
356*fbadb1c4SDavid du Colombier 	"CMPU",		LCMP, ACMPU,
357*fbadb1c4SDavid du Colombier 
358*fbadb1c4SDavid du Colombier 	"DIVW",		LLOGW, ADIVW,
359*fbadb1c4SDavid du Colombier 	"DIVWV",	LLOGW, ADIVWV,
360*fbadb1c4SDavid du Colombier 	"DIVWCC",	LLOGW, ADIVWCC,
361*fbadb1c4SDavid du Colombier 	"DIVWVCC",	LLOGW, ADIVWVCC,
362*fbadb1c4SDavid du Colombier 	"DIVWU",	LLOGW, ADIVWU,
363*fbadb1c4SDavid du Colombier 	"DIVWUV",	LLOGW, ADIVWUV,
364*fbadb1c4SDavid du Colombier 	"DIVWUCC",	LLOGW, ADIVWUCC,
365*fbadb1c4SDavid du Colombier 	"DIVWUVCC",	LLOGW, ADIVWUVCC,
366*fbadb1c4SDavid du Colombier 
367*fbadb1c4SDavid du Colombier 	"FABS",		LFCONV,	AFABS,
368*fbadb1c4SDavid du Colombier 	"FABSCC",	LFCONV,	AFABSCC,
369*fbadb1c4SDavid du Colombier 	"FNEG",		LFCONV,	AFNEG,
370*fbadb1c4SDavid du Colombier 	"FNEGCC",	LFCONV,	AFNEGCC,
371*fbadb1c4SDavid du Colombier 	"FNABS",	LFCONV,	AFNABS,
372*fbadb1c4SDavid du Colombier 	"FNABSCC",	LFCONV,	AFNABSCC,
373*fbadb1c4SDavid du Colombier 
374*fbadb1c4SDavid du Colombier 	"FADD",		LFADD,	AFADD,
375*fbadb1c4SDavid du Colombier 	"FADDCC",	LFADD,	AFADDCC,
376*fbadb1c4SDavid du Colombier 	"FSUB",		LFADD,  AFSUB,
377*fbadb1c4SDavid du Colombier 	"FSUBCC",	LFADD,	AFSUBCC,
378*fbadb1c4SDavid du Colombier 	"FMUL",		LFADD,	AFMUL,
379*fbadb1c4SDavid du Colombier 	"FMULCC",	LFADD,	AFMULCC,
380*fbadb1c4SDavid du Colombier 	"FDIV",		LFADD,	AFDIV,
381*fbadb1c4SDavid du Colombier 	"FDIVCC",	LFADD,	AFDIVCC,
382*fbadb1c4SDavid du Colombier 	"FRSP",		LFCONV,	AFRSP,
383*fbadb1c4SDavid du Colombier 	"FRSPCC",	LFCONV,	AFRSPCC,
384*fbadb1c4SDavid du Colombier 	"FCTIW",	LFCONV,	AFCTIW,
385*fbadb1c4SDavid du Colombier 	"FCTIWCC",	LFCONV,	AFCTIWCC,
386*fbadb1c4SDavid du Colombier 	"FCTIWZ",	LFCONV,	AFCTIWZ,
387*fbadb1c4SDavid du Colombier 	"FCTIWZCC",	LFCONV,	AFCTIWZCC,
388*fbadb1c4SDavid du Colombier 
389*fbadb1c4SDavid du Colombier 	"FMADD",	LFMA, AFMADD,
390*fbadb1c4SDavid du Colombier 	"FMADDCC",	LFMA, AFMADDCC,
391*fbadb1c4SDavid du Colombier 	"FMSUB",	LFMA, AFMSUB,
392*fbadb1c4SDavid du Colombier 	"FMSUBCC",	LFMA, AFMSUBCC,
393*fbadb1c4SDavid du Colombier 	"FNMADD",	LFMA, AFNMADD,
394*fbadb1c4SDavid du Colombier 	"FNMADDCC",	LFMA, AFNMADDCC,
395*fbadb1c4SDavid du Colombier 	"FNMSUB",	LFMA, AFNMSUB,
396*fbadb1c4SDavid du Colombier 	"FNMSUBCC",	LFMA, AFNMSUBCC,
397*fbadb1c4SDavid du Colombier 	"FMADDS",	LFMA, AFMADDS,
398*fbadb1c4SDavid du Colombier 	"FMADDSCC",	LFMA, AFMADDSCC,
399*fbadb1c4SDavid du Colombier 	"FMSUBS",	LFMA, AFMSUBS,
400*fbadb1c4SDavid du Colombier 	"FMSUBSCC",	LFMA, AFMSUBSCC,
401*fbadb1c4SDavid du Colombier 	"FNMADDS",	LFMA, AFNMADDS,
402*fbadb1c4SDavid du Colombier 	"FNMADDSCC",	LFMA, AFNMADDSCC,
403*fbadb1c4SDavid du Colombier 	"FNMSUBS",	LFMA, AFNMSUBS,
404*fbadb1c4SDavid du Colombier 	"FNMSUBSCC",	LFMA, AFNMSUBSCC,
405*fbadb1c4SDavid du Colombier 
406*fbadb1c4SDavid du Colombier 	"FCMPU",	LFCMP, AFCMPU,
407*fbadb1c4SDavid du Colombier 	"FCMPO",	LFCMP, AFCMPO,
408*fbadb1c4SDavid du Colombier 	"MTFSB0",	LMTFSB, AMTFSB0,
409*fbadb1c4SDavid du Colombier 	"MTFSB1",	LMTFSB,	AMTFSB1,
410*fbadb1c4SDavid du Colombier 
411*fbadb1c4SDavid du Colombier 	"FMOVD",	LFMOV, AFMOVD,
412*fbadb1c4SDavid du Colombier 	"FMOVS",	LFMOV, AFMOVS,
413*fbadb1c4SDavid du Colombier 	"FMOVDCC",	LFCONV,	AFMOVDCC,	/* fmr. */
414*fbadb1c4SDavid du Colombier 
415*fbadb1c4SDavid du Colombier 	"GLOBL",	LTEXT, AGLOBL,
416*fbadb1c4SDavid du Colombier 
417*fbadb1c4SDavid du Colombier 	"MOVB",		LMOVB, AMOVB,
418*fbadb1c4SDavid du Colombier 	"MOVBZ",	LMOVB, AMOVBZ,
419*fbadb1c4SDavid du Colombier 	"MOVBU",	LMOVB, AMOVBU,
420*fbadb1c4SDavid du Colombier 	"MOVBZU", LMOVB, AMOVBZU,
421*fbadb1c4SDavid du Colombier 	"MOVH",		LMOVB, AMOVH,
422*fbadb1c4SDavid du Colombier 	"MOVHZ",	LMOVB, AMOVHZ,
423*fbadb1c4SDavid du Colombier 	"MOVHU",	LMOVB, AMOVHU,
424*fbadb1c4SDavid du Colombier 	"MOVHZU", LMOVB, AMOVHZU,
425*fbadb1c4SDavid du Colombier 	"MOVHBR", 	LXMV, AMOVHBR,
426*fbadb1c4SDavid du Colombier 	"MOVWBR",	LXMV, AMOVWBR,
427*fbadb1c4SDavid du Colombier 	"MOVW",		LMOVW, AMOVW,
428*fbadb1c4SDavid du Colombier 	"MOVWU",	LMOVW, AMOVWU,
429*fbadb1c4SDavid du Colombier 	"MOVMW",	LMOVMW, AMOVMW,
430*fbadb1c4SDavid du Colombier 	"MOVFL",	LMOVW,	AMOVFL,
431*fbadb1c4SDavid du Colombier 
432*fbadb1c4SDavid du Colombier 	"MULLW",	LADDW, AMULLW,		/* includes multiply immediate 10-139 */
433*fbadb1c4SDavid du Colombier 	"MULLWV",	LLOGW, AMULLWV,
434*fbadb1c4SDavid du Colombier 	"MULLWCC",	LLOGW, AMULLWCC,
435*fbadb1c4SDavid du Colombier 	"MULLWVCC",	LLOGW, AMULLWVCC,
436*fbadb1c4SDavid du Colombier 
437*fbadb1c4SDavid du Colombier 	"MULHW",	LLOGW, AMULHW,
438*fbadb1c4SDavid du Colombier 	"MULHWCC",	LLOGW, AMULHWCC,
439*fbadb1c4SDavid du Colombier 	"MULHWU",	LLOGW, AMULHWU,
440*fbadb1c4SDavid du Colombier 	"MULHWUCC",	LLOGW, AMULHWUCC,
441*fbadb1c4SDavid du Colombier 
442*fbadb1c4SDavid du Colombier 	"NEG",		LABS, ANEG,
443*fbadb1c4SDavid du Colombier 	"NEGV",		LABS, ANEGV,
444*fbadb1c4SDavid du Colombier 	"NEGCC",	LABS, ANEGCC,
445*fbadb1c4SDavid du Colombier 	"NEGVCC",	LABS, ANEGVCC,
446*fbadb1c4SDavid du Colombier 
447*fbadb1c4SDavid du Colombier 	"NOP",		LNOP, ANOP,	/* ori 0,0,0 */
448*fbadb1c4SDavid du Colombier 	"SYSCALL",	LNOP, ASYSCALL,
449*fbadb1c4SDavid du Colombier 
450*fbadb1c4SDavid du Colombier 	"RETURN",	LRETRN, ARETURN,
451*fbadb1c4SDavid du Colombier 	"RFI",		LRETRN,	ARFI,
452*fbadb1c4SDavid du Colombier 	"RFCI",		LRETRN,	ARFCI,
453*fbadb1c4SDavid du Colombier 
454*fbadb1c4SDavid du Colombier 	"DATA",		LDATA, ADATA,
455*fbadb1c4SDavid du Colombier 	"END",		LEND, AEND,
456*fbadb1c4SDavid du Colombier 	"TEXT",		LTEXT, ATEXT,
457*fbadb1c4SDavid du Colombier 
458*fbadb1c4SDavid du Colombier 	/* 64-bit instructions */
459*fbadb1c4SDavid du Colombier 	"CNTLZD",	LABS,	ACNTLZD,
460*fbadb1c4SDavid du Colombier 	"CNTLZDCC",	LABS,	ACNTLZDCC,
461*fbadb1c4SDavid du Colombier 	"DIVD",	LLOGW,	ADIVD,
462*fbadb1c4SDavid du Colombier 	"DIVDCC",	LLOGW,	ADIVDCC,
463*fbadb1c4SDavid du Colombier 	"DIVDVCC",	LLOGW,	ADIVDVCC,
464*fbadb1c4SDavid du Colombier 	"DIVDV",	LLOGW,	ADIVDV,
465*fbadb1c4SDavid du Colombier 	"DIVDU",	LLOGW,	ADIVDU,
466*fbadb1c4SDavid du Colombier 	"DIVDUCC",	LLOGW,	ADIVDUCC,
467*fbadb1c4SDavid du Colombier 	"DIVDUVCC",	LLOGW,	ADIVDUVCC,
468*fbadb1c4SDavid du Colombier 	"DIVDUV",	LLOGW,	ADIVDUV,
469*fbadb1c4SDavid du Colombier 	"EXTSW",	LABS, AEXTSW,
470*fbadb1c4SDavid du Colombier 	"EXTSWCC",	LABS, AEXTSWCC,
471*fbadb1c4SDavid du Colombier 	"FCTID",	LFCONV,	AFCTID,
472*fbadb1c4SDavid du Colombier 	"FCTIDCC",	LFCONV,	AFCTIDCC,
473*fbadb1c4SDavid du Colombier 	"FCTIDZ",	LFCONV,	AFCTIDZ,
474*fbadb1c4SDavid du Colombier 	"FCTIDZCC",	LFCONV,	AFCTIDZCC,
475*fbadb1c4SDavid du Colombier 	"FCFID",	LFCONV,	AFCFID,
476*fbadb1c4SDavid du Colombier 	"FCFIDCC",	LFCONV,	AFCFIDCC,
477*fbadb1c4SDavid du Colombier 	"LDAR", LXLD, ALDAR,
478*fbadb1c4SDavid du Colombier 	"MOVD",	LMOVW,	AMOVD,
479*fbadb1c4SDavid du Colombier 	"MOVDU",	LMOVW,	AMOVDU,
480*fbadb1c4SDavid du Colombier 	"MOVWZ",	LMOVW,	AMOVWZ,
481*fbadb1c4SDavid du Colombier 	"MOVWZU",	LMOVW,	AMOVWZU,
482*fbadb1c4SDavid du Colombier 	"MULHD",	LLOGW,	AMULHD,
483*fbadb1c4SDavid du Colombier 	"MULHDCC",	LLOGW,	AMULHDCC,
484*fbadb1c4SDavid du Colombier 	"MULHDU",	LLOGW,	AMULHDU,
485*fbadb1c4SDavid du Colombier 	"MULHDUCC",	LLOGW,	AMULHDUCC,
486*fbadb1c4SDavid du Colombier 	"MULLD",	LADDW,	AMULLD,	/* includes multiply immediate? */
487*fbadb1c4SDavid du Colombier 	"MULLDCC",	LLOGW,	AMULLDCC,
488*fbadb1c4SDavid du Colombier 	"MULLDVCC",	LLOGW,	AMULLDVCC,
489*fbadb1c4SDavid du Colombier 	"MULLDV",	LLOGW,	AMULLDV,
490*fbadb1c4SDavid du Colombier 	"RFID",	LRETRN,	ARFID,
491*fbadb1c4SDavid du Colombier 	"HRFID", LRETRN, AHRFID,
492*fbadb1c4SDavid du Colombier 	"RLDMI",	LRLWM,	ARLDMI,
493*fbadb1c4SDavid du Colombier 	"RLDMICC",	LRLWM,	ARLDMICC,
494*fbadb1c4SDavid du Colombier 	"RLDC",	LRLWM,	ARLDC,
495*fbadb1c4SDavid du Colombier 	"RLDCCC",	LRLWM,	ARLDCCC,
496*fbadb1c4SDavid du Colombier 	"RLDCR",	LRLWM,	ARLDCR,
497*fbadb1c4SDavid du Colombier 	"RLDCRCC",	LRLWM,	ARLDCRCC,
498*fbadb1c4SDavid du Colombier 	"RLDCL",	LRLWM,	ARLDCL,
499*fbadb1c4SDavid du Colombier 	"RLDCLCC",	LRLWM,	ARLDCLCC,
500*fbadb1c4SDavid du Colombier 	"SLBIA",	LNOP,	ASLBIA,
501*fbadb1c4SDavid du Colombier 	"SLBIE",	LNOP,	ASLBIE,
502*fbadb1c4SDavid du Colombier 	"SLBMFEE",	LABS,	ASLBMFEE,
503*fbadb1c4SDavid du Colombier 	"SLBMFEV",	LABS,	ASLBMFEV,
504*fbadb1c4SDavid du Colombier 	"SLBMTE",	LABS,	ASLBMTE,
505*fbadb1c4SDavid du Colombier 	"SLD",	LSHW,	ASLD,
506*fbadb1c4SDavid du Colombier 	"SLDCC",	LSHW,	ASLDCC,
507*fbadb1c4SDavid du Colombier 	"SRD",	LSHW,	ASRD,
508*fbadb1c4SDavid du Colombier 	"SRAD",	LSHW,	ASRAD,
509*fbadb1c4SDavid du Colombier 	"SRADCC",	LSHW,	ASRADCC,
510*fbadb1c4SDavid du Colombier 	"SRDCC",	LSHW,	ASRDCC,
511*fbadb1c4SDavid du Colombier 	"STDCCC",	LXST,	ASTDCCC,
512*fbadb1c4SDavid du Colombier 	"TD",	LADDW,	ATD,
513*fbadb1c4SDavid du Colombier 
514*fbadb1c4SDavid du Colombier 	/* pseudo instructions */
515*fbadb1c4SDavid du Colombier 	"REM",	LLOGW,	AREM,
516*fbadb1c4SDavid du Colombier 	"REMCC",	LLOGW,	AREMCC,
517*fbadb1c4SDavid du Colombier 	"REMV",	LLOGW,	AREMV,
518*fbadb1c4SDavid du Colombier 	"REMVCC",	LLOGW,	AREMVCC,
519*fbadb1c4SDavid du Colombier 	"REMU",	LLOGW,	AREMU,
520*fbadb1c4SDavid du Colombier 	"REMUCC",	LLOGW,	AREMUCC,
521*fbadb1c4SDavid du Colombier 	"REMUV",	LLOGW,	AREMUV,
522*fbadb1c4SDavid du Colombier 	"REMUVCC",	LLOGW,	AREMUVCC,
523*fbadb1c4SDavid du Colombier 	"REMD",	LLOGW,	AREMD,
524*fbadb1c4SDavid du Colombier 	"REMDCC",	LLOGW,	AREMDCC,
525*fbadb1c4SDavid du Colombier 	"REMDV",	LLOGW,	AREMDV,
526*fbadb1c4SDavid du Colombier 	"REMDVCC",	LLOGW,	AREMDVCC,
527*fbadb1c4SDavid du Colombier 	"REMDU",	LLOGW,	AREMDU,
528*fbadb1c4SDavid du Colombier 	"REMDUCC",	LLOGW,	AREMDUCC,
529*fbadb1c4SDavid du Colombier 	"REMDUV",	LLOGW,	AREMDUV,
530*fbadb1c4SDavid du Colombier 	"REMDUVCC",	LLOGW,	AREMDUVCC,
531*fbadb1c4SDavid du Colombier 
532*fbadb1c4SDavid du Colombier /* special instructions */
533*fbadb1c4SDavid du Colombier 	"DCBF",		LXOP,	ADCBF,
534*fbadb1c4SDavid du Colombier 	"DCBI",		LXOP,	ADCBI,
535*fbadb1c4SDavid du Colombier 	"DCBST",	LXOP,	ADCBST,
536*fbadb1c4SDavid du Colombier 	"DCBT",		LXOP,	ADCBT,
537*fbadb1c4SDavid du Colombier 	"DCBTST",	LXOP,	ADCBTST,
538*fbadb1c4SDavid du Colombier 	"DCBZ",		LXOP,	ADCBZ,
539*fbadb1c4SDavid du Colombier 	"ICBI",		LXOP,	AICBI,
540*fbadb1c4SDavid du Colombier 
541*fbadb1c4SDavid du Colombier 	"ECIWX",	LXLD,	AECIWX,
542*fbadb1c4SDavid du Colombier 	"ECOWX",	LXST,	AECOWX,
543*fbadb1c4SDavid du Colombier 	"LWAR", LXLD, ALWAR,
544*fbadb1c4SDavid du Colombier 	"LWAR", LXLD, ALWAR,
545*fbadb1c4SDavid du Colombier 	"STWCCC", LXST, ASTWCCC,
546*fbadb1c4SDavid du Colombier 	"EIEIO",	LRETRN,	AEIEIO,
547*fbadb1c4SDavid du Colombier 	"TLBIE",	LNOP,	ATLBIE,
548*fbadb1c4SDavid du Colombier 	"TLBIEL",	LNOP,	ATLBIEL,
549*fbadb1c4SDavid du Colombier 	"LSW",	LXLD, ALSW,
550*fbadb1c4SDavid du Colombier 	"STSW",	LXST, ASTSW,
551*fbadb1c4SDavid du Colombier 
552*fbadb1c4SDavid du Colombier 	"ISYNC",	LRETRN, AISYNC,
553*fbadb1c4SDavid du Colombier 	"SYNC",		LRETRN, ASYNC,
554*fbadb1c4SDavid du Colombier 	"TLBSYNC",	LRETRN,	ATLBSYNC,
555*fbadb1c4SDavid du Colombier 	"PTESYNC",	LRETRN,	APTESYNC,
556*fbadb1c4SDavid du Colombier /*	"TW",		LADDW,	ATW,*/
557*fbadb1c4SDavid du Colombier 
558*fbadb1c4SDavid du Colombier 	"WORD",		LWORD, AWORD,
559*fbadb1c4SDavid du Colombier 	"DWORD",	LWORD, ADWORD,
560*fbadb1c4SDavid du Colombier 	"SCHED",	LSCHED, 0,
561*fbadb1c4SDavid du Colombier 	"NOSCHED",	LSCHED,	0x80,
562*fbadb1c4SDavid du Colombier 
563*fbadb1c4SDavid du Colombier 	0
564*fbadb1c4SDavid du Colombier };
565*fbadb1c4SDavid du Colombier 
566*fbadb1c4SDavid du Colombier void
cinit(void)567*fbadb1c4SDavid du Colombier cinit(void)
568*fbadb1c4SDavid du Colombier {
569*fbadb1c4SDavid du Colombier 	Sym *s;
570*fbadb1c4SDavid du Colombier 	int i;
571*fbadb1c4SDavid du Colombier 
572*fbadb1c4SDavid du Colombier 	nullgen.sym = S;
573*fbadb1c4SDavid du Colombier 	nullgen.offset = 0;
574*fbadb1c4SDavid du Colombier 	nullgen.type = D_NONE;
575*fbadb1c4SDavid du Colombier 	nullgen.name = D_NONE;
576*fbadb1c4SDavid du Colombier 	nullgen.reg = NREG;
577*fbadb1c4SDavid du Colombier 	nullgen.xreg = NREG;
578*fbadb1c4SDavid du Colombier 	if(FPCHIP)
579*fbadb1c4SDavid du Colombier 		nullgen.dval = 0;
580*fbadb1c4SDavid du Colombier 	for(i=0; i<sizeof(nullgen.sval); i++)
581*fbadb1c4SDavid du Colombier 		nullgen.sval[i] = 0;
582*fbadb1c4SDavid du Colombier 
583*fbadb1c4SDavid du Colombier 	nerrors = 0;
584*fbadb1c4SDavid du Colombier 	iostack = I;
585*fbadb1c4SDavid du Colombier 	iofree = I;
586*fbadb1c4SDavid du Colombier 	peekc = IGN;
587*fbadb1c4SDavid du Colombier 	nhunk = 0;
588*fbadb1c4SDavid du Colombier 	for(i=0; i<NHASH; i++)
589*fbadb1c4SDavid du Colombier 		hash[i] = S;
590*fbadb1c4SDavid du Colombier 	for(i=0; itab[i].name; i++) {
591*fbadb1c4SDavid du Colombier 		s = slookup(itab[i].name);
592*fbadb1c4SDavid du Colombier 		s->type = itab[i].type;
593*fbadb1c4SDavid du Colombier 		s->value = itab[i].value;
594*fbadb1c4SDavid du Colombier 	}
595*fbadb1c4SDavid du Colombier 	ALLOCN(pathname, 0, 100);
596*fbadb1c4SDavid du Colombier 	if(mygetwd(pathname, 99) == 0) {
597*fbadb1c4SDavid du Colombier 		ALLOCN(pathname, 100, 900);
598*fbadb1c4SDavid du Colombier 		if(mygetwd(pathname, 999) == 0)
599*fbadb1c4SDavid du Colombier 			strcpy(pathname, "/???");
600*fbadb1c4SDavid du Colombier 	}
601*fbadb1c4SDavid du Colombier }
602*fbadb1c4SDavid du Colombier 
603*fbadb1c4SDavid du Colombier void
syminit(Sym * s)604*fbadb1c4SDavid du Colombier syminit(Sym *s)
605*fbadb1c4SDavid du Colombier {
606*fbadb1c4SDavid du Colombier 
607*fbadb1c4SDavid du Colombier 	s->type = LNAME;
608*fbadb1c4SDavid du Colombier 	s->value = 0;
609*fbadb1c4SDavid du Colombier }
610*fbadb1c4SDavid du Colombier 
611*fbadb1c4SDavid du Colombier void
cclean(void)612*fbadb1c4SDavid du Colombier cclean(void)
613*fbadb1c4SDavid du Colombier {
614*fbadb1c4SDavid du Colombier 
615*fbadb1c4SDavid du Colombier 	outcode(AEND, &nullgen, NREG, &nullgen);
616*fbadb1c4SDavid du Colombier 	Bflush(&obuf);
617*fbadb1c4SDavid du Colombier }
618*fbadb1c4SDavid du Colombier 
619*fbadb1c4SDavid du Colombier void
zname(char * n,int t,int s)620*fbadb1c4SDavid du Colombier zname(char *n, int t, int s)
621*fbadb1c4SDavid du Colombier {
622*fbadb1c4SDavid du Colombier 
623*fbadb1c4SDavid du Colombier 	Bputc(&obuf, ANAME);
624*fbadb1c4SDavid du Colombier 	Bputc(&obuf, ANAME>>8);
625*fbadb1c4SDavid du Colombier 	Bputc(&obuf, t);	/* type */
626*fbadb1c4SDavid du Colombier 	Bputc(&obuf, s);	/* sym */
627*fbadb1c4SDavid du Colombier 	while(*n) {
628*fbadb1c4SDavid du Colombier 		Bputc(&obuf, *n);
629*fbadb1c4SDavid du Colombier 		n++;
630*fbadb1c4SDavid du Colombier 	}
631*fbadb1c4SDavid du Colombier 	Bputc(&obuf, 0);
632*fbadb1c4SDavid du Colombier }
633*fbadb1c4SDavid du Colombier 
634*fbadb1c4SDavid du Colombier void
zaddr(Gen * a,int s)635*fbadb1c4SDavid du Colombier zaddr(Gen *a, int s)
636*fbadb1c4SDavid du Colombier {
637*fbadb1c4SDavid du Colombier 	long l;
638*fbadb1c4SDavid du Colombier 	int i;
639*fbadb1c4SDavid du Colombier 	char *n;
640*fbadb1c4SDavid du Colombier 	Ieee e;
641*fbadb1c4SDavid du Colombier 
642*fbadb1c4SDavid du Colombier 	if(a->type == D_CONST){
643*fbadb1c4SDavid du Colombier 		l = a->offset;
644*fbadb1c4SDavid du Colombier 		if((vlong)l != a->offset)
645*fbadb1c4SDavid du Colombier 			a->type = D_DCONST;
646*fbadb1c4SDavid du Colombier 	}
647*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a->type);
648*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a->reg);
649*fbadb1c4SDavid du Colombier 	Bputc(&obuf, s);
650*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a->name);
651*fbadb1c4SDavid du Colombier 	switch(a->type) {
652*fbadb1c4SDavid du Colombier 	default:
653*fbadb1c4SDavid du Colombier 		print("unknown type %d\n", a->type);
654*fbadb1c4SDavid du Colombier 		exits("arg");
655*fbadb1c4SDavid du Colombier 
656*fbadb1c4SDavid du Colombier 	case D_NONE:
657*fbadb1c4SDavid du Colombier 	case D_REG:
658*fbadb1c4SDavid du Colombier 	case D_FREG:
659*fbadb1c4SDavid du Colombier 	case D_CREG:
660*fbadb1c4SDavid du Colombier 	case D_FPSCR:
661*fbadb1c4SDavid du Colombier 	case D_MSR:
662*fbadb1c4SDavid du Colombier 	case D_OPT:
663*fbadb1c4SDavid du Colombier 		break;
664*fbadb1c4SDavid du Colombier 
665*fbadb1c4SDavid du Colombier 	case D_DCR:
666*fbadb1c4SDavid du Colombier 	case D_SPR:
667*fbadb1c4SDavid du Colombier 	case D_OREG:
668*fbadb1c4SDavid du Colombier 	case D_CONST:
669*fbadb1c4SDavid du Colombier 	case D_BRANCH:
670*fbadb1c4SDavid du Colombier 		l = a->offset;
671*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l);
672*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>8);
673*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>16);
674*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>24);
675*fbadb1c4SDavid du Colombier 		break;
676*fbadb1c4SDavid du Colombier 
677*fbadb1c4SDavid du Colombier 	case D_DCONST:
678*fbadb1c4SDavid du Colombier 		l = a->offset;
679*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l);
680*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>8);
681*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>16);
682*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>24);
683*fbadb1c4SDavid du Colombier 		l = a->offset>>32;
684*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l);
685*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>8);
686*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>16);
687*fbadb1c4SDavid du Colombier 		Bputc(&obuf, l>>24);
688*fbadb1c4SDavid du Colombier 		break;
689*fbadb1c4SDavid du Colombier 
690*fbadb1c4SDavid du Colombier 	case D_SCONST:
691*fbadb1c4SDavid du Colombier 		n = a->sval;
692*fbadb1c4SDavid du Colombier 		for(i=0; i<NSNAME; i++) {
693*fbadb1c4SDavid du Colombier 			Bputc(&obuf, *n);
694*fbadb1c4SDavid du Colombier 			n++;
695*fbadb1c4SDavid du Colombier 		}
696*fbadb1c4SDavid du Colombier 		break;
697*fbadb1c4SDavid du Colombier 
698*fbadb1c4SDavid du Colombier 	case D_FCONST:
699*fbadb1c4SDavid du Colombier 		ieeedtod(&e, a->dval);
700*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.l);
701*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.l>>8);
702*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.l>>16);
703*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.l>>24);
704*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.h);
705*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.h>>8);
706*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.h>>16);
707*fbadb1c4SDavid du Colombier 		Bputc(&obuf, e.h>>24);
708*fbadb1c4SDavid du Colombier 		break;
709*fbadb1c4SDavid du Colombier 	}
710*fbadb1c4SDavid du Colombier }
711*fbadb1c4SDavid du Colombier 
712*fbadb1c4SDavid du Colombier int
outsim(Gen * g)713*fbadb1c4SDavid du Colombier outsim(Gen *g)
714*fbadb1c4SDavid du Colombier {
715*fbadb1c4SDavid du Colombier 	Sym *s;
716*fbadb1c4SDavid du Colombier 	int sno, t;
717*fbadb1c4SDavid du Colombier 
718*fbadb1c4SDavid du Colombier 	s = g->sym;
719*fbadb1c4SDavid du Colombier 	if(s == S)
720*fbadb1c4SDavid du Colombier 		return 0;
721*fbadb1c4SDavid du Colombier 	sno = s->sym;
722*fbadb1c4SDavid du Colombier 	if(sno < 0 || sno >= NSYM)
723*fbadb1c4SDavid du Colombier 		sno = 0;
724*fbadb1c4SDavid du Colombier 	t = g->name;
725*fbadb1c4SDavid du Colombier 	if(h[sno].type == t && h[sno].sym == s)
726*fbadb1c4SDavid du Colombier 		return sno;
727*fbadb1c4SDavid du Colombier 	zname(s->name, t, sym);
728*fbadb1c4SDavid du Colombier 	s->sym = sym;
729*fbadb1c4SDavid du Colombier 	h[sym].sym = s;
730*fbadb1c4SDavid du Colombier 	h[sym].type = t;
731*fbadb1c4SDavid du Colombier 	sno = sym;
732*fbadb1c4SDavid du Colombier 	sym++;
733*fbadb1c4SDavid du Colombier 	if(sym >= NSYM)
734*fbadb1c4SDavid du Colombier 		sym = 1;
735*fbadb1c4SDavid du Colombier 	return sno;
736*fbadb1c4SDavid du Colombier }
737*fbadb1c4SDavid du Colombier 
738*fbadb1c4SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)739*fbadb1c4SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
740*fbadb1c4SDavid du Colombier {
741*fbadb1c4SDavid du Colombier 	int sf, st;
742*fbadb1c4SDavid du Colombier 
743*fbadb1c4SDavid du Colombier 	if(a != AGLOBL && a != ADATA)
744*fbadb1c4SDavid du Colombier 		pc++;
745*fbadb1c4SDavid du Colombier 	if(pass == 1)
746*fbadb1c4SDavid du Colombier 		return;
747*fbadb1c4SDavid du Colombier 	if(g1->xreg != NREG) {
748*fbadb1c4SDavid du Colombier 		if(reg != NREG || g2->xreg != NREG)
749*fbadb1c4SDavid du Colombier 			yyerror("bad addressing modes");
750*fbadb1c4SDavid du Colombier 		reg = g1->xreg;
751*fbadb1c4SDavid du Colombier 	} else
752*fbadb1c4SDavid du Colombier 	if(g2->xreg != NREG) {
753*fbadb1c4SDavid du Colombier 		if(reg != NREG)
754*fbadb1c4SDavid du Colombier 			yyerror("bad addressing modes");
755*fbadb1c4SDavid du Colombier 		reg = g2->xreg;
756*fbadb1c4SDavid du Colombier 	}
757*fbadb1c4SDavid du Colombier 	do {
758*fbadb1c4SDavid du Colombier 		sf = outsim(g1);
759*fbadb1c4SDavid du Colombier 		st = outsim(g2);
760*fbadb1c4SDavid du Colombier 	} while(sf != 0 && st == sf);
761*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a);
762*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a>>8);
763*fbadb1c4SDavid du Colombier 	Bputc(&obuf, reg|nosched);
764*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno);
765*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>8);
766*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>16);
767*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>24);
768*fbadb1c4SDavid du Colombier 	zaddr(g1, sf);
769*fbadb1c4SDavid du Colombier 	zaddr(g2, st);
770*fbadb1c4SDavid du Colombier }
771*fbadb1c4SDavid du Colombier 
772*fbadb1c4SDavid du Colombier void
outgcode(int a,Gen * g1,int reg,Gen * g2,Gen * g3)773*fbadb1c4SDavid du Colombier outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
774*fbadb1c4SDavid du Colombier {
775*fbadb1c4SDavid du Colombier 	int s1, s2, s3, flag;
776*fbadb1c4SDavid du Colombier 
777*fbadb1c4SDavid du Colombier 	if(a != AGLOBL && a != ADATA)
778*fbadb1c4SDavid du Colombier 		pc++;
779*fbadb1c4SDavid du Colombier 	if(pass == 1)
780*fbadb1c4SDavid du Colombier 		return;
781*fbadb1c4SDavid du Colombier 	do {
782*fbadb1c4SDavid du Colombier 		s1 = outsim(g1);
783*fbadb1c4SDavid du Colombier 		s2 = outsim(g2);
784*fbadb1c4SDavid du Colombier 		s3 = outsim(g3);
785*fbadb1c4SDavid du Colombier 	} while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
786*fbadb1c4SDavid du Colombier 	flag = 0;
787*fbadb1c4SDavid du Colombier 	if(g2->type != D_NONE)
788*fbadb1c4SDavid du Colombier 		flag = 0x40;	/* flags extra operand */
789*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a);
790*fbadb1c4SDavid du Colombier 	Bputc(&obuf, a>>8);
791*fbadb1c4SDavid du Colombier 	Bputc(&obuf, reg | nosched | flag);
792*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno);
793*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>8);
794*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>16);
795*fbadb1c4SDavid du Colombier 	Bputc(&obuf, lineno>>24);
796*fbadb1c4SDavid du Colombier 	zaddr(g1, s1);
797*fbadb1c4SDavid du Colombier 	if(flag)
798*fbadb1c4SDavid du Colombier 		zaddr(g2, s2);
799*fbadb1c4SDavid du Colombier 	zaddr(g3, s3);
800*fbadb1c4SDavid du Colombier }
801*fbadb1c4SDavid du Colombier 
802*fbadb1c4SDavid du Colombier void
outhist(void)803*fbadb1c4SDavid du Colombier outhist(void)
804*fbadb1c4SDavid du Colombier {
805*fbadb1c4SDavid du Colombier 	Gen g;
806*fbadb1c4SDavid du Colombier 	Hist *h;
807*fbadb1c4SDavid du Colombier 	char *p, *q, *op, c;
808*fbadb1c4SDavid du Colombier 	int n;
809*fbadb1c4SDavid du Colombier 
810*fbadb1c4SDavid du Colombier 	g = nullgen;
811*fbadb1c4SDavid du Colombier 	c = pathchar();
812*fbadb1c4SDavid du Colombier 	for(h = hist; h != H; h = h->link) {
813*fbadb1c4SDavid du Colombier 		p = h->name;
814*fbadb1c4SDavid du Colombier 		op = 0;
815*fbadb1c4SDavid du Colombier 		/* on windows skip drive specifier in pathname */
816*fbadb1c4SDavid du Colombier 		if(systemtype(Windows) && p && p[1] == ':'){
817*fbadb1c4SDavid du Colombier 			p += 2;
818*fbadb1c4SDavid du Colombier 			c = *p;
819*fbadb1c4SDavid du Colombier 		}
820*fbadb1c4SDavid du Colombier 		if(p && p[0] != c && h->offset == 0 && pathname){
821*fbadb1c4SDavid du Colombier 			/* on windows skip drive specifier in pathname */
822*fbadb1c4SDavid du Colombier 			if(systemtype(Windows) && pathname[1] == ':') {
823*fbadb1c4SDavid du Colombier 				op = p;
824*fbadb1c4SDavid du Colombier 				p = pathname+2;
825*fbadb1c4SDavid du Colombier 				c = *p;
826*fbadb1c4SDavid du Colombier 			} else if(pathname[0] == c){
827*fbadb1c4SDavid du Colombier 				op = p;
828*fbadb1c4SDavid du Colombier 				p = pathname;
829*fbadb1c4SDavid du Colombier 			}
830*fbadb1c4SDavid du Colombier 		}
831*fbadb1c4SDavid du Colombier 		while(p) {
832*fbadb1c4SDavid du Colombier 			q = strchr(p, c);
833*fbadb1c4SDavid du Colombier 			if(q) {
834*fbadb1c4SDavid du Colombier 				n = q-p;
835*fbadb1c4SDavid du Colombier 				if(n == 0){
836*fbadb1c4SDavid du Colombier 					n = 1;	/* leading "/" */
837*fbadb1c4SDavid du Colombier 					*p = '/';	/* don't emit "\" on windows */
838*fbadb1c4SDavid du Colombier 				}
839*fbadb1c4SDavid du Colombier 				q++;
840*fbadb1c4SDavid du Colombier 			} else {
841*fbadb1c4SDavid du Colombier 				n = strlen(p);
842*fbadb1c4SDavid du Colombier 				q = 0;
843*fbadb1c4SDavid du Colombier 			}
844*fbadb1c4SDavid du Colombier 			if(n) {
845*fbadb1c4SDavid du Colombier 				Bputc(&obuf, ANAME);
846*fbadb1c4SDavid du Colombier 				Bputc(&obuf, ANAME>>8);
847*fbadb1c4SDavid du Colombier 				Bputc(&obuf, D_FILE);	/* type */
848*fbadb1c4SDavid du Colombier 				Bputc(&obuf, 1);	/* sym */
849*fbadb1c4SDavid du Colombier 				Bputc(&obuf, '<');
850*fbadb1c4SDavid du Colombier 				Bwrite(&obuf, p, n);
851*fbadb1c4SDavid du Colombier 				Bputc(&obuf, 0);
852*fbadb1c4SDavid du Colombier 			}
853*fbadb1c4SDavid du Colombier 			p = q;
854*fbadb1c4SDavid du Colombier 			if(p == 0 && op) {
855*fbadb1c4SDavid du Colombier 				p = op;
856*fbadb1c4SDavid du Colombier 				op = 0;
857*fbadb1c4SDavid du Colombier 			}
858*fbadb1c4SDavid du Colombier 		}
859*fbadb1c4SDavid du Colombier 		g.offset = h->offset;
860*fbadb1c4SDavid du Colombier 
861*fbadb1c4SDavid du Colombier 		Bputc(&obuf, AHISTORY);
862*fbadb1c4SDavid du Colombier 		Bputc(&obuf, AHISTORY>>8);
863*fbadb1c4SDavid du Colombier 		Bputc(&obuf, 0);
864*fbadb1c4SDavid du Colombier 		Bputc(&obuf, h->line);
865*fbadb1c4SDavid du Colombier 		Bputc(&obuf, h->line>>8);
866*fbadb1c4SDavid du Colombier 		Bputc(&obuf, h->line>>16);
867*fbadb1c4SDavid du Colombier 		Bputc(&obuf, h->line>>24);
868*fbadb1c4SDavid du Colombier 		zaddr(&nullgen, 0);
869*fbadb1c4SDavid du Colombier 		zaddr(&g, 0);
870*fbadb1c4SDavid du Colombier 	}
871*fbadb1c4SDavid du Colombier }
872*fbadb1c4SDavid du Colombier 
873*fbadb1c4SDavid du Colombier #include "../cc/lexbody"
874*fbadb1c4SDavid du Colombier #include "../cc/macbody"
875*fbadb1c4SDavid du Colombier #include "../cc/compat"
876