xref: /plan9-contrib/sys/src/cmd/4a/lex.c (revision f8bc6aaf8056e137bcdfb6117a990ac3eff62cc9)
17edc7532SDavid du Colombier #define	EXTERN
27edc7532SDavid du Colombier #include "a.h"
37edc7532SDavid du Colombier #include "y.tab.h"
4*f8bc6aafSDavid du Colombier #include <ctype.h>
57edc7532SDavid du Colombier 
67edc7532SDavid du Colombier void
main(int argc,char * argv[])77edc7532SDavid du Colombier main(int argc, char *argv[])
87edc7532SDavid du Colombier {
97edc7532SDavid du Colombier 	char *p;
107edc7532SDavid du Colombier 	int nout, nproc, status, i, c;
117edc7532SDavid du Colombier 
127edc7532SDavid du Colombier 	thechar = '4';
13*f8bc6aafSDavid du Colombier 	thestring = "mips64";
147edc7532SDavid du Colombier 	memset(debug, 0, sizeof(debug));
157edc7532SDavid du Colombier 	cinit();
167edc7532SDavid du Colombier 	outfile = 0;
177edc7532SDavid du Colombier 	include[ninclude++] = ".";
187edc7532SDavid du Colombier 	ARGBEGIN {
197edc7532SDavid du Colombier 	default:
207edc7532SDavid du Colombier 		c = ARGC();
217edc7532SDavid du Colombier 		if(c >= 0 || c < sizeof(debug))
227edc7532SDavid du Colombier 			debug[c] = 1;
237edc7532SDavid du Colombier 		break;
247edc7532SDavid du Colombier 
257edc7532SDavid du Colombier 	case 'o':
267edc7532SDavid du Colombier 		outfile = ARGF();
277edc7532SDavid du Colombier 		break;
287edc7532SDavid du Colombier 
297edc7532SDavid du Colombier 	case 'D':
307edc7532SDavid du Colombier 		p = ARGF();
317edc7532SDavid du Colombier 		if(p)
327edc7532SDavid du Colombier 			Dlist[nDlist++] = p;
337edc7532SDavid du Colombier 		break;
347edc7532SDavid du Colombier 
357edc7532SDavid du Colombier 	case 'I':
367edc7532SDavid du Colombier 		p = ARGF();
377edc7532SDavid du Colombier 		setinclude(p);
387edc7532SDavid du Colombier 		break;
39*f8bc6aafSDavid du Colombier 	case  'L':			/* for little-endian mips */
40*f8bc6aafSDavid du Colombier 		thechar = 'x';	/* XXX the char unknown */
41*f8bc6aafSDavid du Colombier 		thestring = "spim64";
42*f8bc6aafSDavid du Colombier 		break;
437edc7532SDavid du Colombier 	} ARGEND
447edc7532SDavid du Colombier 	if(*argv == 0) {
457edc7532SDavid du Colombier 		print("usage: %ca [-options] file.s\n", thechar);
467edc7532SDavid du Colombier 		errorexit();
477edc7532SDavid du Colombier 	}
487edc7532SDavid du Colombier 	if(argc > 1 && systemtype(Windows)){
497edc7532SDavid du Colombier 		print("can't assemble multiple files on windows\n");
507edc7532SDavid du Colombier 		errorexit();
517edc7532SDavid du Colombier 	}
527edc7532SDavid du Colombier 	if(argc > 1 && !systemtype(Windows)) {
537edc7532SDavid du Colombier 		nproc = 1;
547edc7532SDavid du Colombier 		if(p = getenv("NPROC"))
557edc7532SDavid du Colombier 			nproc = atol(p);	/* */
567edc7532SDavid du Colombier 		c = 0;
577edc7532SDavid du Colombier 		nout = 0;
587edc7532SDavid du Colombier 		for(;;) {
597edc7532SDavid du Colombier 			while(nout < nproc && argc > 0) {
607edc7532SDavid du Colombier 				i = myfork();
617edc7532SDavid du Colombier 				if(i < 0) {
627edc7532SDavid du Colombier 					i = mywait(&status);
637edc7532SDavid du Colombier 					if(i < 0)
647edc7532SDavid du Colombier 						errorexit();
657edc7532SDavid du Colombier 					if(status)
667edc7532SDavid du Colombier 						c++;
677edc7532SDavid du Colombier 					nout--;
687edc7532SDavid du Colombier 					continue;
697edc7532SDavid du Colombier 				}
707edc7532SDavid du Colombier 				if(i == 0) {
717edc7532SDavid du Colombier 					print("%s:\n", *argv);
727edc7532SDavid du Colombier 					if(assemble(*argv))
737edc7532SDavid du Colombier 						errorexit();
747edc7532SDavid du Colombier 					exits(0);
757edc7532SDavid du Colombier 				}
767edc7532SDavid du Colombier 				nout++;
777edc7532SDavid du Colombier 				argc--;
787edc7532SDavid du Colombier 				argv++;
797edc7532SDavid du Colombier 			}
807edc7532SDavid du Colombier 			i = mywait(&status);
817edc7532SDavid du Colombier 			if(i < 0) {
827edc7532SDavid du Colombier 				if(c)
837edc7532SDavid du Colombier 					errorexit();
847edc7532SDavid du Colombier 				exits(0);
857edc7532SDavid du Colombier 			}
867edc7532SDavid du Colombier 			if(status)
877edc7532SDavid du Colombier 				c++;
887edc7532SDavid du Colombier 			nout--;
897edc7532SDavid du Colombier 		}
907edc7532SDavid du Colombier 	}
917edc7532SDavid du Colombier 	if(assemble(argv[0]))
927edc7532SDavid du Colombier 		errorexit();
937edc7532SDavid du Colombier 	exits(0);
947edc7532SDavid du Colombier }
957edc7532SDavid du Colombier 
967edc7532SDavid du Colombier int
assemble(char * file)977edc7532SDavid du Colombier assemble(char *file)
987edc7532SDavid du Colombier {
997edc7532SDavid du Colombier 	char ofile[100], incfile[20], *p;
1007edc7532SDavid du Colombier 	int i, of;
1017edc7532SDavid du Colombier 
1027edc7532SDavid du Colombier 	strcpy(ofile, file);
1037edc7532SDavid du Colombier 	p = utfrrune(ofile, pathchar());
1047edc7532SDavid du Colombier 	if(p) {
1057edc7532SDavid du Colombier 		include[0] = ofile;
1067edc7532SDavid du Colombier 		*p++ = 0;
1077edc7532SDavid du Colombier 	} else
1087edc7532SDavid du Colombier 		p = ofile;
1097edc7532SDavid du Colombier 	if(outfile == 0) {
1107edc7532SDavid du Colombier 		outfile = p;
1117edc7532SDavid du Colombier 		if(outfile){
1127edc7532SDavid du Colombier 			p = utfrrune(outfile, '.');
1137edc7532SDavid du Colombier 			if(p)
1147edc7532SDavid du Colombier 				if(p[1] == 's' && p[2] == 0)
1157edc7532SDavid du Colombier 					p[0] = 0;
1167edc7532SDavid du Colombier 			p = utfrune(outfile, 0);
1177edc7532SDavid du Colombier 			p[0] = '.';
1187edc7532SDavid du Colombier 			p[1] = thechar;
1197edc7532SDavid du Colombier 			p[2] = 0;
1207edc7532SDavid du Colombier 		} else
1217edc7532SDavid du Colombier 			outfile = "/dev/null";
1227edc7532SDavid du Colombier 	}
1237edc7532SDavid du Colombier 	p = getenv("INCLUDE");
1247edc7532SDavid du Colombier 	if(p) {
1257edc7532SDavid du Colombier 		setinclude(p);
1267edc7532SDavid du Colombier 	} else {
1277edc7532SDavid du Colombier 		if(systemtype(Plan9)) {
1287edc7532SDavid du Colombier 			sprint(incfile,"/%s/include", thestring);
1297edc7532SDavid du Colombier 			setinclude(strdup(incfile));
1307edc7532SDavid du Colombier 		}
1317edc7532SDavid du Colombier 	}
1327edc7532SDavid du Colombier 
1337edc7532SDavid du Colombier 	of = mycreat(outfile, 0664);
1347edc7532SDavid du Colombier 	if(of < 0) {
1357edc7532SDavid du Colombier 		yyerror("%ca: cannot create %s", thechar, outfile);
1367edc7532SDavid du Colombier 		errorexit();
1377edc7532SDavid du Colombier 	}
1387edc7532SDavid du Colombier 	Binit(&obuf, of, OWRITE);
1397edc7532SDavid du Colombier 
1407edc7532SDavid du Colombier 	pass = 1;
1417edc7532SDavid du Colombier 	pinit(file);
1427edc7532SDavid du Colombier 	for(i=0; i<nDlist; i++)
1437edc7532SDavid du Colombier 		dodefine(Dlist[i]);
1447edc7532SDavid du Colombier 	yyparse();
1457edc7532SDavid du Colombier 	if(nerrors) {
1467edc7532SDavid du Colombier 		cclean();
1477edc7532SDavid du Colombier 		return nerrors;
1487edc7532SDavid du Colombier 	}
1497edc7532SDavid du Colombier 
1507edc7532SDavid du Colombier 	pass = 2;
1517edc7532SDavid du Colombier 	outhist();
1527edc7532SDavid du Colombier 	pinit(file);
1537edc7532SDavid du Colombier 	for(i=0; i<nDlist; i++)
1547edc7532SDavid du Colombier 		dodefine(Dlist[i]);
1557edc7532SDavid du Colombier 	yyparse();
1567edc7532SDavid du Colombier 	cclean();
1577edc7532SDavid du Colombier 	return nerrors;
1587edc7532SDavid du Colombier }
1597edc7532SDavid du Colombier 
1607edc7532SDavid du Colombier struct
1617edc7532SDavid du Colombier {
1627edc7532SDavid du Colombier 	char	*name;
1637edc7532SDavid du Colombier 	ushort	type;
1647edc7532SDavid du Colombier 	ushort	value;
1657edc7532SDavid du Colombier } itab[] =
1667edc7532SDavid du Colombier {
1677edc7532SDavid du Colombier 	"SP",		LSP,	D_AUTO,
1687edc7532SDavid du Colombier 	"SB",		LSB,	D_EXTERN,
1697edc7532SDavid du Colombier 	"FP",		LFP,	D_PARAM,
1707edc7532SDavid du Colombier 	"PC",		LPC,	D_BRANCH,
1717edc7532SDavid du Colombier 	"HI",		LHI,	D_HI,
1727edc7532SDavid du Colombier 	"LO",		LLO,	D_LO,
1737edc7532SDavid du Colombier 
1747edc7532SDavid du Colombier 	"R",		LR,	0,
1757edc7532SDavid du Colombier 	"R0",		LREG,	0,
1767edc7532SDavid du Colombier 	"R1",		LREG,	1,
1777edc7532SDavid du Colombier 	"R2",		LREG,	2,
1787edc7532SDavid du Colombier 	"R3",		LREG,	3,
1797edc7532SDavid du Colombier 	"R4",		LREG,	4,
1807edc7532SDavid du Colombier 	"R5",		LREG,	5,
1817edc7532SDavid du Colombier 	"R6",		LREG,	6,
1827edc7532SDavid du Colombier 	"R7",		LREG,	7,
1837edc7532SDavid du Colombier 	"R8",		LREG,	8,
1847edc7532SDavid du Colombier 	"R9",		LREG,	9,
1857edc7532SDavid du Colombier 	"R10",		LREG,	10,
1867edc7532SDavid du Colombier 	"R11",		LREG,	11,
1877edc7532SDavid du Colombier 	"R12",		LREG,	12,
1887edc7532SDavid du Colombier 	"R13",		LREG,	13,
1897edc7532SDavid du Colombier 	"R14",		LREG,	14,
1907edc7532SDavid du Colombier 	"R15",		LREG,	15,
1917edc7532SDavid du Colombier 	"R16",		LREG,	16,
1927edc7532SDavid du Colombier 	"R17",		LREG,	17,
1937edc7532SDavid du Colombier 	"R18",		LREG,	18,
1947edc7532SDavid du Colombier 	"R19",		LREG,	19,
1957edc7532SDavid du Colombier 	"R20",		LREG,	20,
1967edc7532SDavid du Colombier 	"R21",		LREG,	21,
1977edc7532SDavid du Colombier 	"R22",		LREG,	22,
1987edc7532SDavid du Colombier 	"R23",		LREG,	23,
1997edc7532SDavid du Colombier 	"R24",		LREG,	24,
2007edc7532SDavid du Colombier 	"R25",		LREG,	25,
2017edc7532SDavid du Colombier 	"R26",		LREG,	26,
2027edc7532SDavid du Colombier 	"R27",		LREG,	27,
2037edc7532SDavid du Colombier 	"R28",		LREG,	28,
2047edc7532SDavid du Colombier 	"R29",		LREG,	29,
2057edc7532SDavid du Colombier 	"R30",		LREG,	30,
2067edc7532SDavid du Colombier 	"R31",		LREG,	31,
2077edc7532SDavid du Colombier 
2087edc7532SDavid du Colombier 	"M",		LM,	0,
2097edc7532SDavid du Colombier 	"M0",		LMREG,	0,
2107edc7532SDavid du Colombier 	"M1",		LMREG,	1,
2117edc7532SDavid du Colombier 	"M2",		LMREG,	2,
2127edc7532SDavid du Colombier 	"M3",		LMREG,	3,
2137edc7532SDavid du Colombier 	"M4",		LMREG,	4,
2147edc7532SDavid du Colombier 	"M5",		LMREG,	5,
2157edc7532SDavid du Colombier 	"M6",		LMREG,	6,
2167edc7532SDavid du Colombier 	"M7",		LMREG,	7,
2177edc7532SDavid du Colombier 	"M8",		LMREG,	8,
2187edc7532SDavid du Colombier 	"M9",		LMREG,	9,
2197edc7532SDavid du Colombier 	"M10",		LMREG,	10,
2207edc7532SDavid du Colombier 	"M11",		LMREG,	11,
2217edc7532SDavid du Colombier 	"M12",		LMREG,	12,
2227edc7532SDavid du Colombier 	"M13",		LMREG,	13,
2237edc7532SDavid du Colombier 	"M14",		LMREG,	14,
2247edc7532SDavid du Colombier 	"M15",		LMREG,	15,
2257edc7532SDavid du Colombier 	"M16",		LMREG,	16,
2267edc7532SDavid du Colombier 	"M17",		LMREG,	17,
2277edc7532SDavid du Colombier 	"M18",		LMREG,	18,
2287edc7532SDavid du Colombier 	"M19",		LMREG,	19,
2297edc7532SDavid du Colombier 	"M20",		LMREG,	20,
2307edc7532SDavid du Colombier 	"M21",		LMREG,	21,
2317edc7532SDavid du Colombier 	"M22",		LMREG,	22,
2327edc7532SDavid du Colombier 	"M23",		LMREG,	23,
2337edc7532SDavid du Colombier 	"M24",		LMREG,	24,
2347edc7532SDavid du Colombier 	"M25",		LMREG,	25,
2357edc7532SDavid du Colombier 	"M26",		LMREG,	26,
2367edc7532SDavid du Colombier 	"M27",		LMREG,	27,
2377edc7532SDavid du Colombier 	"M28",		LMREG,	28,
2387edc7532SDavid du Colombier 	"M29",		LMREG,	29,
2397edc7532SDavid du Colombier 	"M30",		LMREG,	30,
2407edc7532SDavid du Colombier 	"M31",		LMREG,	31,
2417edc7532SDavid du Colombier 
2427edc7532SDavid du Colombier 	"F",		LF,	0,
2437edc7532SDavid du Colombier 
2447edc7532SDavid du Colombier 	"F0",		LFREG,	0,
2457edc7532SDavid du Colombier 	"F1",		LFREG,	1,
2467edc7532SDavid du Colombier 	"F2",		LFREG,	2,
2477edc7532SDavid du Colombier 	"F3",		LFREG,	3,
2487edc7532SDavid du Colombier 	"F4",		LFREG,	4,
2497edc7532SDavid du Colombier 	"F5",		LFREG,	5,
2507edc7532SDavid du Colombier 	"F6",		LFREG,	6,
2517edc7532SDavid du Colombier 	"F7",		LFREG,	7,
2527edc7532SDavid du Colombier 	"F8",		LFREG,	8,
2537edc7532SDavid du Colombier 	"F9",		LFREG,	9,
2547edc7532SDavid du Colombier 	"F10",		LFREG,	10,
2557edc7532SDavid du Colombier 	"F11",		LFREG,	11,
2567edc7532SDavid du Colombier 	"F12",		LFREG,	12,
2577edc7532SDavid du Colombier 	"F13",		LFREG,	13,
2587edc7532SDavid du Colombier 	"F14",		LFREG,	14,
2597edc7532SDavid du Colombier 	"F15",		LFREG,	15,
2607edc7532SDavid du Colombier 	"F16",		LFREG,	16,
2617edc7532SDavid du Colombier 	"F17",		LFREG,	17,
2627edc7532SDavid du Colombier 	"F18",		LFREG,	18,
2637edc7532SDavid du Colombier 	"F19",		LFREG,	19,
2647edc7532SDavid du Colombier 	"F20",		LFREG,	20,
2657edc7532SDavid du Colombier 	"F21",		LFREG,	21,
2667edc7532SDavid du Colombier 	"F22",		LFREG,	22,
2677edc7532SDavid du Colombier 	"F23",		LFREG,	23,
2687edc7532SDavid du Colombier 	"F24",		LFREG,	24,
2697edc7532SDavid du Colombier 	"F25",		LFREG,	25,
2707edc7532SDavid du Colombier 	"F26",		LFREG,	26,
2717edc7532SDavid du Colombier 	"F27",		LFREG,	27,
2727edc7532SDavid du Colombier 	"F28",		LFREG,	28,
2737edc7532SDavid du Colombier 	"F29",		LFREG,	29,
2747edc7532SDavid du Colombier 	"F30",		LFREG,	30,
2757edc7532SDavid du Colombier 	"F31",		LFREG,	31,
2767edc7532SDavid du Colombier 
2777edc7532SDavid du Colombier 	"FCR",		LFCR,	0,
2787edc7532SDavid du Colombier 	"FCR0",		LFCREG,	0,
2797edc7532SDavid du Colombier 	"FCR1",		LFCREG,	1,
2807edc7532SDavid du Colombier 	"FCR2",		LFCREG,	2,
2817edc7532SDavid du Colombier 	"FCR3",		LFCREG,	3,
2827edc7532SDavid du Colombier 	"FCR4",		LFCREG,	4,
2837edc7532SDavid du Colombier 	"FCR5",		LFCREG,	5,
2847edc7532SDavid du Colombier 	"FCR6",		LFCREG,	6,
2857edc7532SDavid du Colombier 	"FCR7",		LFCREG,	7,
2867edc7532SDavid du Colombier 	"FCR8",		LFCREG,	8,
2877edc7532SDavid du Colombier 	"FCR9",		LFCREG,	9,
2887edc7532SDavid du Colombier 	"FCR10",	LFCREG,	10,
2897edc7532SDavid du Colombier 	"FCR11",	LFCREG,	11,
2907edc7532SDavid du Colombier 	"FCR12",	LFCREG,	12,
2917edc7532SDavid du Colombier 	"FCR13",	LFCREG,	13,
2927edc7532SDavid du Colombier 	"FCR14",	LFCREG,	14,
2937edc7532SDavid du Colombier 	"FCR15",	LFCREG,	15,
2947edc7532SDavid du Colombier 	"FCR16",	LFCREG,	16,
2957edc7532SDavid du Colombier 	"FCR17",	LFCREG,	17,
2967edc7532SDavid du Colombier 	"FCR18",	LFCREG,	18,
2977edc7532SDavid du Colombier 	"FCR19",	LFCREG,	19,
2987edc7532SDavid du Colombier 	"FCR20",	LFCREG,	20,
2997edc7532SDavid du Colombier 	"FCR21",	LFCREG,	21,
3007edc7532SDavid du Colombier 	"FCR22",	LFCREG,	22,
3017edc7532SDavid du Colombier 	"FCR23",	LFCREG,	23,
3027edc7532SDavid du Colombier 	"FCR24",	LFCREG,	24,
3037edc7532SDavid du Colombier 	"FCR25",	LFCREG,	25,
3047edc7532SDavid du Colombier 	"FCR26",	LFCREG,	26,
3057edc7532SDavid du Colombier 	"FCR27",	LFCREG,	27,
3067edc7532SDavid du Colombier 	"FCR28",	LFCREG,	28,
3077edc7532SDavid du Colombier 	"FCR29",	LFCREG,	29,
3087edc7532SDavid du Colombier 	"FCR30",	LFCREG,	30,
3097edc7532SDavid du Colombier 	"FCR31",	LFCREG,	31,
3107edc7532SDavid du Colombier 
3117edc7532SDavid du Colombier 	"ADD",		LTYPE1, AADD,
3127edc7532SDavid du Colombier 	"ADDU",		LTYPE1, AADDU,
3137edc7532SDavid du Colombier 	"SUB",		LTYPE1, ASUB,	/* converted to ADD(-) in loader */
3147edc7532SDavid du Colombier 	"SUBU",		LTYPE1, ASUBU,
3157edc7532SDavid du Colombier 	"SGT",		LTYPE1, ASGT,
3167edc7532SDavid du Colombier 	"SGTU",		LTYPE1, ASGTU,
3177edc7532SDavid du Colombier 	"AND",		LTYPE1, AAND,
3187edc7532SDavid du Colombier 	"OR",		LTYPE1, AOR,
3197edc7532SDavid du Colombier 	"XOR",		LTYPE1, AXOR,
3207edc7532SDavid du Colombier 	"SLL",		LTYPE1, ASLL,
3217edc7532SDavid du Colombier 	"SRL",		LTYPE1, ASRL,
3227edc7532SDavid du Colombier 	"SRA",		LTYPE1, ASRA,
3237edc7532SDavid du Colombier 
3247edc7532SDavid du Colombier 	"ADDV",		LTYPE1, AADDV,
3257edc7532SDavid du Colombier 	"ADDVU",		LTYPE1, AADDVU,
3267edc7532SDavid du Colombier 	"SUBV",		LTYPE1, ASUBV,	/* converted to ADD(-) in loader */
3277edc7532SDavid du Colombier 	"SUBVU",		LTYPE1, ASUBVU,
3287edc7532SDavid du Colombier 	"SLLV",		LTYPE1, ASLLV,
3297edc7532SDavid du Colombier 	"SRLV",		LTYPE1, ASRLV,
3307edc7532SDavid du Colombier 	"SRAV",		LTYPE1, ASRAV,
3317edc7532SDavid du Colombier 
3327edc7532SDavid du Colombier 	"NOR",		LTYPE2, ANOR,
3337edc7532SDavid du Colombier 
3347edc7532SDavid du Colombier 	"MOVB",		LTYPE3, AMOVB,
3357edc7532SDavid du Colombier 	"MOVBU",	LTYPE3, AMOVBU,
3367edc7532SDavid du Colombier 	"MOVH",		LTYPE3, AMOVH,
3377edc7532SDavid du Colombier 	"MOVHU",	LTYPE3, AMOVHU,
3387edc7532SDavid du Colombier 	"MOVWL",	LTYPE3, AMOVWL,
3397edc7532SDavid du Colombier 	"MOVWR",	LTYPE3, AMOVWR,
3407edc7532SDavid du Colombier 	"MOVVL",	LTYPE3, AMOVVL,
3417edc7532SDavid du Colombier 	"MOVVR",	LTYPE3, AMOVVR,
3427edc7532SDavid du Colombier 
3437edc7532SDavid du Colombier 	"BREAK",	LTYPEJ, ABREAK,		/* overloaded CACHE opcode */
3447edc7532SDavid du Colombier 	"END",		LTYPE4, AEND,
3457edc7532SDavid du Colombier 	"REM",		LTYPE6, AREM,
3467edc7532SDavid du Colombier 	"REMU",		LTYPE6, AREMU,
3477edc7532SDavid du Colombier 	"RET",		LTYPE4, ARET,
3487edc7532SDavid du Colombier 	"SYSCALL",	LTYPE4, ASYSCALL,
3497edc7532SDavid du Colombier 	"TLBP",		LTYPE4, ATLBP,
3507edc7532SDavid du Colombier 	"TLBR",		LTYPE4, ATLBR,
3517edc7532SDavid du Colombier 	"TLBWI",	LTYPE4, ATLBWI,
3527edc7532SDavid du Colombier 	"TLBWR",	LTYPE4, ATLBWR,
3537edc7532SDavid du Colombier 
3547edc7532SDavid du Colombier 	"MOVW",		LTYPE5, AMOVW,
3557edc7532SDavid du Colombier 	"MOVV",		LTYPE5, AMOVV,
3567edc7532SDavid du Colombier 	"MOVD",		LTYPE5, AMOVD,
3577edc7532SDavid du Colombier 	"MOVF",		LTYPE5, AMOVF,
3587edc7532SDavid du Colombier 
3597edc7532SDavid du Colombier 	"DIV",		LTYPE6, ADIV,
3607edc7532SDavid du Colombier 	"DIVU",		LTYPE6, ADIVU,
3617edc7532SDavid du Colombier 	"MUL",		LTYPE6, AMUL,
3627edc7532SDavid du Colombier 	"MULU",		LTYPE6, AMULU,
3637edc7532SDavid du Colombier 	"DIVV",		LTYPE6, ADIVV,
3647edc7532SDavid du Colombier 	"DIVVU",		LTYPE6, ADIVVU,
3657edc7532SDavid du Colombier 	"MULV",		LTYPE6, AMULV,
3667edc7532SDavid du Colombier 	"MULVU",		LTYPE6, AMULVU,
3677edc7532SDavid du Colombier 
3687edc7532SDavid du Colombier 	"RFE",		LTYPE7, ARFE,
3697edc7532SDavid du Colombier 	"JMP",		LTYPE7, AJMP,
3707edc7532SDavid du Colombier 
3717edc7532SDavid du Colombier 	"JAL",		LTYPE8, AJAL,
3727edc7532SDavid du Colombier 
3737edc7532SDavid du Colombier 	"BEQ",		LTYPE9, ABEQ,
3747edc7532SDavid du Colombier 	"BNE",		LTYPE9, ABNE,
3757edc7532SDavid du Colombier 
3767edc7532SDavid du Colombier 	"BGEZ",		LTYPEA, ABGEZ,
3777edc7532SDavid du Colombier 	"BGEZAL",	LTYPEA, ABGEZAL,
3787edc7532SDavid du Colombier 	"BGTZ",		LTYPEA, ABGTZ,
3797edc7532SDavid du Colombier 	"BLEZ",		LTYPEA, ABLEZ,
3807edc7532SDavid du Colombier 	"BLTZ",		LTYPEA, ABLTZ,
3817edc7532SDavid du Colombier 	"BLTZAL",	LTYPEA, ABLTZAL,
3827edc7532SDavid du Colombier 
3837edc7532SDavid du Colombier 	"TEXT",		LTYPEB, ATEXT,
3847edc7532SDavid du Colombier 	"GLOBL",	LTYPEB, AGLOBL,
3857edc7532SDavid du Colombier 
3867edc7532SDavid du Colombier 	"DATA",		LTYPEC, ADATA,
3877edc7532SDavid du Colombier 
3887edc7532SDavid du Colombier 	"MOVDF",	LTYPE5, AMOVDF,
3897edc7532SDavid du Colombier 	"MOVDW",	LTYPE5, AMOVDW,
3907edc7532SDavid du Colombier 	"MOVFD",	LTYPE5, AMOVFD,
3917edc7532SDavid du Colombier 	"MOVFW",	LTYPE5, AMOVFW,
3927edc7532SDavid du Colombier 	"MOVWD",	LTYPE5, AMOVWD,
3937edc7532SDavid du Colombier 	"MOVWF",	LTYPE5, AMOVWF,
3947edc7532SDavid du Colombier 
3957edc7532SDavid du Colombier 	"ABSD",		LTYPED, AABSD,
3967edc7532SDavid du Colombier 	"ABSF",		LTYPED, AABSF,
3977edc7532SDavid du Colombier 	"ABSW",		LTYPED, AABSW,
3987edc7532SDavid du Colombier 	"NEGD",		LTYPED, ANEGD,
3997edc7532SDavid du Colombier 	"NEGF",		LTYPED, ANEGF,
4007edc7532SDavid du Colombier 	"NEGW",		LTYPED, ANEGW,
4017edc7532SDavid du Colombier 
4027edc7532SDavid du Colombier 	"CMPEQD",	LTYPEF, ACMPEQD,
4037edc7532SDavid du Colombier 	"CMPEQF",	LTYPEF, ACMPEQF,
4047edc7532SDavid du Colombier 	"CMPGED",	LTYPEF, ACMPGED,
4057edc7532SDavid du Colombier 	"CMPGEF",	LTYPEF, ACMPGEF,
4067edc7532SDavid du Colombier 	"CMPGTD",	LTYPEF, ACMPGTD,
4077edc7532SDavid du Colombier 	"CMPGTF",	LTYPEF, ACMPGTF,
4087edc7532SDavid du Colombier 
4097edc7532SDavid du Colombier 	"ADDD",		LTYPEE, AADDD,
4107edc7532SDavid du Colombier 	"ADDF",		LTYPEE, AADDF,
4117edc7532SDavid du Colombier 	"ADDW",		LTYPEE, AADDW,
4127edc7532SDavid du Colombier 	"DIVD",		LTYPEE, ADIVD,
4137edc7532SDavid du Colombier 	"DIVF",		LTYPEE, ADIVF,
4147edc7532SDavid du Colombier 	"DIVW",		LTYPEE, ADIVW,
4157edc7532SDavid du Colombier 	"MULD",		LTYPEE, AMULD,
4167edc7532SDavid du Colombier 	"MULF",		LTYPEE, AMULF,
4177edc7532SDavid du Colombier 	"MULW",		LTYPEE, AMULW,
4187edc7532SDavid du Colombier 	"SUBD",		LTYPEE, ASUBD,
4197edc7532SDavid du Colombier 	"SUBF",		LTYPEE, ASUBF,
4207edc7532SDavid du Colombier 	"SUBW",		LTYPEE, ASUBW,
4217edc7532SDavid du Colombier 
4227edc7532SDavid du Colombier 	"BFPT",		LTYPEG, ABFPT,
4237edc7532SDavid du Colombier 	"BFPF",		LTYPEG, ABFPF,
4247edc7532SDavid du Colombier 
4257edc7532SDavid du Colombier 	"WORD",		LTYPEH, AWORD,
4267edc7532SDavid du Colombier 	"NOP",		LTYPEI, ANOP,
4277edc7532SDavid du Colombier 	"SCHED",	LSCHED, 0,
4287edc7532SDavid du Colombier 	"NOSCHED",	LSCHED, 0x80,
4297edc7532SDavid du Colombier 	0
4307edc7532SDavid du Colombier };
4317edc7532SDavid du Colombier 
4327edc7532SDavid du Colombier void
cinit(void)4337edc7532SDavid du Colombier cinit(void)
4347edc7532SDavid du Colombier {
4357edc7532SDavid du Colombier 	Sym *s;
4367edc7532SDavid du Colombier 	int i;
4377edc7532SDavid du Colombier 
4387edc7532SDavid du Colombier 	nullgen.sym = S;
4397edc7532SDavid du Colombier 	nullgen.offset = 0;
4407edc7532SDavid du Colombier 	nullgen.type = D_NONE;
4417edc7532SDavid du Colombier 	nullgen.name = D_NONE;
4427edc7532SDavid du Colombier 	nullgen.reg = NREG;
4437edc7532SDavid du Colombier 	if(FPCHIP)
4447edc7532SDavid du Colombier 		nullgen.dval = 0;
4457edc7532SDavid du Colombier 	for(i=0; i<sizeof(nullgen.sval); i++)
4467edc7532SDavid du Colombier 		nullgen.sval[i] = 0;
4477edc7532SDavid du Colombier 
4487edc7532SDavid du Colombier 	nerrors = 0;
4497edc7532SDavid du Colombier 	iostack = I;
4507edc7532SDavid du Colombier 	iofree = I;
4517edc7532SDavid du Colombier 	peekc = IGN;
4527edc7532SDavid du Colombier 	nhunk = 0;
4537edc7532SDavid du Colombier 	for(i=0; i<NHASH; i++)
4547edc7532SDavid du Colombier 		hash[i] = S;
4557edc7532SDavid du Colombier 	for(i=0; itab[i].name; i++) {
4567edc7532SDavid du Colombier 		s = slookup(itab[i].name);
4577edc7532SDavid du Colombier 		s->type = itab[i].type;
4587edc7532SDavid du Colombier 		s->value = itab[i].value;
4597edc7532SDavid du Colombier 	}
4607edc7532SDavid du Colombier 
461*f8bc6aafSDavid du Colombier 	pathname = allocn(pathname, 0, 100);
4627edc7532SDavid du Colombier 	if(mygetwd(pathname, 99) == 0) {
4637edc7532SDavid du Colombier 		pathname = allocn(pathname, 100, 900);
4647edc7532SDavid du Colombier 		if(mygetwd(pathname, 999) == 0)
4657edc7532SDavid du Colombier 			strcpy(pathname, "/???");
4667edc7532SDavid du Colombier 	}
4677edc7532SDavid du Colombier }
4687edc7532SDavid du Colombier 
4697edc7532SDavid du Colombier void
syminit(Sym * s)4707edc7532SDavid du Colombier syminit(Sym *s)
4717edc7532SDavid du Colombier {
4727edc7532SDavid du Colombier 
4737edc7532SDavid du Colombier 	s->type = LNAME;
4747edc7532SDavid du Colombier 	s->value = 0;
4757edc7532SDavid du Colombier }
4767edc7532SDavid du Colombier 
4777edc7532SDavid du Colombier int
isreg(Gen * g)4787edc7532SDavid du Colombier isreg(Gen *g)
4797edc7532SDavid du Colombier {
4807edc7532SDavid du Colombier 
4817edc7532SDavid du Colombier 	USED(g);
4827edc7532SDavid du Colombier 	return 1;
4837edc7532SDavid du Colombier }
4847edc7532SDavid du Colombier 
4857edc7532SDavid du Colombier void
cclean(void)4867edc7532SDavid du Colombier cclean(void)
4877edc7532SDavid du Colombier {
4887edc7532SDavid du Colombier 
4897edc7532SDavid du Colombier 	outcode(AEND, &nullgen, NREG, &nullgen);
4907edc7532SDavid du Colombier 	Bflush(&obuf);
4917edc7532SDavid du Colombier }
4927edc7532SDavid du Colombier 
4937edc7532SDavid du Colombier void
zname(char * n,int t,int s)4947edc7532SDavid du Colombier zname(char *n, int t, int s)
4957edc7532SDavid du Colombier {
4967edc7532SDavid du Colombier 
4977edc7532SDavid du Colombier 	Bputc(&obuf, ANAME);
4987edc7532SDavid du Colombier 	Bputc(&obuf, t);	/* type */
4997edc7532SDavid du Colombier 	Bputc(&obuf, s);	/* sym */
5007edc7532SDavid du Colombier 	while(*n) {
5017edc7532SDavid du Colombier 		Bputc(&obuf, *n);
5027edc7532SDavid du Colombier 		n++;
5037edc7532SDavid du Colombier 	}
5047edc7532SDavid du Colombier 	Bputc(&obuf, 0);
5057edc7532SDavid du Colombier }
5067edc7532SDavid du Colombier 
5077edc7532SDavid du Colombier void
zaddr(Gen * a,int s)5087edc7532SDavid du Colombier zaddr(Gen *a, int s)
5097edc7532SDavid du Colombier {
5107edc7532SDavid du Colombier 	long l;
5117edc7532SDavid du Colombier 	int i;
5127edc7532SDavid du Colombier 	char *n;
5137edc7532SDavid du Colombier 	Ieee e;
5147edc7532SDavid du Colombier 	vlong v;
5157edc7532SDavid du Colombier 
5167edc7532SDavid du Colombier 	Bputc(&obuf, a->type);
5177edc7532SDavid du Colombier 	Bputc(&obuf, a->reg);
5187edc7532SDavid du Colombier 	Bputc(&obuf, s);
5197edc7532SDavid du Colombier 	Bputc(&obuf, a->name);
5207edc7532SDavid du Colombier 	switch(a->type) {
5217edc7532SDavid du Colombier 	default:
5227edc7532SDavid du Colombier 		print("unknown type %d\n", a->type);
5237edc7532SDavid du Colombier 		exits("arg");
5247edc7532SDavid du Colombier 
5257edc7532SDavid du Colombier 	case D_NONE:
5267edc7532SDavid du Colombier 	case D_REG:
5277edc7532SDavid du Colombier 	case D_FREG:
5287edc7532SDavid du Colombier 	case D_MREG:
5297edc7532SDavid du Colombier 	case D_FCREG:
5307edc7532SDavid du Colombier 	case D_LO:
5317edc7532SDavid du Colombier 	case D_HI:
5327edc7532SDavid du Colombier 		break;
5337edc7532SDavid du Colombier 
5347edc7532SDavid du Colombier 	case D_OREG:
5357edc7532SDavid du Colombier 	case D_CONST:
5367edc7532SDavid du Colombier 	case D_OCONST:
5377edc7532SDavid du Colombier 	case D_BRANCH:
5387edc7532SDavid du Colombier 		l = a->offset;
5397edc7532SDavid du Colombier 		Bputc(&obuf, l);
5407edc7532SDavid du Colombier 		Bputc(&obuf, l>>8);
5417edc7532SDavid du Colombier 		Bputc(&obuf, l>>16);
5427edc7532SDavid du Colombier 		Bputc(&obuf, l>>24);
5437edc7532SDavid du Colombier 		break;
5447edc7532SDavid du Colombier 
5457edc7532SDavid du Colombier 	case D_SCONST:
5467edc7532SDavid du Colombier 		n = a->sval;
5477edc7532SDavid du Colombier 		for(i=0; i<NSNAME; i++) {
5487edc7532SDavid du Colombier 			Bputc(&obuf, *n);
5497edc7532SDavid du Colombier 			n++;
5507edc7532SDavid du Colombier 		}
5517edc7532SDavid du Colombier 		break;
5527edc7532SDavid du Colombier 
5537edc7532SDavid du Colombier 	case D_FCONST:
5547edc7532SDavid du Colombier 		ieeedtod(&e, a->dval);
5557edc7532SDavid du Colombier 		Bputc(&obuf, e.l);
5567edc7532SDavid du Colombier 		Bputc(&obuf, e.l>>8);
5577edc7532SDavid du Colombier 		Bputc(&obuf, e.l>>16);
5587edc7532SDavid du Colombier 		Bputc(&obuf, e.l>>24);
5597edc7532SDavid du Colombier 		Bputc(&obuf, e.h);
5607edc7532SDavid du Colombier 		Bputc(&obuf, e.h>>8);
5617edc7532SDavid du Colombier 		Bputc(&obuf, e.h>>16);
5627edc7532SDavid du Colombier 		Bputc(&obuf, e.h>>24);
5637edc7532SDavid du Colombier 		break;
5647edc7532SDavid du Colombier 
5657edc7532SDavid du Colombier 	case D_VCONST:
566*f8bc6aafSDavid du Colombier 		v = a->offset;
5677edc7532SDavid du Colombier 		Bputc(&obuf, v);
5687edc7532SDavid du Colombier 		Bputc(&obuf, v>>8);
5697edc7532SDavid du Colombier 		Bputc(&obuf, v>>16);
5707edc7532SDavid du Colombier 		Bputc(&obuf, v>>24);
5717edc7532SDavid du Colombier 		Bputc(&obuf, v>>32);
5727edc7532SDavid du Colombier 		Bputc(&obuf, v>>40);
5737edc7532SDavid du Colombier 		Bputc(&obuf, v>>48);
5747edc7532SDavid du Colombier 		Bputc(&obuf, v>>56);
5757edc7532SDavid du Colombier 		break;
5767edc7532SDavid du Colombier 	}
5777edc7532SDavid du Colombier }
5787edc7532SDavid du Colombier 
5797edc7532SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)5807edc7532SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
5817edc7532SDavid du Colombier {
5827edc7532SDavid du Colombier 	int sf, st, t;
5837edc7532SDavid du Colombier 	Sym *s;
5847edc7532SDavid du Colombier 
5857edc7532SDavid du Colombier 	if(pass == 1)
5867edc7532SDavid du Colombier 		goto out;
5877edc7532SDavid du Colombier jackpot:
5887edc7532SDavid du Colombier 	sf = 0;
5897edc7532SDavid du Colombier 	s = g1->sym;
5907edc7532SDavid du Colombier 	while(s != S) {
5917edc7532SDavid du Colombier 		sf = s->sym;
5927edc7532SDavid du Colombier 		if(sf < 0 || sf >= NSYM)
5937edc7532SDavid du Colombier 			sf = 0;
5947edc7532SDavid du Colombier 		t = g1->name;
5957edc7532SDavid du Colombier 		if(h[sf].type == t)
5967edc7532SDavid du Colombier 		if(h[sf].sym == s)
5977edc7532SDavid du Colombier 			break;
5987edc7532SDavid du Colombier 		zname(s->name, t, sym);
5997edc7532SDavid du Colombier 		s->sym = sym;
6007edc7532SDavid du Colombier 		h[sym].sym = s;
6017edc7532SDavid du Colombier 		h[sym].type = t;
6027edc7532SDavid du Colombier 		sf = sym;
6037edc7532SDavid du Colombier 		sym++;
6047edc7532SDavid du Colombier 		if(sym >= NSYM)
6057edc7532SDavid du Colombier 			sym = 1;
6067edc7532SDavid du Colombier 		break;
6077edc7532SDavid du Colombier 	}
6087edc7532SDavid du Colombier 	st = 0;
6097edc7532SDavid du Colombier 	s = g2->sym;
6107edc7532SDavid du Colombier 	while(s != S) {
6117edc7532SDavid du Colombier 		st = s->sym;
6127edc7532SDavid du Colombier 		if(st < 0 || st >= NSYM)
6137edc7532SDavid du Colombier 			st = 0;
6147edc7532SDavid du Colombier 		t = g2->name;
6157edc7532SDavid du Colombier 		if(h[st].type == t)
6167edc7532SDavid du Colombier 		if(h[st].sym == s)
6177edc7532SDavid du Colombier 			break;
6187edc7532SDavid du Colombier 		zname(s->name, t, sym);
6197edc7532SDavid du Colombier 		s->sym = sym;
6207edc7532SDavid du Colombier 		h[sym].sym = s;
6217edc7532SDavid du Colombier 		h[sym].type = t;
6227edc7532SDavid du Colombier 		st = sym;
6237edc7532SDavid du Colombier 		sym++;
6247edc7532SDavid du Colombier 		if(sym >= NSYM)
6257edc7532SDavid du Colombier 			sym = 1;
6267edc7532SDavid du Colombier 		if(st == sf)
6277edc7532SDavid du Colombier 			goto jackpot;
6287edc7532SDavid du Colombier 		break;
6297edc7532SDavid du Colombier 	}
6307edc7532SDavid du Colombier 	Bputc(&obuf, a);
6317edc7532SDavid du Colombier 	Bputc(&obuf, reg|nosched);
6327edc7532SDavid du Colombier 	Bputc(&obuf, lineno);
6337edc7532SDavid du Colombier 	Bputc(&obuf, lineno>>8);
6347edc7532SDavid du Colombier 	Bputc(&obuf, lineno>>16);
6357edc7532SDavid du Colombier 	Bputc(&obuf, lineno>>24);
6367edc7532SDavid du Colombier 	zaddr(g1, sf);
6377edc7532SDavid du Colombier 	zaddr(g2, st);
6387edc7532SDavid du Colombier 
6397edc7532SDavid du Colombier out:
6407edc7532SDavid du Colombier 	if(a != AGLOBL && a != ADATA)
6417edc7532SDavid du Colombier 		pc++;
6427edc7532SDavid du Colombier }
6437edc7532SDavid du Colombier 
6447edc7532SDavid du Colombier void
outhist(void)6457edc7532SDavid du Colombier outhist(void)
6467edc7532SDavid du Colombier {
6477edc7532SDavid du Colombier 	Gen g;
6487edc7532SDavid du Colombier 	Hist *h;
6497edc7532SDavid du Colombier 	char *p, *q, *op, c;
6507edc7532SDavid du Colombier 	int n;
6517edc7532SDavid du Colombier 
6527edc7532SDavid du Colombier 	g = nullgen;
6537edc7532SDavid du Colombier 	c = pathchar();
6547edc7532SDavid du Colombier 	for(h = hist; h != H; h = h->link) {
6557edc7532SDavid du Colombier 		p = h->name;
6567edc7532SDavid du Colombier 		op = 0;
657*f8bc6aafSDavid du Colombier 		/* on windows skip drive specifier in pathname */
658*f8bc6aafSDavid du Colombier 		if(systemtype(Windows) && p && p[1] == ':'){
659*f8bc6aafSDavid du Colombier 			p += 2;
660*f8bc6aafSDavid du Colombier 			c = *p;
661*f8bc6aafSDavid du Colombier 		}
6627edc7532SDavid du Colombier 		if(p && p[0] != c && h->offset == 0 && pathname){
6637edc7532SDavid du Colombier 			/* on windows skip drive specifier in pathname */
664*f8bc6aafSDavid du Colombier 			if(systemtype(Windows) && pathname[1] == ':') {
6657edc7532SDavid du Colombier 				op = p;
6667edc7532SDavid du Colombier 				p = pathname+2;
667*f8bc6aafSDavid du Colombier 				c = *p;
6687edc7532SDavid du Colombier 			} else if(pathname[0] == c){
6697edc7532SDavid du Colombier 				op = p;
6707edc7532SDavid du Colombier 				p = pathname;
6717edc7532SDavid du Colombier 			}
6727edc7532SDavid du Colombier 		}
6737edc7532SDavid du Colombier 		while(p) {
6747edc7532SDavid du Colombier 			q = strchr(p, c);
6757edc7532SDavid du Colombier 			if(q) {
6767edc7532SDavid du Colombier 				n = q-p;
677*f8bc6aafSDavid du Colombier 				if(n == 0){
6787edc7532SDavid du Colombier 					n = 1;	/* leading "/" */
679*f8bc6aafSDavid du Colombier 					*p = '/';	/* don't emit "\" on windows */
680*f8bc6aafSDavid du Colombier 				}
6817edc7532SDavid du Colombier 				q++;
6827edc7532SDavid du Colombier 			} else {
6837edc7532SDavid du Colombier 				n = strlen(p);
6847edc7532SDavid du Colombier 				q = 0;
6857edc7532SDavid du Colombier 			}
6867edc7532SDavid du Colombier 			if(n) {
6877edc7532SDavid du Colombier 				Bputc(&obuf, ANAME);
6887edc7532SDavid du Colombier 				Bputc(&obuf, D_FILE);	/* type */
6897edc7532SDavid du Colombier 				Bputc(&obuf, 1);	/* sym */
6907edc7532SDavid du Colombier 				Bputc(&obuf, '<');
6917edc7532SDavid du Colombier 				Bwrite(&obuf, p, n);
6927edc7532SDavid du Colombier 				Bputc(&obuf, 0);
6937edc7532SDavid du Colombier 			}
6947edc7532SDavid du Colombier 			p = q;
6957edc7532SDavid du Colombier 			if(p == 0 && op) {
6967edc7532SDavid du Colombier 				p = op;
6977edc7532SDavid du Colombier 				op = 0;
6987edc7532SDavid du Colombier 			}
6997edc7532SDavid du Colombier 		}
7007edc7532SDavid du Colombier 		g.offset = h->offset;
7017edc7532SDavid du Colombier 
7027edc7532SDavid du Colombier 		Bputc(&obuf, AHISTORY);
7037edc7532SDavid du Colombier 		Bputc(&obuf, 0);
7047edc7532SDavid du Colombier 		Bputc(&obuf, h->line);
7057edc7532SDavid du Colombier 		Bputc(&obuf, h->line>>8);
7067edc7532SDavid du Colombier 		Bputc(&obuf, h->line>>16);
7077edc7532SDavid du Colombier 		Bputc(&obuf, h->line>>24);
7087edc7532SDavid du Colombier 		zaddr(&nullgen, 0);
7097edc7532SDavid du Colombier 		zaddr(&g, 0);
7107edc7532SDavid du Colombier 	}
7117edc7532SDavid du Colombier }
7127edc7532SDavid du Colombier 
713*f8bc6aafSDavid du Colombier #include "../cc/lexbody"
7147edc7532SDavid du Colombier #include "../cc/macbody"
7157edc7532SDavid du Colombier #include "../cc/compat"
716