xref: /plan9/sys/src/cmd/5a/lex.c (revision 27acba7cf6d37c65abba4ecf8ad572a5980447ad)
17dd7cddfSDavid du Colombier #define	EXTERN
27dd7cddfSDavid du Colombier #include "a.h"
37dd7cddfSDavid du Colombier #include "y.tab.h"
4375daca8SDavid du Colombier #include <ctype.h>
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier void
main(int argc,char * argv[])77dd7cddfSDavid du Colombier main(int argc, char *argv[])
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	char *p;
107dd7cddfSDavid du Colombier 	int nout, nproc, status, i, c;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	thechar = '5';
137dd7cddfSDavid du Colombier 	thestring = "arm";
147dd7cddfSDavid du Colombier 	memset(debug, 0, sizeof(debug));
157dd7cddfSDavid du Colombier 	cinit();
167dd7cddfSDavid du Colombier 	outfile = 0;
177dd7cddfSDavid du Colombier 	include[ninclude++] = ".";
187dd7cddfSDavid du Colombier 	ARGBEGIN {
197dd7cddfSDavid du Colombier 	default:
207dd7cddfSDavid du Colombier 		c = ARGC();
217dd7cddfSDavid du Colombier 		if(c >= 0 || c < sizeof(debug))
227dd7cddfSDavid du Colombier 			debug[c] = 1;
237dd7cddfSDavid du Colombier 		break;
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier 	case 'o':
267dd7cddfSDavid du Colombier 		outfile = ARGF();
277dd7cddfSDavid du Colombier 		break;
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier 	case 'D':
307dd7cddfSDavid du Colombier 		p = ARGF();
317dd7cddfSDavid du Colombier 		if(p)
327dd7cddfSDavid du Colombier 			Dlist[nDlist++] = p;
337dd7cddfSDavid du Colombier 		break;
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier 	case 'I':
367dd7cddfSDavid du Colombier 		p = ARGF();
377dd7cddfSDavid du Colombier 		setinclude(p);
387dd7cddfSDavid du Colombier 		break;
39375daca8SDavid du Colombier 	case 't':
40375daca8SDavid du Colombier 		thechar = 't';
41375daca8SDavid du Colombier 		thestring = "thumb";
42375daca8SDavid du Colombier 		break;
437dd7cddfSDavid du Colombier 	} ARGEND
447dd7cddfSDavid du Colombier 	if(*argv == 0) {
457dd7cddfSDavid du Colombier 		print("usage: %ca [-options] file.s\n", thechar);
467dd7cddfSDavid du Colombier 		errorexit();
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier 	if(argc > 1 && systemtype(Windows)){
497dd7cddfSDavid du Colombier 		print("can't assemble multiple files on windows\n");
507dd7cddfSDavid du Colombier 		errorexit();
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	if(argc > 1 && !systemtype(Windows)) {
537dd7cddfSDavid du Colombier 		nproc = 1;
547dd7cddfSDavid du Colombier 		if(p = getenv("NPROC"))
557dd7cddfSDavid du Colombier 			nproc = atol(p);	/* */
567dd7cddfSDavid du Colombier 		c = 0;
577dd7cddfSDavid du Colombier 		nout = 0;
587dd7cddfSDavid du Colombier 		for(;;) {
597dd7cddfSDavid du Colombier 			while(nout < nproc && argc > 0) {
607dd7cddfSDavid du Colombier 				i = myfork();
617dd7cddfSDavid du Colombier 				if(i < 0) {
627dd7cddfSDavid du Colombier 					i = mywait(&status);
637dd7cddfSDavid du Colombier 					if(i < 0)
647dd7cddfSDavid du Colombier 						errorexit();
657dd7cddfSDavid du Colombier 					if(status)
667dd7cddfSDavid du Colombier 						c++;
677dd7cddfSDavid du Colombier 					nout--;
687dd7cddfSDavid du Colombier 					continue;
697dd7cddfSDavid du Colombier 				}
707dd7cddfSDavid du Colombier 				if(i == 0) {
717dd7cddfSDavid du Colombier 					print("%s:\n", *argv);
727dd7cddfSDavid du Colombier 					if(assemble(*argv))
737dd7cddfSDavid du Colombier 						errorexit();
747dd7cddfSDavid du Colombier 					exits(0);
757dd7cddfSDavid du Colombier 				}
767dd7cddfSDavid du Colombier 				nout++;
777dd7cddfSDavid du Colombier 				argc--;
787dd7cddfSDavid du Colombier 				argv++;
797dd7cddfSDavid du Colombier 			}
807dd7cddfSDavid du Colombier 			i = mywait(&status);
817dd7cddfSDavid du Colombier 			if(i < 0) {
827dd7cddfSDavid du Colombier 				if(c)
837dd7cddfSDavid du Colombier 					errorexit();
847dd7cddfSDavid du Colombier 				exits(0);
857dd7cddfSDavid du Colombier 			}
867dd7cddfSDavid du Colombier 			if(status)
877dd7cddfSDavid du Colombier 				c++;
887dd7cddfSDavid du Colombier 			nout--;
897dd7cddfSDavid du Colombier 		}
907dd7cddfSDavid du Colombier 	}
917dd7cddfSDavid du Colombier 	if(assemble(argv[0]))
927dd7cddfSDavid du Colombier 		errorexit();
937dd7cddfSDavid du Colombier 	exits(0);
947dd7cddfSDavid du Colombier }
957dd7cddfSDavid du Colombier 
967dd7cddfSDavid du Colombier int
assemble(char * file)977dd7cddfSDavid du Colombier assemble(char *file)
987dd7cddfSDavid du Colombier {
997dd7cddfSDavid du Colombier 	char ofile[100], incfile[20], *p;
1007dd7cddfSDavid du Colombier 	int i, of;
1017dd7cddfSDavid du Colombier 
1027dd7cddfSDavid du Colombier 	strcpy(ofile, file);
1037dd7cddfSDavid du Colombier 	p = utfrrune(ofile, pathchar());
1047dd7cddfSDavid du Colombier 	if(p) {
1057dd7cddfSDavid du Colombier 		include[0] = ofile;
1067dd7cddfSDavid du Colombier 		*p++ = 0;
1077dd7cddfSDavid du Colombier 	} else
1087dd7cddfSDavid du Colombier 		p = ofile;
1097dd7cddfSDavid du Colombier 	if(outfile == 0) {
1107dd7cddfSDavid du Colombier 		outfile = p;
1117dd7cddfSDavid du Colombier 		if(outfile){
1127dd7cddfSDavid du Colombier 			p = utfrrune(outfile, '.');
1137dd7cddfSDavid du Colombier 			if(p)
1147dd7cddfSDavid du Colombier 				if(p[1] == 's' && p[2] == 0)
1157dd7cddfSDavid du Colombier 					p[0] = 0;
1167dd7cddfSDavid du Colombier 			p = utfrune(outfile, 0);
1177dd7cddfSDavid du Colombier 			p[0] = '.';
1187dd7cddfSDavid du Colombier 			p[1] = thechar;
1197dd7cddfSDavid du Colombier 			p[2] = 0;
1207dd7cddfSDavid du Colombier 		} else
1217dd7cddfSDavid du Colombier 			outfile = "/dev/null";
1227dd7cddfSDavid du Colombier 	}
1237dd7cddfSDavid du Colombier 	p = getenv("INCLUDE");
1247dd7cddfSDavid du Colombier 	if(p) {
1257dd7cddfSDavid du Colombier 		setinclude(p);
1267dd7cddfSDavid du Colombier 	} else {
1277dd7cddfSDavid du Colombier 		if(systemtype(Plan9)) {
1287dd7cddfSDavid du Colombier 			sprint(incfile,"/%s/include", thestring);
1297dd7cddfSDavid du Colombier 			setinclude(strdup(incfile));
1307dd7cddfSDavid du Colombier 		}
1317dd7cddfSDavid du Colombier 	}
1327dd7cddfSDavid du Colombier 
1337dd7cddfSDavid du Colombier 	of = mycreat(outfile, 0664);
1347dd7cddfSDavid du Colombier 	if(of < 0) {
1357dd7cddfSDavid du Colombier 		yyerror("%ca: cannot create %s", thechar, outfile);
1367dd7cddfSDavid du Colombier 		errorexit();
1377dd7cddfSDavid du Colombier 	}
1387dd7cddfSDavid du Colombier 	Binit(&obuf, of, OWRITE);
1397dd7cddfSDavid du Colombier 
1407dd7cddfSDavid du Colombier 	pass = 1;
1417dd7cddfSDavid du Colombier 	pinit(file);
1427dd7cddfSDavid du Colombier 	for(i=0; i<nDlist; i++)
1437dd7cddfSDavid du Colombier 		dodefine(Dlist[i]);
1447dd7cddfSDavid du Colombier 	yyparse();
1457dd7cddfSDavid du Colombier 	if(nerrors) {
1467dd7cddfSDavid du Colombier 		cclean();
1477dd7cddfSDavid du Colombier 		return nerrors;
1487dd7cddfSDavid du Colombier 	}
1497dd7cddfSDavid du Colombier 
1507dd7cddfSDavid du Colombier 	pass = 2;
1517dd7cddfSDavid du Colombier 	outhist();
1527dd7cddfSDavid du Colombier 	pinit(file);
1537dd7cddfSDavid du Colombier 	for(i=0; i<nDlist; i++)
1547dd7cddfSDavid du Colombier 		dodefine(Dlist[i]);
1557dd7cddfSDavid du Colombier 	yyparse();
1567dd7cddfSDavid du Colombier 	cclean();
1577dd7cddfSDavid du Colombier 	return nerrors;
1587dd7cddfSDavid du Colombier }
1597dd7cddfSDavid du Colombier 
1607dd7cddfSDavid du Colombier struct
1617dd7cddfSDavid du Colombier {
1627dd7cddfSDavid du Colombier 	char	*name;
1637dd7cddfSDavid du Colombier 	ushort	type;
1647dd7cddfSDavid du Colombier 	ushort	value;
1657dd7cddfSDavid du Colombier } itab[] =
1667dd7cddfSDavid du Colombier {
1677dd7cddfSDavid du Colombier 	"SP",		LSP,	D_AUTO,
1687dd7cddfSDavid du Colombier 	"SB",		LSB,	D_EXTERN,
1697dd7cddfSDavid du Colombier 	"FP",		LFP,	D_PARAM,
1707dd7cddfSDavid du Colombier 	"PC",		LPC,	D_BRANCH,
1717dd7cddfSDavid du Colombier 
1727dd7cddfSDavid du Colombier 	"R",		LR,	0,
1737dd7cddfSDavid du Colombier 	"R0",		LREG,	0,
1747dd7cddfSDavid du Colombier 	"R1",		LREG,	1,
1757dd7cddfSDavid du Colombier 	"R2",		LREG,	2,
1767dd7cddfSDavid du Colombier 	"R3",		LREG,	3,
1777dd7cddfSDavid du Colombier 	"R4",		LREG,	4,
1787dd7cddfSDavid du Colombier 	"R5",		LREG,	5,
1797dd7cddfSDavid du Colombier 	"R6",		LREG,	6,
1807dd7cddfSDavid du Colombier 	"R7",		LREG,	7,
1817dd7cddfSDavid du Colombier 	"R8",		LREG,	8,
1827dd7cddfSDavid du Colombier 	"R9",		LREG,	9,
1837dd7cddfSDavid du Colombier 	"R10",		LREG,	10,
1847dd7cddfSDavid du Colombier 	"R11",		LREG,	11,
1857dd7cddfSDavid du Colombier 	"R12",		LREG,	12,
1867dd7cddfSDavid du Colombier 	"R13",		LREG,	13,
1877dd7cddfSDavid du Colombier 	"R14",		LREG,	14,
1887dd7cddfSDavid du Colombier 	"R15",		LREG,	15,
1897dd7cddfSDavid du Colombier 
1907dd7cddfSDavid du Colombier 	"F",		LF,	0,
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier 	"F0",		LFREG,	0,
1937dd7cddfSDavid du Colombier 	"F1",		LFREG,	1,
1947dd7cddfSDavid du Colombier 	"F2",		LFREG,	2,
1957dd7cddfSDavid du Colombier 	"F3",		LFREG,	3,
1967dd7cddfSDavid du Colombier 	"F4",		LFREG,	4,
1977dd7cddfSDavid du Colombier 	"F5",		LFREG,	5,
1987dd7cddfSDavid du Colombier 	"F6",		LFREG,	6,
1997dd7cddfSDavid du Colombier 	"F7",		LFREG,	7,
2007dd7cddfSDavid du Colombier 	"F8",		LFREG,	8,
2017dd7cddfSDavid du Colombier 	"F9",		LFREG,	9,
2027dd7cddfSDavid du Colombier 	"F10",		LFREG,	10,
2037dd7cddfSDavid du Colombier 	"F11",		LFREG,	11,
2047dd7cddfSDavid du Colombier 	"F12",		LFREG,	12,
2057dd7cddfSDavid du Colombier 	"F13",		LFREG,	13,
2067dd7cddfSDavid du Colombier 	"F14",		LFREG,	14,
2077dd7cddfSDavid du Colombier 	"F15",		LFREG,	15,
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier 	"C",		LC,	0,
2107dd7cddfSDavid du Colombier 
2117dd7cddfSDavid du Colombier 	"C0",		LCREG,	0,
2127dd7cddfSDavid du Colombier 	"C1",		LCREG,	1,
2137dd7cddfSDavid du Colombier 	"C2",		LCREG,	2,
2147dd7cddfSDavid du Colombier 	"C3",		LCREG,	3,
2157dd7cddfSDavid du Colombier 	"C4",		LCREG,	4,
2167dd7cddfSDavid du Colombier 	"C5",		LCREG,	5,
2177dd7cddfSDavid du Colombier 	"C6",		LCREG,	6,
2187dd7cddfSDavid du Colombier 	"C7",		LCREG,	7,
2197dd7cddfSDavid du Colombier 	"C8",		LCREG,	8,
2207dd7cddfSDavid du Colombier 	"C9",		LCREG,	9,
2217dd7cddfSDavid du Colombier 	"C10",		LCREG,	10,
2227dd7cddfSDavid du Colombier 	"C11",		LCREG,	11,
2237dd7cddfSDavid du Colombier 	"C12",		LCREG,	12,
2247dd7cddfSDavid du Colombier 	"C13",		LCREG,	13,
2257dd7cddfSDavid du Colombier 	"C14",		LCREG,	14,
2267dd7cddfSDavid du Colombier 	"C15",		LCREG,	15,
2277dd7cddfSDavid du Colombier 
2287dd7cddfSDavid du Colombier 	"CPSR",		LPSR,	0,
2297dd7cddfSDavid du Colombier 	"SPSR",		LPSR,	1,
2307dd7cddfSDavid du Colombier 
23159cc4ca5SDavid du Colombier 	"FPSR",		LFCR,	0,
23259cc4ca5SDavid du Colombier 	"FPCR",		LFCR,	1,
23359cc4ca5SDavid du Colombier 
2347dd7cddfSDavid du Colombier 	".EQ",		LCOND,	0,
2357dd7cddfSDavid du Colombier 	".NE",		LCOND,	1,
2367dd7cddfSDavid du Colombier 	".CS",		LCOND,	2,
2377dd7cddfSDavid du Colombier 	".HS",		LCOND,	2,
2387dd7cddfSDavid du Colombier 	".CC",		LCOND,	3,
2397dd7cddfSDavid du Colombier 	".LO",		LCOND,	3,
2407dd7cddfSDavid du Colombier 	".MI",		LCOND,	4,
2417dd7cddfSDavid du Colombier 	".PL",		LCOND,	5,
2427dd7cddfSDavid du Colombier 	".VS",		LCOND,	6,
2437dd7cddfSDavid du Colombier 	".VC",		LCOND,	7,
2447dd7cddfSDavid du Colombier 	".HI",		LCOND,	8,
2457dd7cddfSDavid du Colombier 	".LS",		LCOND,	9,
2467dd7cddfSDavid du Colombier 	".GE",		LCOND,	10,
2477dd7cddfSDavid du Colombier 	".LT",		LCOND,	11,
2487dd7cddfSDavid du Colombier 	".GT",		LCOND,	12,
2497dd7cddfSDavid du Colombier 	".LE",		LCOND,	13,
2507dd7cddfSDavid du Colombier 	".AL",		LCOND,	Always,
2517dd7cddfSDavid du Colombier 
2527dd7cddfSDavid du Colombier 	".U",		LS,	C_UBIT,
2537dd7cddfSDavid du Colombier 	".S",		LS,	C_SBIT,
2547dd7cddfSDavid du Colombier 	".W",		LS,	C_WBIT,
2557dd7cddfSDavid du Colombier 	".P",		LS,	C_PBIT,
2567dd7cddfSDavid du Colombier 	".PW",		LS,	C_WBIT|C_PBIT,
2577dd7cddfSDavid du Colombier 	".WP",		LS,	C_WBIT|C_PBIT,
2587dd7cddfSDavid du Colombier 
2597dd7cddfSDavid du Colombier 	".F",		LS,	C_FBIT,
2607dd7cddfSDavid du Colombier 
2617dd7cddfSDavid du Colombier 	".IBW",		LS,	C_WBIT|C_PBIT|C_UBIT,
2627dd7cddfSDavid du Colombier 	".IAW",		LS,	C_WBIT|C_UBIT,
2637dd7cddfSDavid du Colombier 	".DBW",		LS,	C_WBIT|C_PBIT,
2647dd7cddfSDavid du Colombier 	".DAW",		LS,	C_WBIT,
2657dd7cddfSDavid du Colombier 	".IB",		LS,	C_PBIT|C_UBIT,
2667dd7cddfSDavid du Colombier 	".IA",		LS,	C_UBIT,
2677dd7cddfSDavid du Colombier 	".DB",		LS,	C_PBIT,
2687dd7cddfSDavid du Colombier 	".DA",		LS,	0,
2697dd7cddfSDavid du Colombier 
2707dd7cddfSDavid du Colombier 	"@",		LAT,	0,
2717dd7cddfSDavid du Colombier 
2727dd7cddfSDavid du Colombier 	"AND",		LTYPE1,	AAND,
2737dd7cddfSDavid du Colombier 	"EOR",		LTYPE1,	AEOR,
2747dd7cddfSDavid du Colombier 	"SUB",		LTYPE1,	ASUB,
2757dd7cddfSDavid du Colombier 	"RSB",		LTYPE1,	ARSB,
2767dd7cddfSDavid du Colombier 	"ADD",		LTYPE1,	AADD,
2777dd7cddfSDavid du Colombier 	"ADC",		LTYPE1,	AADC,
2787dd7cddfSDavid du Colombier 	"SBC",		LTYPE1,	ASBC,
2797dd7cddfSDavid du Colombier 	"RSC",		LTYPE1,	ARSC,
2807dd7cddfSDavid du Colombier 	"ORR",		LTYPE1,	AORR,
2817dd7cddfSDavid du Colombier 	"BIC",		LTYPE1,	ABIC,
2827dd7cddfSDavid du Colombier 
2837dd7cddfSDavid du Colombier 	"SLL",		LTYPE1,	ASLL,
2847dd7cddfSDavid du Colombier 	"SRL",		LTYPE1,	ASRL,
2857dd7cddfSDavid du Colombier 	"SRA",		LTYPE1,	ASRA,
2867dd7cddfSDavid du Colombier 
28759cc4ca5SDavid du Colombier 	"MUL",		LTYPE1, AMUL,
28880ee5cbfSDavid du Colombier 	"MULA",		LTYPEN, AMULA,
28959cc4ca5SDavid du Colombier 	"DIV",		LTYPE1,	ADIV,
29059cc4ca5SDavid du Colombier 	"MOD",		LTYPE1,	AMOD,
29159cc4ca5SDavid du Colombier 
29259cc4ca5SDavid du Colombier 	"MULL",		LTYPEM, AMULL,
29359cc4ca5SDavid du Colombier 	"MULAL",	LTYPEM, AMULAL,
29459cc4ca5SDavid du Colombier 	"MULLU",	LTYPEM, AMULLU,
29559cc4ca5SDavid du Colombier 	"MULALU",	LTYPEM, AMULALU,
29659cc4ca5SDavid du Colombier 
2977dd7cddfSDavid du Colombier 	"MVN",		LTYPE2, AMVN,	/* op2 ignored */
2987dd7cddfSDavid du Colombier 
2997dd7cddfSDavid du Colombier 	"MOVB",		LTYPE3, AMOVB,
3007dd7cddfSDavid du Colombier 	"MOVBU",	LTYPE3, AMOVBU,
3017dd7cddfSDavid du Colombier 	"MOVH",		LTYPE3, AMOVH,
3027dd7cddfSDavid du Colombier 	"MOVHU",	LTYPE3, AMOVHU,
3037dd7cddfSDavid du Colombier 	"MOVW",		LTYPE3, AMOVW,
3047dd7cddfSDavid du Colombier 
30559cc4ca5SDavid du Colombier 	"MOVD",		LTYPE3, AMOVD,
30659cc4ca5SDavid du Colombier 	"MOVDF",		LTYPE3, AMOVDF,
30759cc4ca5SDavid du Colombier 	"MOVDW",	LTYPE3, AMOVDW,
30859cc4ca5SDavid du Colombier 	"MOVF",		LTYPE3, AMOVF,
30959cc4ca5SDavid du Colombier 	"MOVFD",		LTYPE3, AMOVFD,
31059cc4ca5SDavid du Colombier 	"MOVFW",		LTYPE3, AMOVFW,
31159cc4ca5SDavid du Colombier 	"MOVWD",	LTYPE3, AMOVWD,
31259cc4ca5SDavid du Colombier 	"MOVWF",		LTYPE3, AMOVWF,
31359cc4ca5SDavid du Colombier 
314*27acba7cSDavid du Colombier 	"LDREX",		LTYPE3, ALDREX,
315*27acba7cSDavid du Colombier 	"LDREXD",		LTYPE3, ALDREXD,
316*27acba7cSDavid du Colombier 	"STREX",		LTYPE9, ASTREX,
317*27acba7cSDavid du Colombier 	"STREXD",		LTYPE9, ASTREXD,
318*27acba7cSDavid du Colombier 
31959cc4ca5SDavid du Colombier /*
32059cc4ca5SDavid du Colombier 	"ABSF",		LTYPEI, AABSF,
32159cc4ca5SDavid du Colombier 	"ABSD",		LTYPEI, AABSD,
32259cc4ca5SDavid du Colombier 	"NEGF",		LTYPEI, ANEGF,
32359cc4ca5SDavid du Colombier 	"NEGD",		LTYPEI, ANEGD,
32459cc4ca5SDavid du Colombier 	"SQTF",		LTYPEI,	ASQTF,
32559cc4ca5SDavid du Colombier 	"SQTD",		LTYPEI,	ASQTD,
32659cc4ca5SDavid du Colombier 	"RNDF",		LTYPEI,	ARNDF,
32759cc4ca5SDavid du Colombier 	"RNDD",		LTYPEI,	ARNDD,
32859cc4ca5SDavid du Colombier 	"URDF",		LTYPEI,	AURDF,
32959cc4ca5SDavid du Colombier 	"URDD",		LTYPEI,	AURDD,
33059cc4ca5SDavid du Colombier 	"NRMF",		LTYPEI,	ANRMF,
33159cc4ca5SDavid du Colombier 	"NRMD",		LTYPEI,	ANRMD,
33259cc4ca5SDavid du Colombier */
33359cc4ca5SDavid du Colombier 
334*27acba7cSDavid du Colombier 	"SQRTF",	LTYPEI, ASQRTF,
335*27acba7cSDavid du Colombier 	"SQRTD",	LTYPEI, ASQRTD,
33659cc4ca5SDavid du Colombier 	"CMPF",		LTYPEL, ACMPF,
33759cc4ca5SDavid du Colombier 	"CMPD",		LTYPEL, ACMPD,
33859cc4ca5SDavid du Colombier 	"ADDF",		LTYPEK,	AADDF,
33959cc4ca5SDavid du Colombier 	"ADDD",		LTYPEK,	AADDD,
34059cc4ca5SDavid du Colombier 	"SUBF",		LTYPEK,	ASUBF,
34159cc4ca5SDavid du Colombier 	"SUBD",		LTYPEK,	ASUBD,
34259cc4ca5SDavid du Colombier 	"MULF",		LTYPEK,	AMULF,
34359cc4ca5SDavid du Colombier 	"MULD",		LTYPEK,	AMULD,
34459cc4ca5SDavid du Colombier 	"DIVF",		LTYPEK,	ADIVF,
34559cc4ca5SDavid du Colombier 	"DIVD",		LTYPEK,	ADIVD,
34659cc4ca5SDavid du Colombier 
3477dd7cddfSDavid du Colombier 	"B",		LTYPE4, AB,
3487dd7cddfSDavid du Colombier 	"BL",		LTYPE4, ABL,
349375daca8SDavid du Colombier 	"BX",		LTYPEBX,	ABX,
3507dd7cddfSDavid du Colombier 
3517dd7cddfSDavid du Colombier 	"BEQ",		LTYPE5,	ABEQ,
3527dd7cddfSDavid du Colombier 	"BNE",		LTYPE5,	ABNE,
3537dd7cddfSDavid du Colombier 	"BCS",		LTYPE5,	ABCS,
3547dd7cddfSDavid du Colombier 	"BHS",		LTYPE5,	ABHS,
3557dd7cddfSDavid du Colombier 	"BCC",		LTYPE5,	ABCC,
3567dd7cddfSDavid du Colombier 	"BLO",		LTYPE5,	ABLO,
3577dd7cddfSDavid du Colombier 	"BMI",		LTYPE5,	ABMI,
3587dd7cddfSDavid du Colombier 	"BPL",		LTYPE5,	ABPL,
3597dd7cddfSDavid du Colombier 	"BVS",		LTYPE5,	ABVS,
3607dd7cddfSDavid du Colombier 	"BVC",		LTYPE5,	ABVC,
3617dd7cddfSDavid du Colombier 	"BHI",		LTYPE5,	ABHI,
3627dd7cddfSDavid du Colombier 	"BLS",		LTYPE5,	ABLS,
3637dd7cddfSDavid du Colombier 	"BGE",		LTYPE5,	ABGE,
3647dd7cddfSDavid du Colombier 	"BLT",		LTYPE5,	ABLT,
3657dd7cddfSDavid du Colombier 	"BGT",		LTYPE5,	ABGT,
3667dd7cddfSDavid du Colombier 	"BLE",		LTYPE5,	ABLE,
36759cc4ca5SDavid du Colombier 	"BCASE",	LTYPE5,	ABCASE,
3687dd7cddfSDavid du Colombier 
3697dd7cddfSDavid du Colombier 	"SWI",		LTYPE6, ASWI,
3707dd7cddfSDavid du Colombier 
3717dd7cddfSDavid du Colombier 	"CMP",		LTYPE7,	ACMP,
3729a747e4fSDavid du Colombier 	"TST",		LTYPE7,	ATST,
3739a747e4fSDavid du Colombier 	"TEQ",		LTYPE7,	ATEQ,
3749a747e4fSDavid du Colombier 	"CMN",		LTYPE7,	ACMN,
3757dd7cddfSDavid du Colombier 
3767dd7cddfSDavid du Colombier 	"MOVM",		LTYPE8, AMOVM,
3777dd7cddfSDavid du Colombier 
3787dd7cddfSDavid du Colombier 	"SWPBU",	LTYPE9, ASWPBU,
3797dd7cddfSDavid du Colombier 	"SWPW",		LTYPE9, ASWPW,
3807dd7cddfSDavid du Colombier 
3817dd7cddfSDavid du Colombier 	"RET",		LTYPEA, ARET,
3827dd7cddfSDavid du Colombier 	"RFE",		LTYPEA, ARFE,
3837dd7cddfSDavid du Colombier 
3847dd7cddfSDavid du Colombier 	"TEXT",		LTYPEB, ATEXT,
3857dd7cddfSDavid du Colombier 	"GLOBL",	LTYPEB, AGLOBL,
3867dd7cddfSDavid du Colombier 	"DATA",		LTYPEC, ADATA,
38759cc4ca5SDavid du Colombier 	"CASE",		LTYPED, ACASE,
38859cc4ca5SDavid du Colombier 	"END",		LTYPEE, AEND,
3897dd7cddfSDavid du Colombier 	"WORD",		LTYPEH, AWORD,
3907dd7cddfSDavid du Colombier 	"NOP",		LTYPEI, ANOP,
3917dd7cddfSDavid du Colombier 
39259cc4ca5SDavid du Colombier 	"MCR",		LTYPEJ, 0,
39359cc4ca5SDavid du Colombier 	"MRC",		LTYPEJ, 1,
3947dd7cddfSDavid du Colombier 	0
3957dd7cddfSDavid du Colombier };
3967dd7cddfSDavid du Colombier 
3977dd7cddfSDavid du Colombier void
cinit(void)3987dd7cddfSDavid du Colombier cinit(void)
3997dd7cddfSDavid du Colombier {
4007dd7cddfSDavid du Colombier 	Sym *s;
4017dd7cddfSDavid du Colombier 	int i;
4027dd7cddfSDavid du Colombier 
4037dd7cddfSDavid du Colombier 	nullgen.sym = S;
4047dd7cddfSDavid du Colombier 	nullgen.offset = 0;
4057dd7cddfSDavid du Colombier 	nullgen.type = D_NONE;
4067dd7cddfSDavid du Colombier 	nullgen.name = D_NONE;
4077dd7cddfSDavid du Colombier 	nullgen.reg = NREG;
4087dd7cddfSDavid du Colombier 	if(FPCHIP)
4097dd7cddfSDavid du Colombier 		nullgen.dval = 0;
4107dd7cddfSDavid du Colombier 	for(i=0; i<sizeof(nullgen.sval); i++)
4117dd7cddfSDavid du Colombier 		nullgen.sval[i] = 0;
4127dd7cddfSDavid du Colombier 
4137dd7cddfSDavid du Colombier 	nerrors = 0;
4147dd7cddfSDavid du Colombier 	iostack = I;
4157dd7cddfSDavid du Colombier 	iofree = I;
4167dd7cddfSDavid du Colombier 	peekc = IGN;
4177dd7cddfSDavid du Colombier 	nhunk = 0;
4187dd7cddfSDavid du Colombier 	for(i=0; i<NHASH; i++)
4197dd7cddfSDavid du Colombier 		hash[i] = S;
4207dd7cddfSDavid du Colombier 	for(i=0; itab[i].name; i++) {
4217dd7cddfSDavid du Colombier 		s = slookup(itab[i].name);
4227dd7cddfSDavid du Colombier 		s->type = itab[i].type;
4237dd7cddfSDavid du Colombier 		s->value = itab[i].value;
4247dd7cddfSDavid du Colombier 	}
4257dd7cddfSDavid du Colombier 
4267dd7cddfSDavid du Colombier 	pathname = allocn(pathname, 0, 100);
427*27acba7cSDavid du Colombier 	if(getwd(pathname, 99) == 0) {
4287dd7cddfSDavid du Colombier 		pathname = allocn(pathname, 100, 900);
429*27acba7cSDavid du Colombier 		if(getwd(pathname, 999) == 0)
4307dd7cddfSDavid du Colombier 			strcpy(pathname, "/???");
4317dd7cddfSDavid du Colombier 	}
4327dd7cddfSDavid du Colombier }
4337dd7cddfSDavid du Colombier 
4347dd7cddfSDavid du Colombier void
syminit(Sym * s)4357dd7cddfSDavid du Colombier syminit(Sym *s)
4367dd7cddfSDavid du Colombier {
4377dd7cddfSDavid du Colombier 
4387dd7cddfSDavid du Colombier 	s->type = LNAME;
4397dd7cddfSDavid du Colombier 	s->value = 0;
4407dd7cddfSDavid du Colombier }
4417dd7cddfSDavid du Colombier 
4427dd7cddfSDavid du Colombier int
isreg(Gen * g)4437dd7cddfSDavid du Colombier isreg(Gen *g)
4447dd7cddfSDavid du Colombier {
4457dd7cddfSDavid du Colombier 
4467dd7cddfSDavid du Colombier 	USED(g);
4477dd7cddfSDavid du Colombier 	return 1;
4487dd7cddfSDavid du Colombier }
4497dd7cddfSDavid du Colombier 
4507dd7cddfSDavid du Colombier void
cclean(void)4517dd7cddfSDavid du Colombier cclean(void)
4527dd7cddfSDavid du Colombier {
4537dd7cddfSDavid du Colombier 
4547dd7cddfSDavid du Colombier 	outcode(AEND, Always, &nullgen, NREG, &nullgen);
4557dd7cddfSDavid du Colombier 	Bflush(&obuf);
4567dd7cddfSDavid du Colombier }
4577dd7cddfSDavid du Colombier 
4587dd7cddfSDavid du Colombier void
zname(char * n,int t,int s)4597dd7cddfSDavid du Colombier zname(char *n, int t, int s)
4607dd7cddfSDavid du Colombier {
4617dd7cddfSDavid du Colombier 
4627dd7cddfSDavid du Colombier 	Bputc(&obuf, ANAME);
4637dd7cddfSDavid du Colombier 	Bputc(&obuf, t);	/* type */
4647dd7cddfSDavid du Colombier 	Bputc(&obuf, s);	/* sym */
4657dd7cddfSDavid du Colombier 	while(*n) {
4667dd7cddfSDavid du Colombier 		Bputc(&obuf, *n);
4677dd7cddfSDavid du Colombier 		n++;
4687dd7cddfSDavid du Colombier 	}
4697dd7cddfSDavid du Colombier 	Bputc(&obuf, 0);
4707dd7cddfSDavid du Colombier }
4717dd7cddfSDavid du Colombier 
4727dd7cddfSDavid du Colombier void
zaddr(Gen * a,int s)4737dd7cddfSDavid du Colombier zaddr(Gen *a, int s)
4747dd7cddfSDavid du Colombier {
4757dd7cddfSDavid du Colombier 	long l;
4767dd7cddfSDavid du Colombier 	int i;
4777dd7cddfSDavid du Colombier 	char *n;
4787dd7cddfSDavid du Colombier 	Ieee e;
4797dd7cddfSDavid du Colombier 
4807dd7cddfSDavid du Colombier 	Bputc(&obuf, a->type);
4817dd7cddfSDavid du Colombier 	Bputc(&obuf, a->reg);
4827dd7cddfSDavid du Colombier 	Bputc(&obuf, s);
4837dd7cddfSDavid du Colombier 	Bputc(&obuf, a->name);
4847dd7cddfSDavid du Colombier 	switch(a->type) {
4857dd7cddfSDavid du Colombier 	default:
4867dd7cddfSDavid du Colombier 		print("unknown type %d\n", a->type);
4877dd7cddfSDavid du Colombier 		exits("arg");
4887dd7cddfSDavid du Colombier 
4897dd7cddfSDavid du Colombier 	case D_NONE:
4907dd7cddfSDavid du Colombier 	case D_REG:
4917dd7cddfSDavid du Colombier 	case D_FREG:
4927dd7cddfSDavid du Colombier 	case D_PSR:
49359cc4ca5SDavid du Colombier 	case D_FPCR:
49459cc4ca5SDavid du Colombier 		break;
49559cc4ca5SDavid du Colombier 
49659cc4ca5SDavid du Colombier 	case D_REGREG:
49759cc4ca5SDavid du Colombier 		Bputc(&obuf, a->offset);
4987dd7cddfSDavid du Colombier 		break;
4997dd7cddfSDavid du Colombier 
5007dd7cddfSDavid du Colombier 	case D_OREG:
5017dd7cddfSDavid du Colombier 	case D_CONST:
5027dd7cddfSDavid du Colombier 	case D_BRANCH:
5037dd7cddfSDavid du Colombier 	case D_SHIFT:
5047dd7cddfSDavid du Colombier 		l = a->offset;
5057dd7cddfSDavid du Colombier 		Bputc(&obuf, l);
5067dd7cddfSDavid du Colombier 		Bputc(&obuf, l>>8);
5077dd7cddfSDavid du Colombier 		Bputc(&obuf, l>>16);
5087dd7cddfSDavid du Colombier 		Bputc(&obuf, l>>24);
5097dd7cddfSDavid du Colombier 		break;
5107dd7cddfSDavid du Colombier 
5117dd7cddfSDavid du Colombier 	case D_SCONST:
5127dd7cddfSDavid du Colombier 		n = a->sval;
5137dd7cddfSDavid du Colombier 		for(i=0; i<NSNAME; i++) {
5147dd7cddfSDavid du Colombier 			Bputc(&obuf, *n);
5157dd7cddfSDavid du Colombier 			n++;
5167dd7cddfSDavid du Colombier 		}
5177dd7cddfSDavid du Colombier 		break;
5187dd7cddfSDavid du Colombier 
5197dd7cddfSDavid du Colombier 	case D_FCONST:
5207dd7cddfSDavid du Colombier 		ieeedtod(&e, a->dval);
5217dd7cddfSDavid du Colombier 		Bputc(&obuf, e.l);
5227dd7cddfSDavid du Colombier 		Bputc(&obuf, e.l>>8);
5237dd7cddfSDavid du Colombier 		Bputc(&obuf, e.l>>16);
5247dd7cddfSDavid du Colombier 		Bputc(&obuf, e.l>>24);
5257dd7cddfSDavid du Colombier 		Bputc(&obuf, e.h);
5267dd7cddfSDavid du Colombier 		Bputc(&obuf, e.h>>8);
5277dd7cddfSDavid du Colombier 		Bputc(&obuf, e.h>>16);
5287dd7cddfSDavid du Colombier 		Bputc(&obuf, e.h>>24);
5297dd7cddfSDavid du Colombier 		break;
5307dd7cddfSDavid du Colombier 	}
5317dd7cddfSDavid du Colombier }
5327dd7cddfSDavid du Colombier 
53359cc4ca5SDavid du Colombier static int bcode[] =
53459cc4ca5SDavid du Colombier {
535375daca8SDavid du Colombier 	ABEQ,
536375daca8SDavid du Colombier 	ABNE,
537375daca8SDavid du Colombier 	ABCS,
538375daca8SDavid du Colombier 	ABCC,
539375daca8SDavid du Colombier 	ABMI,
540375daca8SDavid du Colombier 	ABPL,
541375daca8SDavid du Colombier 	ABVS,
542375daca8SDavid du Colombier 	ABVC,
543375daca8SDavid du Colombier 	ABHI,
544375daca8SDavid du Colombier 	ABLS,
545375daca8SDavid du Colombier 	ABGE,
546375daca8SDavid du Colombier 	ABLT,
547375daca8SDavid du Colombier 	ABGT,
548375daca8SDavid du Colombier 	ABLE,
549375daca8SDavid du Colombier 	AB,
550375daca8SDavid du Colombier 	ANOP,
55159cc4ca5SDavid du Colombier };
55259cc4ca5SDavid du Colombier 
5537dd7cddfSDavid du Colombier void
outcode(int a,int scond,Gen * g1,int reg,Gen * g2)5547dd7cddfSDavid du Colombier outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
5557dd7cddfSDavid du Colombier {
5567dd7cddfSDavid du Colombier 	int sf, st, t;
5577dd7cddfSDavid du Colombier 	Sym *s;
5587dd7cddfSDavid du Colombier 
55959cc4ca5SDavid du Colombier 	/* hack to make B.NE etc. work: turn it into the corresponding conditional */
56059cc4ca5SDavid du Colombier 	if(a == AB){
56159cc4ca5SDavid du Colombier 		a = bcode[scond&0xf];
56259cc4ca5SDavid du Colombier 		scond = (scond & ~0xf) | Always;
56359cc4ca5SDavid du Colombier 	}
56459cc4ca5SDavid du Colombier 
5657dd7cddfSDavid du Colombier 	if(pass == 1)
5667dd7cddfSDavid du Colombier 		goto out;
5677dd7cddfSDavid du Colombier jackpot:
5687dd7cddfSDavid du Colombier 	sf = 0;
5697dd7cddfSDavid du Colombier 	s = g1->sym;
5707dd7cddfSDavid du Colombier 	while(s != S) {
5717dd7cddfSDavid du Colombier 		sf = s->sym;
5727dd7cddfSDavid du Colombier 		if(sf < 0 || sf >= NSYM)
5737dd7cddfSDavid du Colombier 			sf = 0;
5747dd7cddfSDavid du Colombier 		t = g1->name;
5757dd7cddfSDavid du Colombier 		if(h[sf].type == t)
5767dd7cddfSDavid du Colombier 		if(h[sf].sym == s)
5777dd7cddfSDavid du Colombier 			break;
5787dd7cddfSDavid du Colombier 		zname(s->name, t, sym);
5797dd7cddfSDavid du Colombier 		s->sym = sym;
5807dd7cddfSDavid du Colombier 		h[sym].sym = s;
5817dd7cddfSDavid du Colombier 		h[sym].type = t;
5827dd7cddfSDavid du Colombier 		sf = sym;
5837dd7cddfSDavid du Colombier 		sym++;
5847dd7cddfSDavid du Colombier 		if(sym >= NSYM)
5857dd7cddfSDavid du Colombier 			sym = 1;
5867dd7cddfSDavid du Colombier 		break;
5877dd7cddfSDavid du Colombier 	}
5887dd7cddfSDavid du Colombier 	st = 0;
5897dd7cddfSDavid du Colombier 	s = g2->sym;
5907dd7cddfSDavid du Colombier 	while(s != S) {
5917dd7cddfSDavid du Colombier 		st = s->sym;
5927dd7cddfSDavid du Colombier 		if(st < 0 || st >= NSYM)
5937dd7cddfSDavid du Colombier 			st = 0;
5947dd7cddfSDavid du Colombier 		t = g2->name;
5957dd7cddfSDavid du Colombier 		if(h[st].type == t)
5967dd7cddfSDavid du Colombier 		if(h[st].sym == s)
5977dd7cddfSDavid du Colombier 			break;
5987dd7cddfSDavid du Colombier 		zname(s->name, t, sym);
5997dd7cddfSDavid du Colombier 		s->sym = sym;
6007dd7cddfSDavid du Colombier 		h[sym].sym = s;
6017dd7cddfSDavid du Colombier 		h[sym].type = t;
6027dd7cddfSDavid du Colombier 		st = sym;
6037dd7cddfSDavid du Colombier 		sym++;
6047dd7cddfSDavid du Colombier 		if(sym >= NSYM)
6057dd7cddfSDavid du Colombier 			sym = 1;
6067dd7cddfSDavid du Colombier 		if(st == sf)
6077dd7cddfSDavid du Colombier 			goto jackpot;
6087dd7cddfSDavid du Colombier 		break;
6097dd7cddfSDavid du Colombier 	}
6107dd7cddfSDavid du Colombier 	Bputc(&obuf, a);
6117dd7cddfSDavid du Colombier 	Bputc(&obuf, scond);
6127dd7cddfSDavid du Colombier 	Bputc(&obuf, reg);
6137dd7cddfSDavid du Colombier 	Bputc(&obuf, lineno);
6147dd7cddfSDavid du Colombier 	Bputc(&obuf, lineno>>8);
6157dd7cddfSDavid du Colombier 	Bputc(&obuf, lineno>>16);
6167dd7cddfSDavid du Colombier 	Bputc(&obuf, lineno>>24);
6177dd7cddfSDavid du Colombier 	zaddr(g1, sf);
6187dd7cddfSDavid du Colombier 	zaddr(g2, st);
6197dd7cddfSDavid du Colombier 
6207dd7cddfSDavid du Colombier out:
6217dd7cddfSDavid du Colombier 	if(a != AGLOBL && a != ADATA)
6227dd7cddfSDavid du Colombier 		pc++;
6237dd7cddfSDavid du Colombier }
6247dd7cddfSDavid du Colombier 
6257dd7cddfSDavid du Colombier void
outhist(void)6267dd7cddfSDavid du Colombier outhist(void)
6277dd7cddfSDavid du Colombier {
6287dd7cddfSDavid du Colombier 	Gen g;
6297dd7cddfSDavid du Colombier 	Hist *h;
6307dd7cddfSDavid du Colombier 	char *p, *q, *op, c;
6317dd7cddfSDavid du Colombier 	int n;
6327dd7cddfSDavid du Colombier 
6337dd7cddfSDavid du Colombier 	g = nullgen;
6347dd7cddfSDavid du Colombier 	c = pathchar();
6357dd7cddfSDavid du Colombier 	for(h = hist; h != H; h = h->link) {
6367dd7cddfSDavid du Colombier 		p = h->name;
6377dd7cddfSDavid du Colombier 		op = 0;
638375daca8SDavid du Colombier 		/* on windows skip drive specifier in pathname */
639375daca8SDavid du Colombier 		if(systemtype(Windows) && p && p[1] == ':'){
640375daca8SDavid du Colombier 			p += 2;
641375daca8SDavid du Colombier 			c = *p;
642375daca8SDavid du Colombier 		}
6437dd7cddfSDavid du Colombier 		if(p && p[0] != c && h->offset == 0 && pathname){
6447dd7cddfSDavid du Colombier 			/* on windows skip drive specifier in pathname */
645375daca8SDavid du Colombier 			if(systemtype(Windows) && pathname[1] == ':') {
6467dd7cddfSDavid du Colombier 				op = p;
6477dd7cddfSDavid du Colombier 				p = pathname+2;
648375daca8SDavid du Colombier 				c = *p;
6497dd7cddfSDavid du Colombier 			} else if(pathname[0] == c){
6507dd7cddfSDavid du Colombier 				op = p;
6517dd7cddfSDavid du Colombier 				p = pathname;
6527dd7cddfSDavid du Colombier 			}
6537dd7cddfSDavid du Colombier 		}
6547dd7cddfSDavid du Colombier 		while(p) {
6557dd7cddfSDavid du Colombier 			q = strchr(p, c);
6567dd7cddfSDavid du Colombier 			if(q) {
6577dd7cddfSDavid du Colombier 				n = q-p;
658375daca8SDavid du Colombier 				if(n == 0){
6597dd7cddfSDavid du Colombier 					n = 1;	/* leading "/" */
660375daca8SDavid du Colombier 					*p = '/';	/* don't emit "\" on windows */
661375daca8SDavid du Colombier 				}
6627dd7cddfSDavid du Colombier 				q++;
6637dd7cddfSDavid du Colombier 			} else {
6647dd7cddfSDavid du Colombier 				n = strlen(p);
6657dd7cddfSDavid du Colombier 				q = 0;
6667dd7cddfSDavid du Colombier 			}
6677dd7cddfSDavid du Colombier 			if(n) {
6687dd7cddfSDavid du Colombier 				Bputc(&obuf, ANAME);
6697dd7cddfSDavid du Colombier 				Bputc(&obuf, D_FILE);	/* type */
6707dd7cddfSDavid du Colombier 				Bputc(&obuf, 1);	/* sym */
6717dd7cddfSDavid du Colombier 				Bputc(&obuf, '<');
6727dd7cddfSDavid du Colombier 				Bwrite(&obuf, p, n);
6737dd7cddfSDavid du Colombier 				Bputc(&obuf, 0);
6747dd7cddfSDavid du Colombier 			}
6757dd7cddfSDavid du Colombier 			p = q;
6767dd7cddfSDavid du Colombier 			if(p == 0 && op) {
6777dd7cddfSDavid du Colombier 				p = op;
6787dd7cddfSDavid du Colombier 				op = 0;
6797dd7cddfSDavid du Colombier 			}
6807dd7cddfSDavid du Colombier 		}
6817dd7cddfSDavid du Colombier 		g.offset = h->offset;
6827dd7cddfSDavid du Colombier 
6837dd7cddfSDavid du Colombier 		Bputc(&obuf, AHISTORY);
6847dd7cddfSDavid du Colombier 		Bputc(&obuf, Always);
6857dd7cddfSDavid du Colombier 		Bputc(&obuf, 0);
6867dd7cddfSDavid du Colombier 		Bputc(&obuf, h->line);
6877dd7cddfSDavid du Colombier 		Bputc(&obuf, h->line>>8);
6887dd7cddfSDavid du Colombier 		Bputc(&obuf, h->line>>16);
6897dd7cddfSDavid du Colombier 		Bputc(&obuf, h->line>>24);
6907dd7cddfSDavid du Colombier 		zaddr(&nullgen, 0);
6917dd7cddfSDavid du Colombier 		zaddr(&g, 0);
6927dd7cddfSDavid du Colombier 	}
6937dd7cddfSDavid du Colombier }
6947dd7cddfSDavid du Colombier 
6957dd7cddfSDavid du Colombier #include "../cc/lexbody"
6967dd7cddfSDavid du Colombier #include "../cc/macbody"
6977dd7cddfSDavid du Colombier #include "../cc/compat"
698