xref: /plan9-contrib/sys/src/cmd/ia/lex.c (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier #include <ctype.h>
2*ce95e1b3SDavid du Colombier #define	EXTERN
3*ce95e1b3SDavid du Colombier #include "a.h"
4*ce95e1b3SDavid du Colombier #include "y.tab.h"
5*ce95e1b3SDavid du Colombier 
6*ce95e1b3SDavid du Colombier void
main(int argc,char * argv[])7*ce95e1b3SDavid du Colombier main(int argc, char *argv[])
8*ce95e1b3SDavid du Colombier {
9*ce95e1b3SDavid du Colombier 	char *p;
10*ce95e1b3SDavid du Colombier 	int nout, nproc, status, i, c;
11*ce95e1b3SDavid du Colombier 
12*ce95e1b3SDavid du Colombier 	thechar = 'i';
13*ce95e1b3SDavid du Colombier 	p = strrchr(argv[0], '/');
14*ce95e1b3SDavid du Colombier 	if(p == nil)
15*ce95e1b3SDavid du Colombier 		p = argv[0];
16*ce95e1b3SDavid du Colombier 	else
17*ce95e1b3SDavid du Colombier 		p++;
18*ce95e1b3SDavid du Colombier 	if(*p == 'j')
19*ce95e1b3SDavid du Colombier 		thechar = 'j';
20*ce95e1b3SDavid du Colombier 	memset(debug, 0, sizeof(debug));
21*ce95e1b3SDavid du Colombier 	cinit();
22*ce95e1b3SDavid du Colombier 	outfile = 0;
23*ce95e1b3SDavid du Colombier 	include[ninclude++] = ".";
24*ce95e1b3SDavid du Colombier 	ARGBEGIN {
25*ce95e1b3SDavid du Colombier 	default:
26*ce95e1b3SDavid du Colombier 		c = ARGC();
27*ce95e1b3SDavid du Colombier 		if(c >= 0 || c < sizeof(debug))
28*ce95e1b3SDavid du Colombier 			debug[c] = 1;
29*ce95e1b3SDavid du Colombier 		break;
30*ce95e1b3SDavid du Colombier 
31*ce95e1b3SDavid du Colombier 	case 'o':
32*ce95e1b3SDavid du Colombier 		outfile = ARGF();
33*ce95e1b3SDavid du Colombier 		break;
34*ce95e1b3SDavid du Colombier 
35*ce95e1b3SDavid du Colombier 	case 'D':
36*ce95e1b3SDavid du Colombier 		p = ARGF();
37*ce95e1b3SDavid du Colombier 		if(p)
38*ce95e1b3SDavid du Colombier 			Dlist[nDlist++] = p;
39*ce95e1b3SDavid du Colombier 		break;
40*ce95e1b3SDavid du Colombier 
41*ce95e1b3SDavid du Colombier 	case 'I':
42*ce95e1b3SDavid du Colombier 		p = ARGF();
43*ce95e1b3SDavid du Colombier 		setinclude(p);
44*ce95e1b3SDavid du Colombier 		break;
45*ce95e1b3SDavid du Colombier 
46*ce95e1b3SDavid du Colombier 	} ARGEND
47*ce95e1b3SDavid du Colombier 	if(*argv == 0) {
48*ce95e1b3SDavid du Colombier 		print("usage: %ca [-options] file.s\n", thechar);
49*ce95e1b3SDavid du Colombier 		errorexit();
50*ce95e1b3SDavid du Colombier 	}
51*ce95e1b3SDavid du Colombier 	if(debug['j'])
52*ce95e1b3SDavid du Colombier 		thechar = 'j';
53*ce95e1b3SDavid du Colombier 	thestring = (thechar == 'j'? "riscv64" : "riscv");
54*ce95e1b3SDavid du Colombier 	if(argc > 1 && systemtype(Windows)){
55*ce95e1b3SDavid du Colombier 		print("can't assemble multiple files on windows\n");
56*ce95e1b3SDavid du Colombier 		errorexit();
57*ce95e1b3SDavid du Colombier 	}
58*ce95e1b3SDavid du Colombier 	if(argc > 1 && !systemtype(Windows)) {
59*ce95e1b3SDavid du Colombier 		nproc = 1;
60*ce95e1b3SDavid du Colombier 		if(p = getenv("NPROC"))
61*ce95e1b3SDavid du Colombier 			nproc = atol(p);	/* */
62*ce95e1b3SDavid du Colombier 		c = 0;
63*ce95e1b3SDavid du Colombier 		nout = 0;
64*ce95e1b3SDavid du Colombier 		for(;;) {
65*ce95e1b3SDavid du Colombier 			while(nout < nproc && argc > 0) {
66*ce95e1b3SDavid du Colombier 				i = myfork();
67*ce95e1b3SDavid du Colombier 				if(i < 0) {
68*ce95e1b3SDavid du Colombier 					i = mywait(&status);
69*ce95e1b3SDavid du Colombier 					if(i < 0)
70*ce95e1b3SDavid du Colombier 						errorexit();
71*ce95e1b3SDavid du Colombier 					if(status)
72*ce95e1b3SDavid du Colombier 						c++;
73*ce95e1b3SDavid du Colombier 					nout--;
74*ce95e1b3SDavid du Colombier 					continue;
75*ce95e1b3SDavid du Colombier 				}
76*ce95e1b3SDavid du Colombier 				if(i == 0) {
77*ce95e1b3SDavid du Colombier 					print("%s:\n", *argv);
78*ce95e1b3SDavid du Colombier 					if(assemble(*argv))
79*ce95e1b3SDavid du Colombier 						errorexit();
80*ce95e1b3SDavid du Colombier 					exits(0);
81*ce95e1b3SDavid du Colombier 				}
82*ce95e1b3SDavid du Colombier 				nout++;
83*ce95e1b3SDavid du Colombier 				argc--;
84*ce95e1b3SDavid du Colombier 				argv++;
85*ce95e1b3SDavid du Colombier 			}
86*ce95e1b3SDavid du Colombier 			i = mywait(&status);
87*ce95e1b3SDavid du Colombier 			if(i < 0) {
88*ce95e1b3SDavid du Colombier 				if(c)
89*ce95e1b3SDavid du Colombier 					errorexit();
90*ce95e1b3SDavid du Colombier 				exits(0);
91*ce95e1b3SDavid du Colombier 			}
92*ce95e1b3SDavid du Colombier 			if(status)
93*ce95e1b3SDavid du Colombier 				c++;
94*ce95e1b3SDavid du Colombier 			nout--;
95*ce95e1b3SDavid du Colombier 		}
96*ce95e1b3SDavid du Colombier 	}
97*ce95e1b3SDavid du Colombier 	if(assemble(argv[0]))
98*ce95e1b3SDavid du Colombier 		errorexit();
99*ce95e1b3SDavid du Colombier 	exits(0);
100*ce95e1b3SDavid du Colombier }
101*ce95e1b3SDavid du Colombier 
102*ce95e1b3SDavid du Colombier int
assemble(char * file)103*ce95e1b3SDavid du Colombier assemble(char *file)
104*ce95e1b3SDavid du Colombier {
105*ce95e1b3SDavid du Colombier 	char ofile[100], incfile[20], *p;
106*ce95e1b3SDavid du Colombier 	int i, of;
107*ce95e1b3SDavid du Colombier 
108*ce95e1b3SDavid du Colombier 	strcpy(ofile, file);
109*ce95e1b3SDavid du Colombier 	p = utfrrune(ofile, pathchar());
110*ce95e1b3SDavid du Colombier 	if(p) {
111*ce95e1b3SDavid du Colombier 		include[0] = ofile;
112*ce95e1b3SDavid du Colombier 		*p++ = 0;
113*ce95e1b3SDavid du Colombier 	} else
114*ce95e1b3SDavid du Colombier 		p = ofile;
115*ce95e1b3SDavid du Colombier 	if(outfile == 0) {
116*ce95e1b3SDavid du Colombier 		outfile = p;
117*ce95e1b3SDavid du Colombier 		if(outfile){
118*ce95e1b3SDavid du Colombier 			p = utfrrune(outfile, '.');
119*ce95e1b3SDavid du Colombier 			if(p)
120*ce95e1b3SDavid du Colombier 				if(p[1] == 's' && p[2] == 0)
121*ce95e1b3SDavid du Colombier 					p[0] = 0;
122*ce95e1b3SDavid du Colombier 			p = utfrune(outfile, 0);
123*ce95e1b3SDavid du Colombier 			p[0] = '.';
124*ce95e1b3SDavid du Colombier 			p[1] = thechar;
125*ce95e1b3SDavid du Colombier 			p[2] = 0;
126*ce95e1b3SDavid du Colombier 		} else
127*ce95e1b3SDavid du Colombier 			outfile = "/dev/null";
128*ce95e1b3SDavid du Colombier 	}
129*ce95e1b3SDavid du Colombier 	p = getenv("INCLUDE");
130*ce95e1b3SDavid du Colombier 	if(p) {
131*ce95e1b3SDavid du Colombier 		setinclude(p);
132*ce95e1b3SDavid du Colombier 	} else {
133*ce95e1b3SDavid du Colombier 		if(systemtype(Plan9)) {
134*ce95e1b3SDavid du Colombier 			sprint(incfile,"/%s/include", thestring);
135*ce95e1b3SDavid du Colombier 			setinclude(strdup(incfile));
136*ce95e1b3SDavid du Colombier 		}
137*ce95e1b3SDavid du Colombier 	}
138*ce95e1b3SDavid du Colombier 
139*ce95e1b3SDavid du Colombier 	of = mycreat(outfile, 0664);
140*ce95e1b3SDavid du Colombier 	if(of < 0) {
141*ce95e1b3SDavid du Colombier 		yyerror("%ca: cannot create %s", thechar, outfile);
142*ce95e1b3SDavid du Colombier 		errorexit();
143*ce95e1b3SDavid du Colombier 	}
144*ce95e1b3SDavid du Colombier 	Binit(&obuf, of, OWRITE);
145*ce95e1b3SDavid du Colombier 
146*ce95e1b3SDavid du Colombier 	pass = 1;
147*ce95e1b3SDavid du Colombier 	pinit(file);
148*ce95e1b3SDavid du Colombier 	if(thechar == 'j')
149*ce95e1b3SDavid du Colombier 		dodefine("XLEN=8");
150*ce95e1b3SDavid du Colombier 	else
151*ce95e1b3SDavid du Colombier 		dodefine("XLEN=4");
152*ce95e1b3SDavid du Colombier 	for(i=0; i<nDlist; i++)
153*ce95e1b3SDavid du Colombier 		dodefine(Dlist[i]);
154*ce95e1b3SDavid du Colombier 	yyparse();
155*ce95e1b3SDavid du Colombier 	if(nerrors) {
156*ce95e1b3SDavid du Colombier 		cclean();
157*ce95e1b3SDavid du Colombier 		return nerrors;
158*ce95e1b3SDavid du Colombier 	}
159*ce95e1b3SDavid du Colombier 
160*ce95e1b3SDavid du Colombier 	pass = 2;
161*ce95e1b3SDavid du Colombier 	outhist();
162*ce95e1b3SDavid du Colombier 	pinit(file);
163*ce95e1b3SDavid du Colombier 	if(thechar == 'j')
164*ce95e1b3SDavid du Colombier 		dodefine("XLEN=8");
165*ce95e1b3SDavid du Colombier 	else
166*ce95e1b3SDavid du Colombier 		dodefine("XLEN=4");
167*ce95e1b3SDavid du Colombier 	for(i=0; i<nDlist; i++)
168*ce95e1b3SDavid du Colombier 		dodefine(Dlist[i]);
169*ce95e1b3SDavid du Colombier 	yyparse();
170*ce95e1b3SDavid du Colombier 	cclean();
171*ce95e1b3SDavid du Colombier 	return nerrors;
172*ce95e1b3SDavid du Colombier }
173*ce95e1b3SDavid du Colombier 
174*ce95e1b3SDavid du Colombier struct
175*ce95e1b3SDavid du Colombier {
176*ce95e1b3SDavid du Colombier 	char	*name;
177*ce95e1b3SDavid du Colombier 	ushort	type;
178*ce95e1b3SDavid du Colombier 	ushort	value;
179*ce95e1b3SDavid du Colombier } itab[] =
180*ce95e1b3SDavid du Colombier {
181*ce95e1b3SDavid du Colombier 	"SP",		LSP,	D_AUTO,
182*ce95e1b3SDavid du Colombier 	"SB",		LSB,	D_EXTERN,
183*ce95e1b3SDavid du Colombier 	"FP",		LFP,	D_PARAM,
184*ce95e1b3SDavid du Colombier 	"PC",		LPC,	D_BRANCH,
185*ce95e1b3SDavid du Colombier 
186*ce95e1b3SDavid du Colombier 	"R",		LR,	0,
187*ce95e1b3SDavid du Colombier 	"R0",		LREG,	0,
188*ce95e1b3SDavid du Colombier 	"R1",		LREG,	1,
189*ce95e1b3SDavid du Colombier 	"R2",		LREG,	2,
190*ce95e1b3SDavid du Colombier 	"R3",		LREG,	3,
191*ce95e1b3SDavid du Colombier 	"R4",		LREG,	4,
192*ce95e1b3SDavid du Colombier 	"R5",		LREG,	5,
193*ce95e1b3SDavid du Colombier 	"R6",		LREG,	6,
194*ce95e1b3SDavid du Colombier 	"R7",		LREG,	7,
195*ce95e1b3SDavid du Colombier 	"R8",		LREG,	8,
196*ce95e1b3SDavid du Colombier 	"R9",		LREG,	9,
197*ce95e1b3SDavid du Colombier 	"R10",		LREG,	10,
198*ce95e1b3SDavid du Colombier 	"R11",		LREG,	11,
199*ce95e1b3SDavid du Colombier 	"R12",		LREG,	12,
200*ce95e1b3SDavid du Colombier 	"R13",		LREG,	13,
201*ce95e1b3SDavid du Colombier 	"R14",		LREG,	14,
202*ce95e1b3SDavid du Colombier 	"R15",		LREG,	15,
203*ce95e1b3SDavid du Colombier 	"R16",		LREG,	16,
204*ce95e1b3SDavid du Colombier 	"R17",		LREG,	17,
205*ce95e1b3SDavid du Colombier 	"R18",		LREG,	18,
206*ce95e1b3SDavid du Colombier 	"R19",		LREG,	19,
207*ce95e1b3SDavid du Colombier 	"R20",		LREG,	20,
208*ce95e1b3SDavid du Colombier 	"R21",		LREG,	21,
209*ce95e1b3SDavid du Colombier 	"R22",		LREG,	22,
210*ce95e1b3SDavid du Colombier 	"R23",		LREG,	23,
211*ce95e1b3SDavid du Colombier 	"R24",		LREG,	24,
212*ce95e1b3SDavid du Colombier 	"R25",		LREG,	25,
213*ce95e1b3SDavid du Colombier 	"R26",		LREG,	26,
214*ce95e1b3SDavid du Colombier 	"R27",		LREG,	27,
215*ce95e1b3SDavid du Colombier 	"R28",		LREG,	28,
216*ce95e1b3SDavid du Colombier 	"R29",		LREG,	29,
217*ce95e1b3SDavid du Colombier 	"R30",		LREG,	30,
218*ce95e1b3SDavid du Colombier 	"R31",		LREG,	31,
219*ce95e1b3SDavid du Colombier 
220*ce95e1b3SDavid du Colombier 	"F",		FR,	0,
221*ce95e1b3SDavid du Colombier 	"F0",		LFREG,	0,
222*ce95e1b3SDavid du Colombier 	"F1",		LFREG,	1,
223*ce95e1b3SDavid du Colombier 	"F2",		LFREG,	2,
224*ce95e1b3SDavid du Colombier 	"F3",		LFREG,	3,
225*ce95e1b3SDavid du Colombier 	"F4",		LFREG,	4,
226*ce95e1b3SDavid du Colombier 	"F5",		LFREG,	5,
227*ce95e1b3SDavid du Colombier 	"F6",		LFREG,	6,
228*ce95e1b3SDavid du Colombier 	"F7",		LFREG,	7,
229*ce95e1b3SDavid du Colombier 	"F8",		LFREG,	8,
230*ce95e1b3SDavid du Colombier 	"F9",		LFREG,	9,
231*ce95e1b3SDavid du Colombier 	"F10",		LFREG,	10,
232*ce95e1b3SDavid du Colombier 	"F11",		LFREG,	11,
233*ce95e1b3SDavid du Colombier 	"F12",		LFREG,	12,
234*ce95e1b3SDavid du Colombier 	"F13",		LFREG,	13,
235*ce95e1b3SDavid du Colombier 	"F14",		LFREG,	14,
236*ce95e1b3SDavid du Colombier 	"F15",		LFREG,	15,
237*ce95e1b3SDavid du Colombier 	"F16",		LFREG,	16,
238*ce95e1b3SDavid du Colombier 	"F17",		LFREG,	17,
239*ce95e1b3SDavid du Colombier 	"F18",		LFREG,	18,
240*ce95e1b3SDavid du Colombier 	"F19",		LFREG,	19,
241*ce95e1b3SDavid du Colombier 	"F20",		LFREG,	20,
242*ce95e1b3SDavid du Colombier 	"F21",		LFREG,	21,
243*ce95e1b3SDavid du Colombier 	"F22",		LFREG,	22,
244*ce95e1b3SDavid du Colombier 	"F23",		LFREG,	23,
245*ce95e1b3SDavid du Colombier 	"F24",		LFREG,	24,
246*ce95e1b3SDavid du Colombier 	"F25",		LFREG,	25,
247*ce95e1b3SDavid du Colombier 	"F26",		LFREG,	26,
248*ce95e1b3SDavid du Colombier 	"F27",		LFREG,	27,
249*ce95e1b3SDavid du Colombier 	"F28",		LFREG,	28,
250*ce95e1b3SDavid du Colombier 	"F29",		LFREG,	29,
251*ce95e1b3SDavid du Colombier 	"F30",		LFREG,	30,
252*ce95e1b3SDavid du Colombier 	"F31",		LFREG,	31,
253*ce95e1b3SDavid du Colombier 
254*ce95e1b3SDavid du Colombier 	"CSR",		LCTL,	0,
255*ce95e1b3SDavid du Colombier 
256*ce95e1b3SDavid du Colombier 	"ADD",		LADD,	AADD,
257*ce95e1b3SDavid du Colombier 	"SLL",		LADD,	ASLL,
258*ce95e1b3SDavid du Colombier 	"SLT",		LADD,	ASLT,
259*ce95e1b3SDavid du Colombier 	"SLTU",		LADD,	ASLTU,
260*ce95e1b3SDavid du Colombier 	"XOR",		LADD,	AXOR,
261*ce95e1b3SDavid du Colombier 	"SRL",		LADD,	ASRL,
262*ce95e1b3SDavid du Colombier 	"OR",		LADD,	AOR,
263*ce95e1b3SDavid du Colombier 	"AND",		LADD,	AAND,
264*ce95e1b3SDavid du Colombier 	"SRA",		LADD,	ASRA,
265*ce95e1b3SDavid du Colombier 	"ADDW",		LADD,	AADDW,
266*ce95e1b3SDavid du Colombier 	"SLLW",		LADD,	ASLLW,
267*ce95e1b3SDavid du Colombier 	"SRLW",		LADD,	ASRLW,
268*ce95e1b3SDavid du Colombier 	"SRAW",		LADD,	ASRAW,
269*ce95e1b3SDavid du Colombier 	"SUB",		LADD,	ASUB,
270*ce95e1b3SDavid du Colombier 	"SUBW",		LADD,	ASUBW,
271*ce95e1b3SDavid du Colombier 
272*ce95e1b3SDavid du Colombier 	"MUL",		LMUL,	AMUL,
273*ce95e1b3SDavid du Colombier 	"MULH",		LMUL,	AMULH,
274*ce95e1b3SDavid du Colombier 	"MULHSU",	LMUL,	AMULHSU,
275*ce95e1b3SDavid du Colombier 	"MULHU",	LMUL,	AMULHU,
276*ce95e1b3SDavid du Colombier 	"DIV",		LMUL,	ADIV,
277*ce95e1b3SDavid du Colombier 	"DIVU",		LMUL,	ADIVU,
278*ce95e1b3SDavid du Colombier 	"REM",		LMUL,	AREM,
279*ce95e1b3SDavid du Colombier 	"REMU",		LMUL,	AREMU,
280*ce95e1b3SDavid du Colombier 	"MULW",		LMUL,	AMULW,
281*ce95e1b3SDavid du Colombier 	"DIVW",		LMUL,	ADIVW,
282*ce95e1b3SDavid du Colombier 	"DIVUW",	LMUL,	ADIVUW,
283*ce95e1b3SDavid du Colombier 	"REMW",		LMUL,	AREMW,
284*ce95e1b3SDavid du Colombier 	"REMUW",	LMUL,	AREMUW,
285*ce95e1b3SDavid du Colombier 
286*ce95e1b3SDavid du Colombier 	"BEQ",		LBEQ,	ABEQ,
287*ce95e1b3SDavid du Colombier 	"BNE",		LBEQ,	ABNE,
288*ce95e1b3SDavid du Colombier 	"BLT",		LBEQ,	ABLT,
289*ce95e1b3SDavid du Colombier 	"BGE",		LBEQ,	ABGE,
290*ce95e1b3SDavid du Colombier 	"BLTU",		LBEQ,	ABLTU,
291*ce95e1b3SDavid du Colombier 	"BGEU",		LBEQ,	ABGEU,
292*ce95e1b3SDavid du Colombier 	"BGT",		LBEQ,	ABGT,
293*ce95e1b3SDavid du Colombier 	"BGTU",		LBEQ,	ABGTU,
294*ce95e1b3SDavid du Colombier 	"BLE",		LBEQ,	ABLE,
295*ce95e1b3SDavid du Colombier 	"BLEU",		LBEQ,	ABLEU,
296*ce95e1b3SDavid du Colombier 
297*ce95e1b3SDavid du Colombier 	"JMP",		LBR,	AJMP,
298*ce95e1b3SDavid du Colombier 
299*ce95e1b3SDavid du Colombier 	"RET",		LBRET,	ARET,
300*ce95e1b3SDavid du Colombier 	"FENCE_I",	LBRET,	AFENCE_I,
301*ce95e1b3SDavid du Colombier 	"NOP",		LBRET,	ANOP,
302*ce95e1b3SDavid du Colombier 	"END",		LBRET,	AEND,
303*ce95e1b3SDavid du Colombier 
304*ce95e1b3SDavid du Colombier 	"JAL",		LCALL,	AJAL,
305*ce95e1b3SDavid du Colombier 	"JALR",		LCALL,	AJAL,
306*ce95e1b3SDavid du Colombier 
307*ce95e1b3SDavid du Colombier 	"MOVB",		LMOVB,	AMOVB,
308*ce95e1b3SDavid du Colombier 	"MOVH",		LMOVB,	AMOVH,
309*ce95e1b3SDavid du Colombier 
310*ce95e1b3SDavid du Colombier 	"MOVF",		LMOVF,	AMOVF,
311*ce95e1b3SDavid du Colombier 	"MOVD",		LMOVF,	AMOVD,
312*ce95e1b3SDavid du Colombier 
313*ce95e1b3SDavid du Colombier 	"MOVBU",	LMOVBU,	AMOVBU,
314*ce95e1b3SDavid du Colombier 	"MOVHU",	LMOVBU,	AMOVHU,
315*ce95e1b3SDavid du Colombier 
316*ce95e1b3SDavid du Colombier 	"MOVW",		LMOVW,	AMOVW,
317*ce95e1b3SDavid du Colombier 
318*ce95e1b3SDavid du Colombier 	"MOVFD",	LFLT2,	AMOVFD,
319*ce95e1b3SDavid du Colombier 	"MOVDF",	LFLT2,	AMOVDF,
320*ce95e1b3SDavid du Colombier 	"MOVWF",	LFLT2,	AMOVWF,
321*ce95e1b3SDavid du Colombier 	"MOVUF",	LFLT2,	AMOVUF,
322*ce95e1b3SDavid du Colombier 	"MOVFW",	LFLT2,	AMOVFW,
323*ce95e1b3SDavid du Colombier 	"MOVWD",	LFLT2,	AMOVWD,
324*ce95e1b3SDavid du Colombier 	"MOVUD",	LFLT2,	AMOVUD,
325*ce95e1b3SDavid du Colombier 	"MOVDW",	LFLT2,	AMOVDW,
326*ce95e1b3SDavid du Colombier 	"ADDF",		LFLT3,	AADDF,
327*ce95e1b3SDavid du Colombier 	"ADDD",		LFLT3,	AADDD,
328*ce95e1b3SDavid du Colombier 	"SUBF",		LFLT3,	ASUBF,
329*ce95e1b3SDavid du Colombier 	"SUBD",		LFLT3,	ASUBD,
330*ce95e1b3SDavid du Colombier 	"MULF",		LFLT3,	AMULF,
331*ce95e1b3SDavid du Colombier 	"MULD",		LFLT3,	AMULD,
332*ce95e1b3SDavid du Colombier 	"DIVF",		LFLT3,	ADIVF,
333*ce95e1b3SDavid du Colombier 	"DIVD",		LFLT3,	ADIVD,
334*ce95e1b3SDavid du Colombier 	"CMPLTF",	LFLT3,	ACMPLTF,
335*ce95e1b3SDavid du Colombier 	"CMPLTD",	LFLT3,	ACMPLTD,
336*ce95e1b3SDavid du Colombier 	"CMPEQF",	LFLT3,	ACMPEQF,
337*ce95e1b3SDavid du Colombier 	"CMPEQD",	LFLT3,	ACMPEQD,
338*ce95e1b3SDavid du Colombier 	"CMPLEF",	LFLT3,	ACMPLEF,
339*ce95e1b3SDavid du Colombier 	"CMPLED",	LFLT3,	ACMPLED,
340*ce95e1b3SDavid du Colombier 
341*ce95e1b3SDavid du Colombier 	"LUI",		LLUI,	ALUI,
342*ce95e1b3SDavid du Colombier 
343*ce95e1b3SDavid du Colombier 	"SYS",		LSYS,	ASYS,
344*ce95e1b3SDavid du Colombier 	"ECALL",	LSYS0,	0,
345*ce95e1b3SDavid du Colombier 	"EBREAK",	LSYS0,	1,
346*ce95e1b3SDavid du Colombier 	"CSRRW",	LCSR,	ACSRRW,
347*ce95e1b3SDavid du Colombier 	"CSRRS",	LCSR,	ACSRRS,
348*ce95e1b3SDavid du Colombier 	"CSRRC",	LCSR,	ACSRRC,
349*ce95e1b3SDavid du Colombier 
350*ce95e1b3SDavid du Colombier 	"SWAP_W",	LSWAP,	ASWAP_W,
351*ce95e1b3SDavid du Colombier 	"SWAP_D",	LSWAP,	ASWAP_D,
352*ce95e1b3SDavid du Colombier 	"LR_W",		LSWAP,	ALR_W,
353*ce95e1b3SDavid du Colombier 	"LR_D",		LSWAP,	ALR_D,
354*ce95e1b3SDavid du Colombier 	"SC_W",		LSWAP,	ASC_W,
355*ce95e1b3SDavid du Colombier 	"SC_D",		LSWAP,	ASC_D,
356*ce95e1b3SDavid du Colombier 
357*ce95e1b3SDavid du Colombier 	"AMO_W",	LAMO,	AAMO_W,
358*ce95e1b3SDavid du Colombier 	"AMO_D",	LAMO,	AAMO_D,
359*ce95e1b3SDavid du Colombier 
360*ce95e1b3SDavid du Colombier 	"DATA",		LDATA, 		ADATA,
361*ce95e1b3SDavid du Colombier 	"GLOBL",	LTEXT, 		AGLOBL,
362*ce95e1b3SDavid du Colombier 	"TEXT",		LTEXT, 		ATEXT,
363*ce95e1b3SDavid du Colombier 	"WORD",		LWORD,		AWORD,
364*ce95e1b3SDavid du Colombier 	"DWORD",	LWORD,		ADWORD,
365*ce95e1b3SDavid du Colombier 
366*ce95e1b3SDavid du Colombier 	"MOV",		LMOVW,		AMOV,
367*ce95e1b3SDavid du Colombier 	"MOVWU",	LMOVBU,		AMOVWU,
368*ce95e1b3SDavid du Colombier 
369*ce95e1b3SDavid du Colombier 	0
370*ce95e1b3SDavid du Colombier };
371*ce95e1b3SDavid du Colombier 
372*ce95e1b3SDavid du Colombier void
cinit(void)373*ce95e1b3SDavid du Colombier cinit(void)
374*ce95e1b3SDavid du Colombier {
375*ce95e1b3SDavid du Colombier 	Sym *s;
376*ce95e1b3SDavid du Colombier 	int i;
377*ce95e1b3SDavid du Colombier 
378*ce95e1b3SDavid du Colombier 	nullgen.sym = S;
379*ce95e1b3SDavid du Colombier 	nullgen.offset = 0;
380*ce95e1b3SDavid du Colombier 	nullgen.type = D_NONE;
381*ce95e1b3SDavid du Colombier 	nullgen.name = D_NONE;
382*ce95e1b3SDavid du Colombier 	nullgen.reg = NREG;
383*ce95e1b3SDavid du Colombier 	if(FPCHIP)
384*ce95e1b3SDavid du Colombier 		nullgen.dval = 0;
385*ce95e1b3SDavid du Colombier 	for(i=0; i<sizeof(nullgen.sval); i++)
386*ce95e1b3SDavid du Colombier 		nullgen.sval[i] = 0;
387*ce95e1b3SDavid du Colombier 
388*ce95e1b3SDavid du Colombier 	nerrors = 0;
389*ce95e1b3SDavid du Colombier 	iostack = I;
390*ce95e1b3SDavid du Colombier 	iofree = I;
391*ce95e1b3SDavid du Colombier 	peekc = IGN;
392*ce95e1b3SDavid du Colombier 	nhunk = 0;
393*ce95e1b3SDavid du Colombier 	for(i=0; i<NHASH; i++)
394*ce95e1b3SDavid du Colombier 		hash[i] = S;
395*ce95e1b3SDavid du Colombier 	for(i=0; itab[i].name; i++) {
396*ce95e1b3SDavid du Colombier 		s = slookup(itab[i].name);
397*ce95e1b3SDavid du Colombier 		s->type = itab[i].type;
398*ce95e1b3SDavid du Colombier 		s->value = itab[i].value;
399*ce95e1b3SDavid du Colombier 	}
400*ce95e1b3SDavid du Colombier 
401*ce95e1b3SDavid du Colombier 	pathname = allocn(pathname, 0, 100);
402*ce95e1b3SDavid du Colombier 	if(mygetwd(pathname, 99) == 0) {
403*ce95e1b3SDavid du Colombier 		pathname = allocn(pathname, 100, 900);
404*ce95e1b3SDavid du Colombier 		if(mygetwd(pathname, 999) == 0)
405*ce95e1b3SDavid du Colombier 			strcpy(pathname, "/???");
406*ce95e1b3SDavid du Colombier 	}
407*ce95e1b3SDavid du Colombier }
408*ce95e1b3SDavid du Colombier 
409*ce95e1b3SDavid du Colombier void
syminit(Sym * s)410*ce95e1b3SDavid du Colombier syminit(Sym *s)
411*ce95e1b3SDavid du Colombier {
412*ce95e1b3SDavid du Colombier 
413*ce95e1b3SDavid du Colombier 	s->type = LNAME;
414*ce95e1b3SDavid du Colombier 	s->value = 0;
415*ce95e1b3SDavid du Colombier }
416*ce95e1b3SDavid du Colombier 
417*ce95e1b3SDavid du Colombier void
cclean(void)418*ce95e1b3SDavid du Colombier cclean(void)
419*ce95e1b3SDavid du Colombier {
420*ce95e1b3SDavid du Colombier 
421*ce95e1b3SDavid du Colombier 	outcode(AEND, &nullgen, NREG, &nullgen);
422*ce95e1b3SDavid du Colombier 	Bflush(&obuf);
423*ce95e1b3SDavid du Colombier }
424*ce95e1b3SDavid du Colombier 
425*ce95e1b3SDavid du Colombier void
zname(char * n,int t,int s)426*ce95e1b3SDavid du Colombier zname(char *n, int t, int s)
427*ce95e1b3SDavid du Colombier {
428*ce95e1b3SDavid du Colombier 
429*ce95e1b3SDavid du Colombier 	Bputc(&obuf, ANAME);
430*ce95e1b3SDavid du Colombier 	Bputc(&obuf, t);	/* type */
431*ce95e1b3SDavid du Colombier 	Bputc(&obuf, s);	/* sym */
432*ce95e1b3SDavid du Colombier 	while(*n) {
433*ce95e1b3SDavid du Colombier 		Bputc(&obuf, *n);
434*ce95e1b3SDavid du Colombier 		n++;
435*ce95e1b3SDavid du Colombier 	}
436*ce95e1b3SDavid du Colombier 	Bputc(&obuf, 0);
437*ce95e1b3SDavid du Colombier }
438*ce95e1b3SDavid du Colombier 
439*ce95e1b3SDavid du Colombier void
zaddr(Gen * a,int s)440*ce95e1b3SDavid du Colombier zaddr(Gen *a, int s)
441*ce95e1b3SDavid du Colombier {
442*ce95e1b3SDavid du Colombier 	vlong v;
443*ce95e1b3SDavid du Colombier 	long l;
444*ce95e1b3SDavid du Colombier 	int i;
445*ce95e1b3SDavid du Colombier 	char *n;
446*ce95e1b3SDavid du Colombier 	Ieee e;
447*ce95e1b3SDavid du Colombier 
448*ce95e1b3SDavid du Colombier 	Bputc(&obuf, a->type);
449*ce95e1b3SDavid du Colombier 	Bputc(&obuf, a->reg);
450*ce95e1b3SDavid du Colombier 	Bputc(&obuf, s);
451*ce95e1b3SDavid du Colombier 	Bputc(&obuf, a->name);
452*ce95e1b3SDavid du Colombier 	switch(a->type) {
453*ce95e1b3SDavid du Colombier 	default:
454*ce95e1b3SDavid du Colombier 		print("unknown type %d\n", a->type);
455*ce95e1b3SDavid du Colombier 		exits("arg");
456*ce95e1b3SDavid du Colombier 
457*ce95e1b3SDavid du Colombier 	case D_NONE:
458*ce95e1b3SDavid du Colombier 	case D_REG:
459*ce95e1b3SDavid du Colombier 	case D_FREG:
460*ce95e1b3SDavid du Colombier 		break;
461*ce95e1b3SDavid du Colombier 
462*ce95e1b3SDavid du Colombier 	case D_CTLREG:
463*ce95e1b3SDavid du Colombier 	case D_OREG:
464*ce95e1b3SDavid du Colombier 	case D_CONST:
465*ce95e1b3SDavid du Colombier 	case D_BRANCH:
466*ce95e1b3SDavid du Colombier 		l = a->offset;
467*ce95e1b3SDavid du Colombier 		Bputc(&obuf, l);
468*ce95e1b3SDavid du Colombier 		Bputc(&obuf, l>>8);
469*ce95e1b3SDavid du Colombier 		Bputc(&obuf, l>>16);
470*ce95e1b3SDavid du Colombier 		Bputc(&obuf, l>>24);
471*ce95e1b3SDavid du Colombier 		break;
472*ce95e1b3SDavid du Colombier 
473*ce95e1b3SDavid du Colombier 	case D_VCONST:
474*ce95e1b3SDavid du Colombier 		v = a->vval;
475*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v);
476*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>8);
477*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>16);
478*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>24);
479*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>32);
480*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>40);
481*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>48);
482*ce95e1b3SDavid du Colombier 		Bputc(&obuf, v>>56);
483*ce95e1b3SDavid du Colombier 		break;
484*ce95e1b3SDavid du Colombier 
485*ce95e1b3SDavid du Colombier 	case D_SCONST:
486*ce95e1b3SDavid du Colombier 		n = a->sval;
487*ce95e1b3SDavid du Colombier 		for(i=0; i<NSNAME; i++) {
488*ce95e1b3SDavid du Colombier 			Bputc(&obuf, *n);
489*ce95e1b3SDavid du Colombier 			n++;
490*ce95e1b3SDavid du Colombier 		}
491*ce95e1b3SDavid du Colombier 		break;
492*ce95e1b3SDavid du Colombier 
493*ce95e1b3SDavid du Colombier 	case D_FCONST:
494*ce95e1b3SDavid du Colombier 		ieeedtod(&e, a->dval);
495*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.l);
496*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.l>>8);
497*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.l>>16);
498*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.l>>24);
499*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.h);
500*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.h>>8);
501*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.h>>16);
502*ce95e1b3SDavid du Colombier 		Bputc(&obuf, e.h>>24);
503*ce95e1b3SDavid du Colombier 		break;
504*ce95e1b3SDavid du Colombier 	}
505*ce95e1b3SDavid du Colombier }
506*ce95e1b3SDavid du Colombier 
507*ce95e1b3SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)508*ce95e1b3SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
509*ce95e1b3SDavid du Colombier {
510*ce95e1b3SDavid du Colombier 	int sf, st, t;
511*ce95e1b3SDavid du Colombier 	Sym *s;
512*ce95e1b3SDavid du Colombier 
513*ce95e1b3SDavid du Colombier 	if(pass == 1)
514*ce95e1b3SDavid du Colombier 		goto out;
515*ce95e1b3SDavid du Colombier jackpot:
516*ce95e1b3SDavid du Colombier 	sf = 0;
517*ce95e1b3SDavid du Colombier 	s = g1->sym;
518*ce95e1b3SDavid du Colombier 	while(s != S) {
519*ce95e1b3SDavid du Colombier 		sf = s->sym;
520*ce95e1b3SDavid du Colombier 		if(sf < 0 || sf >= NSYM)
521*ce95e1b3SDavid du Colombier 			sf = 0;
522*ce95e1b3SDavid du Colombier 		t = g1->name;
523*ce95e1b3SDavid du Colombier 		if(h[sf].type == t)
524*ce95e1b3SDavid du Colombier 		if(h[sf].sym == s)
525*ce95e1b3SDavid du Colombier 			break;
526*ce95e1b3SDavid du Colombier 		zname(s->name, t, sym);
527*ce95e1b3SDavid du Colombier 		s->sym = sym;
528*ce95e1b3SDavid du Colombier 		h[sym].sym = s;
529*ce95e1b3SDavid du Colombier 		h[sym].type = t;
530*ce95e1b3SDavid du Colombier 		sf = sym;
531*ce95e1b3SDavid du Colombier 		sym++;
532*ce95e1b3SDavid du Colombier 		if(sym >= NSYM)
533*ce95e1b3SDavid du Colombier 			sym = 1;
534*ce95e1b3SDavid du Colombier 		break;
535*ce95e1b3SDavid du Colombier 	}
536*ce95e1b3SDavid du Colombier 	st = 0;
537*ce95e1b3SDavid du Colombier 	s = g2->sym;
538*ce95e1b3SDavid du Colombier 	while(s != S) {
539*ce95e1b3SDavid du Colombier 		st = s->sym;
540*ce95e1b3SDavid du Colombier 		if(st < 0 || st >= NSYM)
541*ce95e1b3SDavid du Colombier 			st = 0;
542*ce95e1b3SDavid du Colombier 		t = g2->name;
543*ce95e1b3SDavid du Colombier 		if(h[st].type == t)
544*ce95e1b3SDavid du Colombier 		if(h[st].sym == s)
545*ce95e1b3SDavid du Colombier 			break;
546*ce95e1b3SDavid du Colombier 		zname(s->name, t, sym);
547*ce95e1b3SDavid du Colombier 		s->sym = sym;
548*ce95e1b3SDavid du Colombier 		h[sym].sym = s;
549*ce95e1b3SDavid du Colombier 		h[sym].type = t;
550*ce95e1b3SDavid du Colombier 		st = sym;
551*ce95e1b3SDavid du Colombier 		sym++;
552*ce95e1b3SDavid du Colombier 		if(sym >= NSYM)
553*ce95e1b3SDavid du Colombier 			sym = 1;
554*ce95e1b3SDavid du Colombier 		if(st == sf)
555*ce95e1b3SDavid du Colombier 			goto jackpot;
556*ce95e1b3SDavid du Colombier 		break;
557*ce95e1b3SDavid du Colombier 	}
558*ce95e1b3SDavid du Colombier 	Bputc(&obuf, a);
559*ce95e1b3SDavid du Colombier 	Bputc(&obuf, reg);
560*ce95e1b3SDavid du Colombier 	Bputc(&obuf, lineno);
561*ce95e1b3SDavid du Colombier 	Bputc(&obuf, lineno>>8);
562*ce95e1b3SDavid du Colombier 	Bputc(&obuf, lineno>>16);
563*ce95e1b3SDavid du Colombier 	Bputc(&obuf, lineno>>24);
564*ce95e1b3SDavid du Colombier 	zaddr(g1, sf);
565*ce95e1b3SDavid du Colombier 	zaddr(g2, st);
566*ce95e1b3SDavid du Colombier 
567*ce95e1b3SDavid du Colombier out:
568*ce95e1b3SDavid du Colombier 	if(a != AGLOBL && a != ADATA)
569*ce95e1b3SDavid du Colombier 		pc++;
570*ce95e1b3SDavid du Colombier }
571*ce95e1b3SDavid du Colombier 
572*ce95e1b3SDavid du Colombier void
outhist(void)573*ce95e1b3SDavid du Colombier outhist(void)
574*ce95e1b3SDavid du Colombier {
575*ce95e1b3SDavid du Colombier 	Gen g;
576*ce95e1b3SDavid du Colombier 	Hist *h;
577*ce95e1b3SDavid du Colombier 	char *p, *q, *op, c;
578*ce95e1b3SDavid du Colombier 	int n;
579*ce95e1b3SDavid du Colombier 
580*ce95e1b3SDavid du Colombier 	g = nullgen;
581*ce95e1b3SDavid du Colombier 	c = pathchar();
582*ce95e1b3SDavid du Colombier 	for(h = hist; h != H; h = h->link) {
583*ce95e1b3SDavid du Colombier 		p = h->name;
584*ce95e1b3SDavid du Colombier 		op = 0;
585*ce95e1b3SDavid du Colombier 		/* on windows skip drive specifier in pathname */
586*ce95e1b3SDavid du Colombier 		if(systemtype(Windows) && p && p[1] == ':'){
587*ce95e1b3SDavid du Colombier 			p += 2;
588*ce95e1b3SDavid du Colombier 			c = *p;
589*ce95e1b3SDavid du Colombier 		}
590*ce95e1b3SDavid du Colombier 		if(p && p[0] != c && h->offset == 0 && pathname){
591*ce95e1b3SDavid du Colombier 			/* on windows skip drive specifier in pathname */
592*ce95e1b3SDavid du Colombier 			if(systemtype(Windows) && pathname[1] == ':') {
593*ce95e1b3SDavid du Colombier 				op = p;
594*ce95e1b3SDavid du Colombier 				p = pathname+2;
595*ce95e1b3SDavid du Colombier 				c = *p;
596*ce95e1b3SDavid du Colombier 			} else if(pathname[0] == c){
597*ce95e1b3SDavid du Colombier 				op = p;
598*ce95e1b3SDavid du Colombier 				p = pathname;
599*ce95e1b3SDavid du Colombier 			}
600*ce95e1b3SDavid du Colombier 		}
601*ce95e1b3SDavid du Colombier 		while(p) {
602*ce95e1b3SDavid du Colombier 			q = strchr(p, c);
603*ce95e1b3SDavid du Colombier 			if(q) {
604*ce95e1b3SDavid du Colombier 				n = q-p;
605*ce95e1b3SDavid du Colombier 				if(n == 0){
606*ce95e1b3SDavid du Colombier 					n = 1;	/* leading "/" */
607*ce95e1b3SDavid du Colombier 					*p = '/';	/* don't emit "\" on windows */
608*ce95e1b3SDavid du Colombier 				}
609*ce95e1b3SDavid du Colombier 				q++;
610*ce95e1b3SDavid du Colombier 			} else {
611*ce95e1b3SDavid du Colombier 				n = strlen(p);
612*ce95e1b3SDavid du Colombier 				q = 0;
613*ce95e1b3SDavid du Colombier 			}
614*ce95e1b3SDavid du Colombier 			if(n) {
615*ce95e1b3SDavid du Colombier 				Bputc(&obuf, ANAME);
616*ce95e1b3SDavid du Colombier 				Bputc(&obuf, D_FILE);	/* type */
617*ce95e1b3SDavid du Colombier 				Bputc(&obuf, 1);	/* sym */
618*ce95e1b3SDavid du Colombier 				Bputc(&obuf, '<');
619*ce95e1b3SDavid du Colombier 				Bwrite(&obuf, p, n);
620*ce95e1b3SDavid du Colombier 				Bputc(&obuf, 0);
621*ce95e1b3SDavid du Colombier 			}
622*ce95e1b3SDavid du Colombier 			p = q;
623*ce95e1b3SDavid du Colombier 			if(p == 0 && op) {
624*ce95e1b3SDavid du Colombier 				p = op;
625*ce95e1b3SDavid du Colombier 				op = 0;
626*ce95e1b3SDavid du Colombier 			}
627*ce95e1b3SDavid du Colombier 		}
628*ce95e1b3SDavid du Colombier 		g.offset = h->offset;
629*ce95e1b3SDavid du Colombier 
630*ce95e1b3SDavid du Colombier 		Bputc(&obuf, AHISTORY);
631*ce95e1b3SDavid du Colombier 		Bputc(&obuf, 0);
632*ce95e1b3SDavid du Colombier 		Bputc(&obuf, h->line);
633*ce95e1b3SDavid du Colombier 		Bputc(&obuf, h->line>>8);
634*ce95e1b3SDavid du Colombier 		Bputc(&obuf, h->line>>16);
635*ce95e1b3SDavid du Colombier 		Bputc(&obuf, h->line>>24);
636*ce95e1b3SDavid du Colombier 		zaddr(&nullgen, 0);
637*ce95e1b3SDavid du Colombier 		zaddr(&g, 0);
638*ce95e1b3SDavid du Colombier 	}
639*ce95e1b3SDavid du Colombier }
640*ce95e1b3SDavid du Colombier 
641*ce95e1b3SDavid du Colombier #include "../cc/lexbody"
642*ce95e1b3SDavid du Colombier #include "../cc/macbody"
643*ce95e1b3SDavid du Colombier #include "../cc/compat"
644