174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "a.h"
374a4d8c2SCharles.Forsyth #include "y.tab.h"
474a4d8c2SCharles.Forsyth #include <ctype.h>
574a4d8c2SCharles.Forsyth
674a4d8c2SCharles.Forsyth void
main(int argc,char * argv[])774a4d8c2SCharles.Forsyth main(int argc, char *argv[])
874a4d8c2SCharles.Forsyth {
974a4d8c2SCharles.Forsyth char *p;
1074a4d8c2SCharles.Forsyth int nout, nproc, status, i, c;
1174a4d8c2SCharles.Forsyth
1274a4d8c2SCharles.Forsyth thechar = 'v';
1374a4d8c2SCharles.Forsyth thestring = "mips";
1474a4d8c2SCharles.Forsyth memset(debug, 0, sizeof(debug));
1574a4d8c2SCharles.Forsyth cinit();
1674a4d8c2SCharles.Forsyth outfile = 0;
1774a4d8c2SCharles.Forsyth include[ninclude++] = ".";
1874a4d8c2SCharles.Forsyth ARGBEGIN {
1974a4d8c2SCharles.Forsyth default:
2074a4d8c2SCharles.Forsyth c = ARGC();
2174a4d8c2SCharles.Forsyth if(c >= 0 || c < sizeof(debug))
2274a4d8c2SCharles.Forsyth debug[c] = 1;
2374a4d8c2SCharles.Forsyth break;
2474a4d8c2SCharles.Forsyth
2574a4d8c2SCharles.Forsyth case 'o':
2674a4d8c2SCharles.Forsyth outfile = ARGF();
2774a4d8c2SCharles.Forsyth break;
2874a4d8c2SCharles.Forsyth
2974a4d8c2SCharles.Forsyth case 'D':
3074a4d8c2SCharles.Forsyth p = ARGF();
3174a4d8c2SCharles.Forsyth if(p)
3274a4d8c2SCharles.Forsyth Dlist[nDlist++] = p;
3374a4d8c2SCharles.Forsyth break;
3474a4d8c2SCharles.Forsyth
3574a4d8c2SCharles.Forsyth case 'I':
3674a4d8c2SCharles.Forsyth p = ARGF();
3774a4d8c2SCharles.Forsyth setinclude(p);
3874a4d8c2SCharles.Forsyth break;
39d67b7dadSforsyth case 'L': /* for little-endian mips */
40d67b7dadSforsyth thechar = '0';
41d67b7dadSforsyth thestring = "spim";
42d67b7dadSforsyth break;
4374a4d8c2SCharles.Forsyth } ARGEND
4474a4d8c2SCharles.Forsyth if(*argv == 0) {
4574a4d8c2SCharles.Forsyth print("usage: %ca [-options] file.s\n", thechar);
4674a4d8c2SCharles.Forsyth errorexit();
4774a4d8c2SCharles.Forsyth }
4874a4d8c2SCharles.Forsyth if(argc > 1 && systemtype(Windows)){
4974a4d8c2SCharles.Forsyth print("can't assemble multiple files on windows\n");
5074a4d8c2SCharles.Forsyth errorexit();
5174a4d8c2SCharles.Forsyth }
5274a4d8c2SCharles.Forsyth if(argc > 1 && !systemtype(Windows)) {
5374a4d8c2SCharles.Forsyth nproc = 1;
5474a4d8c2SCharles.Forsyth if(p = getenv("NPROC"))
5574a4d8c2SCharles.Forsyth nproc = atol(p); /* */
5674a4d8c2SCharles.Forsyth c = 0;
5774a4d8c2SCharles.Forsyth nout = 0;
5874a4d8c2SCharles.Forsyth for(;;) {
5974a4d8c2SCharles.Forsyth while(nout < nproc && argc > 0) {
6074a4d8c2SCharles.Forsyth i = myfork();
6174a4d8c2SCharles.Forsyth if(i < 0) {
6274a4d8c2SCharles.Forsyth i = mywait(&status);
6374a4d8c2SCharles.Forsyth if(i < 0)
6474a4d8c2SCharles.Forsyth errorexit();
6574a4d8c2SCharles.Forsyth if(status)
6674a4d8c2SCharles.Forsyth c++;
6774a4d8c2SCharles.Forsyth nout--;
6874a4d8c2SCharles.Forsyth continue;
6974a4d8c2SCharles.Forsyth }
7074a4d8c2SCharles.Forsyth if(i == 0) {
7174a4d8c2SCharles.Forsyth print("%s:\n", *argv);
7274a4d8c2SCharles.Forsyth if(assemble(*argv))
7374a4d8c2SCharles.Forsyth errorexit();
7474a4d8c2SCharles.Forsyth exits(0);
7574a4d8c2SCharles.Forsyth }
7674a4d8c2SCharles.Forsyth nout++;
7774a4d8c2SCharles.Forsyth argc--;
7874a4d8c2SCharles.Forsyth argv++;
7974a4d8c2SCharles.Forsyth }
8074a4d8c2SCharles.Forsyth i = mywait(&status);
8174a4d8c2SCharles.Forsyth if(i < 0) {
8274a4d8c2SCharles.Forsyth if(c)
8374a4d8c2SCharles.Forsyth errorexit();
8474a4d8c2SCharles.Forsyth exits(0);
8574a4d8c2SCharles.Forsyth }
8674a4d8c2SCharles.Forsyth if(status)
8774a4d8c2SCharles.Forsyth c++;
8874a4d8c2SCharles.Forsyth nout--;
8974a4d8c2SCharles.Forsyth }
9074a4d8c2SCharles.Forsyth }
9174a4d8c2SCharles.Forsyth if(assemble(argv[0]))
9274a4d8c2SCharles.Forsyth errorexit();
9374a4d8c2SCharles.Forsyth exits(0);
9474a4d8c2SCharles.Forsyth }
9574a4d8c2SCharles.Forsyth
9674a4d8c2SCharles.Forsyth int
assemble(char * file)9774a4d8c2SCharles.Forsyth assemble(char *file)
9874a4d8c2SCharles.Forsyth {
9974a4d8c2SCharles.Forsyth char ofile[100], incfile[20], *p;
10074a4d8c2SCharles.Forsyth int i, of;
10174a4d8c2SCharles.Forsyth
10274a4d8c2SCharles.Forsyth strcpy(ofile, file);
10374a4d8c2SCharles.Forsyth p = utfrrune(ofile, pathchar());
10474a4d8c2SCharles.Forsyth if(p) {
10574a4d8c2SCharles.Forsyth include[0] = ofile;
10674a4d8c2SCharles.Forsyth *p++ = 0;
10774a4d8c2SCharles.Forsyth } else
10874a4d8c2SCharles.Forsyth p = ofile;
10974a4d8c2SCharles.Forsyth if(outfile == 0) {
11074a4d8c2SCharles.Forsyth outfile = p;
11174a4d8c2SCharles.Forsyth if(outfile){
11274a4d8c2SCharles.Forsyth p = utfrrune(outfile, '.');
11374a4d8c2SCharles.Forsyth if(p)
11474a4d8c2SCharles.Forsyth if(p[1] == 's' && p[2] == 0)
11574a4d8c2SCharles.Forsyth p[0] = 0;
11674a4d8c2SCharles.Forsyth p = utfrune(outfile, 0);
11774a4d8c2SCharles.Forsyth p[0] = '.';
11874a4d8c2SCharles.Forsyth p[1] = thechar;
11974a4d8c2SCharles.Forsyth p[2] = 0;
12074a4d8c2SCharles.Forsyth } else
12174a4d8c2SCharles.Forsyth outfile = "/dev/null";
12274a4d8c2SCharles.Forsyth }
12374a4d8c2SCharles.Forsyth p = getenv("INCLUDE");
12474a4d8c2SCharles.Forsyth if(p) {
12574a4d8c2SCharles.Forsyth setinclude(p);
12674a4d8c2SCharles.Forsyth } else {
12774a4d8c2SCharles.Forsyth if(systemtype(Plan9)) {
12874a4d8c2SCharles.Forsyth sprint(incfile,"/%s/include", thestring);
12974a4d8c2SCharles.Forsyth setinclude(strdup(incfile));
13074a4d8c2SCharles.Forsyth }
13174a4d8c2SCharles.Forsyth }
13274a4d8c2SCharles.Forsyth
13374a4d8c2SCharles.Forsyth of = mycreat(outfile, 0664);
13474a4d8c2SCharles.Forsyth if(of < 0) {
13574a4d8c2SCharles.Forsyth yyerror("%ca: cannot create %s", thechar, outfile);
13674a4d8c2SCharles.Forsyth errorexit();
13774a4d8c2SCharles.Forsyth }
13874a4d8c2SCharles.Forsyth Binit(&obuf, of, OWRITE);
13974a4d8c2SCharles.Forsyth
14074a4d8c2SCharles.Forsyth pass = 1;
14174a4d8c2SCharles.Forsyth pinit(file);
14274a4d8c2SCharles.Forsyth for(i=0; i<nDlist; i++)
14374a4d8c2SCharles.Forsyth dodefine(Dlist[i]);
14474a4d8c2SCharles.Forsyth yyparse();
14574a4d8c2SCharles.Forsyth if(nerrors) {
14674a4d8c2SCharles.Forsyth cclean();
14774a4d8c2SCharles.Forsyth return nerrors;
14874a4d8c2SCharles.Forsyth }
14974a4d8c2SCharles.Forsyth
15074a4d8c2SCharles.Forsyth pass = 2;
15174a4d8c2SCharles.Forsyth outhist();
15274a4d8c2SCharles.Forsyth pinit(file);
15374a4d8c2SCharles.Forsyth for(i=0; i<nDlist; i++)
15474a4d8c2SCharles.Forsyth dodefine(Dlist[i]);
15574a4d8c2SCharles.Forsyth yyparse();
15674a4d8c2SCharles.Forsyth cclean();
15774a4d8c2SCharles.Forsyth return nerrors;
15874a4d8c2SCharles.Forsyth }
15974a4d8c2SCharles.Forsyth
16074a4d8c2SCharles.Forsyth struct
16174a4d8c2SCharles.Forsyth {
16274a4d8c2SCharles.Forsyth char *name;
16374a4d8c2SCharles.Forsyth ushort type;
16474a4d8c2SCharles.Forsyth ushort value;
16574a4d8c2SCharles.Forsyth } itab[] =
16674a4d8c2SCharles.Forsyth {
16774a4d8c2SCharles.Forsyth "SP", LSP, D_AUTO,
16874a4d8c2SCharles.Forsyth "SB", LSB, D_EXTERN,
16974a4d8c2SCharles.Forsyth "FP", LFP, D_PARAM,
17074a4d8c2SCharles.Forsyth "PC", LPC, D_BRANCH,
17174a4d8c2SCharles.Forsyth "HI", LHI, D_HI,
17274a4d8c2SCharles.Forsyth "LO", LLO, D_LO,
17374a4d8c2SCharles.Forsyth
17474a4d8c2SCharles.Forsyth "R", LR, 0,
17574a4d8c2SCharles.Forsyth "R0", LREG, 0,
17674a4d8c2SCharles.Forsyth "R1", LREG, 1,
17774a4d8c2SCharles.Forsyth "R2", LREG, 2,
17874a4d8c2SCharles.Forsyth "R3", LREG, 3,
17974a4d8c2SCharles.Forsyth "R4", LREG, 4,
18074a4d8c2SCharles.Forsyth "R5", LREG, 5,
18174a4d8c2SCharles.Forsyth "R6", LREG, 6,
18274a4d8c2SCharles.Forsyth "R7", LREG, 7,
18374a4d8c2SCharles.Forsyth "R8", LREG, 8,
18474a4d8c2SCharles.Forsyth "R9", LREG, 9,
18574a4d8c2SCharles.Forsyth "R10", LREG, 10,
18674a4d8c2SCharles.Forsyth "R11", LREG, 11,
18774a4d8c2SCharles.Forsyth "R12", LREG, 12,
18874a4d8c2SCharles.Forsyth "R13", LREG, 13,
18974a4d8c2SCharles.Forsyth "R14", LREG, 14,
19074a4d8c2SCharles.Forsyth "R15", LREG, 15,
19174a4d8c2SCharles.Forsyth "R16", LREG, 16,
19274a4d8c2SCharles.Forsyth "R17", LREG, 17,
19374a4d8c2SCharles.Forsyth "R18", LREG, 18,
19474a4d8c2SCharles.Forsyth "R19", LREG, 19,
19574a4d8c2SCharles.Forsyth "R20", LREG, 20,
19674a4d8c2SCharles.Forsyth "R21", LREG, 21,
19774a4d8c2SCharles.Forsyth "R22", LREG, 22,
19874a4d8c2SCharles.Forsyth "R23", LREG, 23,
19974a4d8c2SCharles.Forsyth "R24", LREG, 24,
20074a4d8c2SCharles.Forsyth "R25", LREG, 25,
20174a4d8c2SCharles.Forsyth "R26", LREG, 26,
20274a4d8c2SCharles.Forsyth "R27", LREG, 27,
20374a4d8c2SCharles.Forsyth "R28", LREG, 28,
20474a4d8c2SCharles.Forsyth "R29", LREG, 29,
20574a4d8c2SCharles.Forsyth "R30", LREG, 30,
20674a4d8c2SCharles.Forsyth "R31", LREG, 31,
20774a4d8c2SCharles.Forsyth
20874a4d8c2SCharles.Forsyth "M", LM, 0,
20974a4d8c2SCharles.Forsyth "M0", LMREG, 0,
21074a4d8c2SCharles.Forsyth "M1", LMREG, 1,
21174a4d8c2SCharles.Forsyth "M2", LMREG, 2,
21274a4d8c2SCharles.Forsyth "M3", LMREG, 3,
21374a4d8c2SCharles.Forsyth "M4", LMREG, 4,
21474a4d8c2SCharles.Forsyth "M5", LMREG, 5,
21574a4d8c2SCharles.Forsyth "M6", LMREG, 6,
21674a4d8c2SCharles.Forsyth "M7", LMREG, 7,
21774a4d8c2SCharles.Forsyth "M8", LMREG, 8,
21874a4d8c2SCharles.Forsyth "M9", LMREG, 9,
21974a4d8c2SCharles.Forsyth "M10", LMREG, 10,
22074a4d8c2SCharles.Forsyth "M11", LMREG, 11,
22174a4d8c2SCharles.Forsyth "M12", LMREG, 12,
22274a4d8c2SCharles.Forsyth "M13", LMREG, 13,
22374a4d8c2SCharles.Forsyth "M14", LMREG, 14,
22474a4d8c2SCharles.Forsyth "M15", LMREG, 15,
22574a4d8c2SCharles.Forsyth "M16", LMREG, 16,
22674a4d8c2SCharles.Forsyth "M17", LMREG, 17,
22774a4d8c2SCharles.Forsyth "M18", LMREG, 18,
22874a4d8c2SCharles.Forsyth "M19", LMREG, 19,
22974a4d8c2SCharles.Forsyth "M20", LMREG, 20,
23074a4d8c2SCharles.Forsyth "M21", LMREG, 21,
23174a4d8c2SCharles.Forsyth "M22", LMREG, 22,
23274a4d8c2SCharles.Forsyth "M23", LMREG, 23,
23374a4d8c2SCharles.Forsyth "M24", LMREG, 24,
23474a4d8c2SCharles.Forsyth "M25", LMREG, 25,
23574a4d8c2SCharles.Forsyth "M26", LMREG, 26,
23674a4d8c2SCharles.Forsyth "M27", LMREG, 27,
23774a4d8c2SCharles.Forsyth "M28", LMREG, 28,
23874a4d8c2SCharles.Forsyth "M29", LMREG, 29,
23974a4d8c2SCharles.Forsyth "M30", LMREG, 30,
24074a4d8c2SCharles.Forsyth "M31", LMREG, 31,
24174a4d8c2SCharles.Forsyth
24274a4d8c2SCharles.Forsyth "F", LF, 0,
24374a4d8c2SCharles.Forsyth
24474a4d8c2SCharles.Forsyth "F0", LFREG, 0,
24574a4d8c2SCharles.Forsyth "F1", LFREG, 1,
24674a4d8c2SCharles.Forsyth "F2", LFREG, 2,
24774a4d8c2SCharles.Forsyth "F3", LFREG, 3,
24874a4d8c2SCharles.Forsyth "F4", LFREG, 4,
24974a4d8c2SCharles.Forsyth "F5", LFREG, 5,
25074a4d8c2SCharles.Forsyth "F6", LFREG, 6,
25174a4d8c2SCharles.Forsyth "F7", LFREG, 7,
25274a4d8c2SCharles.Forsyth "F8", LFREG, 8,
25374a4d8c2SCharles.Forsyth "F9", LFREG, 9,
25474a4d8c2SCharles.Forsyth "F10", LFREG, 10,
25574a4d8c2SCharles.Forsyth "F11", LFREG, 11,
25674a4d8c2SCharles.Forsyth "F12", LFREG, 12,
25774a4d8c2SCharles.Forsyth "F13", LFREG, 13,
25874a4d8c2SCharles.Forsyth "F14", LFREG, 14,
25974a4d8c2SCharles.Forsyth "F15", LFREG, 15,
26074a4d8c2SCharles.Forsyth "F16", LFREG, 16,
26174a4d8c2SCharles.Forsyth "F17", LFREG, 17,
26274a4d8c2SCharles.Forsyth "F18", LFREG, 18,
26374a4d8c2SCharles.Forsyth "F19", LFREG, 19,
26474a4d8c2SCharles.Forsyth "F20", LFREG, 20,
26574a4d8c2SCharles.Forsyth "F21", LFREG, 21,
26674a4d8c2SCharles.Forsyth "F22", LFREG, 22,
26774a4d8c2SCharles.Forsyth "F23", LFREG, 23,
26874a4d8c2SCharles.Forsyth "F24", LFREG, 24,
26974a4d8c2SCharles.Forsyth "F25", LFREG, 25,
27074a4d8c2SCharles.Forsyth "F26", LFREG, 26,
27174a4d8c2SCharles.Forsyth "F27", LFREG, 27,
27274a4d8c2SCharles.Forsyth "F28", LFREG, 28,
27374a4d8c2SCharles.Forsyth "F29", LFREG, 29,
27474a4d8c2SCharles.Forsyth "F30", LFREG, 30,
27574a4d8c2SCharles.Forsyth "F31", LFREG, 31,
27674a4d8c2SCharles.Forsyth
27774a4d8c2SCharles.Forsyth "FCR", LFCR, 0,
27874a4d8c2SCharles.Forsyth "FCR0", LFCREG, 0,
27974a4d8c2SCharles.Forsyth "FCR1", LFCREG, 1,
28074a4d8c2SCharles.Forsyth "FCR2", LFCREG, 2,
28174a4d8c2SCharles.Forsyth "FCR3", LFCREG, 3,
28274a4d8c2SCharles.Forsyth "FCR4", LFCREG, 4,
28374a4d8c2SCharles.Forsyth "FCR5", LFCREG, 5,
28474a4d8c2SCharles.Forsyth "FCR6", LFCREG, 6,
28574a4d8c2SCharles.Forsyth "FCR7", LFCREG, 7,
28674a4d8c2SCharles.Forsyth "FCR8", LFCREG, 8,
28774a4d8c2SCharles.Forsyth "FCR9", LFCREG, 9,
28874a4d8c2SCharles.Forsyth "FCR10", LFCREG, 10,
28974a4d8c2SCharles.Forsyth "FCR11", LFCREG, 11,
29074a4d8c2SCharles.Forsyth "FCR12", LFCREG, 12,
29174a4d8c2SCharles.Forsyth "FCR13", LFCREG, 13,
29274a4d8c2SCharles.Forsyth "FCR14", LFCREG, 14,
29374a4d8c2SCharles.Forsyth "FCR15", LFCREG, 15,
29474a4d8c2SCharles.Forsyth "FCR16", LFCREG, 16,
29574a4d8c2SCharles.Forsyth "FCR17", LFCREG, 17,
29674a4d8c2SCharles.Forsyth "FCR18", LFCREG, 18,
29774a4d8c2SCharles.Forsyth "FCR19", LFCREG, 19,
29874a4d8c2SCharles.Forsyth "FCR20", LFCREG, 20,
29974a4d8c2SCharles.Forsyth "FCR21", LFCREG, 21,
30074a4d8c2SCharles.Forsyth "FCR22", LFCREG, 22,
30174a4d8c2SCharles.Forsyth "FCR23", LFCREG, 23,
30274a4d8c2SCharles.Forsyth "FCR24", LFCREG, 24,
30374a4d8c2SCharles.Forsyth "FCR25", LFCREG, 25,
30474a4d8c2SCharles.Forsyth "FCR26", LFCREG, 26,
30574a4d8c2SCharles.Forsyth "FCR27", LFCREG, 27,
30674a4d8c2SCharles.Forsyth "FCR28", LFCREG, 28,
30774a4d8c2SCharles.Forsyth "FCR29", LFCREG, 29,
30874a4d8c2SCharles.Forsyth "FCR30", LFCREG, 30,
30974a4d8c2SCharles.Forsyth "FCR31", LFCREG, 31,
31074a4d8c2SCharles.Forsyth
31174a4d8c2SCharles.Forsyth "ADD", LTYPE1, AADD,
31274a4d8c2SCharles.Forsyth "ADDU", LTYPE1, AADDU,
31374a4d8c2SCharles.Forsyth "SUB", LTYPE1, ASUB, /* converted to ADD(-) in loader */
31474a4d8c2SCharles.Forsyth "SUBU", LTYPE1, ASUBU,
31574a4d8c2SCharles.Forsyth "SGT", LTYPE1, ASGT,
31674a4d8c2SCharles.Forsyth "SGTU", LTYPE1, ASGTU,
31774a4d8c2SCharles.Forsyth "AND", LTYPE1, AAND,
31874a4d8c2SCharles.Forsyth "OR", LTYPE1, AOR,
31974a4d8c2SCharles.Forsyth "XOR", LTYPE1, AXOR,
32074a4d8c2SCharles.Forsyth "SLL", LTYPE1, ASLL,
32174a4d8c2SCharles.Forsyth "SRL", LTYPE1, ASRL,
32274a4d8c2SCharles.Forsyth "SRA", LTYPE1, ASRA,
32374a4d8c2SCharles.Forsyth
32474a4d8c2SCharles.Forsyth "ADDV", LTYPE1, AADDV,
32574a4d8c2SCharles.Forsyth "ADDVU", LTYPE1, AADDVU,
32674a4d8c2SCharles.Forsyth "SUBV", LTYPE1, ASUBV, /* converted to ADD(-) in loader */
32774a4d8c2SCharles.Forsyth "SUBVU", LTYPE1, ASUBVU,
32874a4d8c2SCharles.Forsyth "SLLV", LTYPE1, ASLLV,
32974a4d8c2SCharles.Forsyth "SRLV", LTYPE1, ASRLV,
33074a4d8c2SCharles.Forsyth "SRAV", LTYPE1, ASRAV,
33174a4d8c2SCharles.Forsyth
33274a4d8c2SCharles.Forsyth "NOR", LTYPE2, ANOR,
33374a4d8c2SCharles.Forsyth
33474a4d8c2SCharles.Forsyth "MOVB", LTYPE3, AMOVB,
33574a4d8c2SCharles.Forsyth "MOVBU", LTYPE3, AMOVBU,
33674a4d8c2SCharles.Forsyth "MOVH", LTYPE3, AMOVH,
33774a4d8c2SCharles.Forsyth "MOVHU", LTYPE3, AMOVHU,
33874a4d8c2SCharles.Forsyth "MOVWL", LTYPE3, AMOVWL,
33974a4d8c2SCharles.Forsyth "MOVWR", LTYPE3, AMOVWR,
34074a4d8c2SCharles.Forsyth "MOVVL", LTYPE3, AMOVVL,
34174a4d8c2SCharles.Forsyth "MOVVR", LTYPE3, AMOVVR,
34274a4d8c2SCharles.Forsyth
34374a4d8c2SCharles.Forsyth "BREAK", LTYPEJ, ABREAK, /* overloaded CACHE opcode */
34474a4d8c2SCharles.Forsyth "END", LTYPE4, AEND,
34574a4d8c2SCharles.Forsyth "REM", LTYPE6, AREM,
34674a4d8c2SCharles.Forsyth "REMU", LTYPE6, AREMU,
34774a4d8c2SCharles.Forsyth "RET", LTYPE4, ARET,
34874a4d8c2SCharles.Forsyth "SYSCALL", LTYPE4, ASYSCALL,
34974a4d8c2SCharles.Forsyth "TLBP", LTYPE4, ATLBP,
35074a4d8c2SCharles.Forsyth "TLBR", LTYPE4, ATLBR,
35174a4d8c2SCharles.Forsyth "TLBWI", LTYPE4, ATLBWI,
35274a4d8c2SCharles.Forsyth "TLBWR", LTYPE4, ATLBWR,
35374a4d8c2SCharles.Forsyth
35474a4d8c2SCharles.Forsyth "MOVW", LTYPE5, AMOVW,
35574a4d8c2SCharles.Forsyth "MOVV", LTYPE5, AMOVV,
35674a4d8c2SCharles.Forsyth "MOVD", LTYPE5, AMOVD,
35774a4d8c2SCharles.Forsyth "MOVF", LTYPE5, AMOVF,
35874a4d8c2SCharles.Forsyth
35974a4d8c2SCharles.Forsyth "DIV", LTYPE6, ADIV,
36074a4d8c2SCharles.Forsyth "DIVU", LTYPE6, ADIVU,
36174a4d8c2SCharles.Forsyth "MUL", LTYPE6, AMUL,
36274a4d8c2SCharles.Forsyth "MULU", LTYPE6, AMULU,
36374a4d8c2SCharles.Forsyth "DIVV", LTYPE6, ADIVV,
36474a4d8c2SCharles.Forsyth "DIVVU", LTYPE6, ADIVVU,
36574a4d8c2SCharles.Forsyth "MULV", LTYPE6, AMULV,
36674a4d8c2SCharles.Forsyth "MULVU", LTYPE6, AMULVU,
36774a4d8c2SCharles.Forsyth
36874a4d8c2SCharles.Forsyth "RFE", LTYPE7, ARFE,
36974a4d8c2SCharles.Forsyth "JMP", LTYPE7, AJMP,
37074a4d8c2SCharles.Forsyth
37174a4d8c2SCharles.Forsyth "JAL", LTYPE8, AJAL,
37274a4d8c2SCharles.Forsyth
37374a4d8c2SCharles.Forsyth "BEQ", LTYPE9, ABEQ,
37474a4d8c2SCharles.Forsyth "BNE", LTYPE9, ABNE,
37574a4d8c2SCharles.Forsyth
37674a4d8c2SCharles.Forsyth "BGEZ", LTYPEA, ABGEZ,
37774a4d8c2SCharles.Forsyth "BGEZAL", LTYPEA, ABGEZAL,
37874a4d8c2SCharles.Forsyth "BGTZ", LTYPEA, ABGTZ,
37974a4d8c2SCharles.Forsyth "BLEZ", LTYPEA, ABLEZ,
38074a4d8c2SCharles.Forsyth "BLTZ", LTYPEA, ABLTZ,
38174a4d8c2SCharles.Forsyth "BLTZAL", LTYPEA, ABLTZAL,
38274a4d8c2SCharles.Forsyth
38374a4d8c2SCharles.Forsyth "TEXT", LTYPEB, ATEXT,
38474a4d8c2SCharles.Forsyth "GLOBL", LTYPEB, AGLOBL,
38574a4d8c2SCharles.Forsyth
38674a4d8c2SCharles.Forsyth "DATA", LTYPEC, ADATA,
38774a4d8c2SCharles.Forsyth
38874a4d8c2SCharles.Forsyth "MOVDF", LTYPE5, AMOVDF,
38974a4d8c2SCharles.Forsyth "MOVDW", LTYPE5, AMOVDW,
39074a4d8c2SCharles.Forsyth "MOVFD", LTYPE5, AMOVFD,
39174a4d8c2SCharles.Forsyth "MOVFW", LTYPE5, AMOVFW,
39274a4d8c2SCharles.Forsyth "MOVWD", LTYPE5, AMOVWD,
39374a4d8c2SCharles.Forsyth "MOVWF", LTYPE5, AMOVWF,
39474a4d8c2SCharles.Forsyth
39574a4d8c2SCharles.Forsyth "ABSD", LTYPED, AABSD,
39674a4d8c2SCharles.Forsyth "ABSF", LTYPED, AABSF,
39774a4d8c2SCharles.Forsyth "ABSW", LTYPED, AABSW,
39874a4d8c2SCharles.Forsyth "NEGD", LTYPED, ANEGD,
39974a4d8c2SCharles.Forsyth "NEGF", LTYPED, ANEGF,
40074a4d8c2SCharles.Forsyth "NEGW", LTYPED, ANEGW,
40174a4d8c2SCharles.Forsyth
40274a4d8c2SCharles.Forsyth "CMPEQD", LTYPEF, ACMPEQD,
40374a4d8c2SCharles.Forsyth "CMPEQF", LTYPEF, ACMPEQF,
40474a4d8c2SCharles.Forsyth "CMPGED", LTYPEF, ACMPGED,
40574a4d8c2SCharles.Forsyth "CMPGEF", LTYPEF, ACMPGEF,
40674a4d8c2SCharles.Forsyth "CMPGTD", LTYPEF, ACMPGTD,
40774a4d8c2SCharles.Forsyth "CMPGTF", LTYPEF, ACMPGTF,
40874a4d8c2SCharles.Forsyth
40974a4d8c2SCharles.Forsyth "ADDD", LTYPEE, AADDD,
41074a4d8c2SCharles.Forsyth "ADDF", LTYPEE, AADDF,
41174a4d8c2SCharles.Forsyth "ADDW", LTYPEE, AADDW,
41274a4d8c2SCharles.Forsyth "DIVD", LTYPEE, ADIVD,
41374a4d8c2SCharles.Forsyth "DIVF", LTYPEE, ADIVF,
41474a4d8c2SCharles.Forsyth "DIVW", LTYPEE, ADIVW,
41574a4d8c2SCharles.Forsyth "MULD", LTYPEE, AMULD,
41674a4d8c2SCharles.Forsyth "MULF", LTYPEE, AMULF,
41774a4d8c2SCharles.Forsyth "MULW", LTYPEE, AMULW,
41874a4d8c2SCharles.Forsyth "SUBD", LTYPEE, ASUBD,
41974a4d8c2SCharles.Forsyth "SUBF", LTYPEE, ASUBF,
42074a4d8c2SCharles.Forsyth "SUBW", LTYPEE, ASUBW,
42174a4d8c2SCharles.Forsyth
42274a4d8c2SCharles.Forsyth "BFPT", LTYPEG, ABFPT,
42374a4d8c2SCharles.Forsyth "BFPF", LTYPEG, ABFPF,
42474a4d8c2SCharles.Forsyth
42574a4d8c2SCharles.Forsyth "WORD", LTYPEH, AWORD,
42674a4d8c2SCharles.Forsyth "NOP", LTYPEI, ANOP,
42774a4d8c2SCharles.Forsyth "SCHED", LSCHED, 0,
42874a4d8c2SCharles.Forsyth "NOSCHED", LSCHED, 0x80,
42974a4d8c2SCharles.Forsyth 0
43074a4d8c2SCharles.Forsyth };
43174a4d8c2SCharles.Forsyth
43274a4d8c2SCharles.Forsyth void
cinit(void)43374a4d8c2SCharles.Forsyth cinit(void)
43474a4d8c2SCharles.Forsyth {
43574a4d8c2SCharles.Forsyth Sym *s;
43674a4d8c2SCharles.Forsyth int i;
43774a4d8c2SCharles.Forsyth
43874a4d8c2SCharles.Forsyth nullgen.sym = S;
43974a4d8c2SCharles.Forsyth nullgen.offset = 0;
44074a4d8c2SCharles.Forsyth nullgen.type = D_NONE;
44174a4d8c2SCharles.Forsyth nullgen.name = D_NONE;
44274a4d8c2SCharles.Forsyth nullgen.reg = NREG;
44374a4d8c2SCharles.Forsyth if(FPCHIP)
44474a4d8c2SCharles.Forsyth nullgen.dval = 0;
44574a4d8c2SCharles.Forsyth for(i=0; i<sizeof(nullgen.sval); i++)
44674a4d8c2SCharles.Forsyth nullgen.sval[i] = 0;
44774a4d8c2SCharles.Forsyth
44874a4d8c2SCharles.Forsyth nerrors = 0;
44974a4d8c2SCharles.Forsyth iostack = I;
45074a4d8c2SCharles.Forsyth iofree = I;
45174a4d8c2SCharles.Forsyth peekc = IGN;
45274a4d8c2SCharles.Forsyth nhunk = 0;
45374a4d8c2SCharles.Forsyth for(i=0; i<NHASH; i++)
45474a4d8c2SCharles.Forsyth hash[i] = S;
45574a4d8c2SCharles.Forsyth for(i=0; itab[i].name; i++) {
45674a4d8c2SCharles.Forsyth s = slookup(itab[i].name);
45774a4d8c2SCharles.Forsyth s->type = itab[i].type;
45874a4d8c2SCharles.Forsyth s->value = itab[i].value;
45974a4d8c2SCharles.Forsyth }
46074a4d8c2SCharles.Forsyth
46174a4d8c2SCharles.Forsyth pathname = allocn(pathname, 0, 100);
46274a4d8c2SCharles.Forsyth if(mygetwd(pathname, 99) == 0) {
46374a4d8c2SCharles.Forsyth pathname = allocn(pathname, 100, 900);
46474a4d8c2SCharles.Forsyth if(mygetwd(pathname, 999) == 0)
465*45a20ab7Sforsyth strcpy(pathname, "/?");
46674a4d8c2SCharles.Forsyth }
46774a4d8c2SCharles.Forsyth }
46874a4d8c2SCharles.Forsyth
46974a4d8c2SCharles.Forsyth void
syminit(Sym * s)47074a4d8c2SCharles.Forsyth syminit(Sym *s)
47174a4d8c2SCharles.Forsyth {
47274a4d8c2SCharles.Forsyth
47374a4d8c2SCharles.Forsyth s->type = LNAME;
47474a4d8c2SCharles.Forsyth s->value = 0;
47574a4d8c2SCharles.Forsyth }
47674a4d8c2SCharles.Forsyth
47774a4d8c2SCharles.Forsyth int
isreg(Gen * g)47874a4d8c2SCharles.Forsyth isreg(Gen *g)
47974a4d8c2SCharles.Forsyth {
48074a4d8c2SCharles.Forsyth
48174a4d8c2SCharles.Forsyth USED(g);
48274a4d8c2SCharles.Forsyth return 1;
48374a4d8c2SCharles.Forsyth }
48474a4d8c2SCharles.Forsyth
48574a4d8c2SCharles.Forsyth void
cclean(void)48674a4d8c2SCharles.Forsyth cclean(void)
48774a4d8c2SCharles.Forsyth {
48874a4d8c2SCharles.Forsyth
48974a4d8c2SCharles.Forsyth outcode(AEND, &nullgen, NREG, &nullgen);
49074a4d8c2SCharles.Forsyth Bflush(&obuf);
49174a4d8c2SCharles.Forsyth }
49274a4d8c2SCharles.Forsyth
49374a4d8c2SCharles.Forsyth void
zname(char * n,int t,int s)49474a4d8c2SCharles.Forsyth zname(char *n, int t, int s)
49574a4d8c2SCharles.Forsyth {
49674a4d8c2SCharles.Forsyth
49774a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
49874a4d8c2SCharles.Forsyth Bputc(&obuf, t); /* type */
49974a4d8c2SCharles.Forsyth Bputc(&obuf, s); /* sym */
50074a4d8c2SCharles.Forsyth while(*n) {
50174a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
50274a4d8c2SCharles.Forsyth n++;
50374a4d8c2SCharles.Forsyth }
50474a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
50574a4d8c2SCharles.Forsyth }
50674a4d8c2SCharles.Forsyth
50774a4d8c2SCharles.Forsyth void
zaddr(Gen * a,int s)50874a4d8c2SCharles.Forsyth zaddr(Gen *a, int s)
50974a4d8c2SCharles.Forsyth {
51074a4d8c2SCharles.Forsyth long l;
51174a4d8c2SCharles.Forsyth int i;
51274a4d8c2SCharles.Forsyth char *n;
51374a4d8c2SCharles.Forsyth Ieee e;
51474a4d8c2SCharles.Forsyth
51574a4d8c2SCharles.Forsyth Bputc(&obuf, a->type);
51674a4d8c2SCharles.Forsyth Bputc(&obuf, a->reg);
51774a4d8c2SCharles.Forsyth Bputc(&obuf, s);
51874a4d8c2SCharles.Forsyth Bputc(&obuf, a->name);
51974a4d8c2SCharles.Forsyth switch(a->type) {
52074a4d8c2SCharles.Forsyth default:
52174a4d8c2SCharles.Forsyth print("unknown type %d\n", a->type);
52274a4d8c2SCharles.Forsyth exits("arg");
52374a4d8c2SCharles.Forsyth
52474a4d8c2SCharles.Forsyth case D_NONE:
52574a4d8c2SCharles.Forsyth case D_REG:
52674a4d8c2SCharles.Forsyth case D_FREG:
52774a4d8c2SCharles.Forsyth case D_MREG:
52874a4d8c2SCharles.Forsyth case D_FCREG:
52974a4d8c2SCharles.Forsyth case D_LO:
53074a4d8c2SCharles.Forsyth case D_HI:
53174a4d8c2SCharles.Forsyth break;
53274a4d8c2SCharles.Forsyth
53374a4d8c2SCharles.Forsyth case D_OREG:
53474a4d8c2SCharles.Forsyth case D_CONST:
53574a4d8c2SCharles.Forsyth case D_OCONST:
53674a4d8c2SCharles.Forsyth case D_BRANCH:
53774a4d8c2SCharles.Forsyth l = a->offset;
53874a4d8c2SCharles.Forsyth Bputc(&obuf, l);
53974a4d8c2SCharles.Forsyth Bputc(&obuf, l>>8);
54074a4d8c2SCharles.Forsyth Bputc(&obuf, l>>16);
54174a4d8c2SCharles.Forsyth Bputc(&obuf, l>>24);
54274a4d8c2SCharles.Forsyth break;
54374a4d8c2SCharles.Forsyth
54474a4d8c2SCharles.Forsyth case D_SCONST:
54574a4d8c2SCharles.Forsyth n = a->sval;
54674a4d8c2SCharles.Forsyth for(i=0; i<NSNAME; i++) {
54774a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
54874a4d8c2SCharles.Forsyth n++;
54974a4d8c2SCharles.Forsyth }
55074a4d8c2SCharles.Forsyth break;
55174a4d8c2SCharles.Forsyth
55274a4d8c2SCharles.Forsyth case D_FCONST:
55374a4d8c2SCharles.Forsyth ieeedtod(&e, a->dval);
55474a4d8c2SCharles.Forsyth Bputc(&obuf, e.l);
55574a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>8);
55674a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>16);
55774a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>24);
55874a4d8c2SCharles.Forsyth Bputc(&obuf, e.h);
55974a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>8);
56074a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>16);
56174a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>24);
56274a4d8c2SCharles.Forsyth break;
56374a4d8c2SCharles.Forsyth }
56474a4d8c2SCharles.Forsyth }
56574a4d8c2SCharles.Forsyth
56674a4d8c2SCharles.Forsyth void
outcode(int a,Gen * g1,int reg,Gen * g2)56774a4d8c2SCharles.Forsyth outcode(int a, Gen *g1, int reg, Gen *g2)
56874a4d8c2SCharles.Forsyth {
56974a4d8c2SCharles.Forsyth int sf, st, t;
57074a4d8c2SCharles.Forsyth Sym *s;
57174a4d8c2SCharles.Forsyth
57274a4d8c2SCharles.Forsyth if(pass == 1)
57374a4d8c2SCharles.Forsyth goto out;
57474a4d8c2SCharles.Forsyth jackpot:
57574a4d8c2SCharles.Forsyth sf = 0;
57674a4d8c2SCharles.Forsyth s = g1->sym;
57774a4d8c2SCharles.Forsyth while(s != S) {
57874a4d8c2SCharles.Forsyth sf = s->sym;
57974a4d8c2SCharles.Forsyth if(sf < 0 || sf >= NSYM)
58074a4d8c2SCharles.Forsyth sf = 0;
58174a4d8c2SCharles.Forsyth t = g1->name;
58274a4d8c2SCharles.Forsyth if(h[sf].type == t)
58374a4d8c2SCharles.Forsyth if(h[sf].sym == s)
58474a4d8c2SCharles.Forsyth break;
58574a4d8c2SCharles.Forsyth zname(s->name, t, sym);
58674a4d8c2SCharles.Forsyth s->sym = sym;
58774a4d8c2SCharles.Forsyth h[sym].sym = s;
58874a4d8c2SCharles.Forsyth h[sym].type = t;
58974a4d8c2SCharles.Forsyth sf = sym;
59074a4d8c2SCharles.Forsyth sym++;
59174a4d8c2SCharles.Forsyth if(sym >= NSYM)
59274a4d8c2SCharles.Forsyth sym = 1;
59374a4d8c2SCharles.Forsyth break;
59474a4d8c2SCharles.Forsyth }
59574a4d8c2SCharles.Forsyth st = 0;
59674a4d8c2SCharles.Forsyth s = g2->sym;
59774a4d8c2SCharles.Forsyth while(s != S) {
59874a4d8c2SCharles.Forsyth st = s->sym;
59974a4d8c2SCharles.Forsyth if(st < 0 || st >= NSYM)
60074a4d8c2SCharles.Forsyth st = 0;
60174a4d8c2SCharles.Forsyth t = g2->name;
60274a4d8c2SCharles.Forsyth if(h[st].type == t)
60374a4d8c2SCharles.Forsyth if(h[st].sym == s)
60474a4d8c2SCharles.Forsyth break;
60574a4d8c2SCharles.Forsyth zname(s->name, t, sym);
60674a4d8c2SCharles.Forsyth s->sym = sym;
60774a4d8c2SCharles.Forsyth h[sym].sym = s;
60874a4d8c2SCharles.Forsyth h[sym].type = t;
60974a4d8c2SCharles.Forsyth st = sym;
61074a4d8c2SCharles.Forsyth sym++;
61174a4d8c2SCharles.Forsyth if(sym >= NSYM)
61274a4d8c2SCharles.Forsyth sym = 1;
61374a4d8c2SCharles.Forsyth if(st == sf)
61474a4d8c2SCharles.Forsyth goto jackpot;
61574a4d8c2SCharles.Forsyth break;
61674a4d8c2SCharles.Forsyth }
61774a4d8c2SCharles.Forsyth Bputc(&obuf, a);
61874a4d8c2SCharles.Forsyth Bputc(&obuf, reg|nosched);
61974a4d8c2SCharles.Forsyth Bputc(&obuf, lineno);
62074a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>8);
62174a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>16);
62274a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>24);
62374a4d8c2SCharles.Forsyth zaddr(g1, sf);
62474a4d8c2SCharles.Forsyth zaddr(g2, st);
62574a4d8c2SCharles.Forsyth
62674a4d8c2SCharles.Forsyth out:
62774a4d8c2SCharles.Forsyth if(a != AGLOBL && a != ADATA)
62874a4d8c2SCharles.Forsyth pc++;
62974a4d8c2SCharles.Forsyth }
63074a4d8c2SCharles.Forsyth
63174a4d8c2SCharles.Forsyth void
outhist(void)63274a4d8c2SCharles.Forsyth outhist(void)
63374a4d8c2SCharles.Forsyth {
63474a4d8c2SCharles.Forsyth Gen g;
63574a4d8c2SCharles.Forsyth Hist *h;
63674a4d8c2SCharles.Forsyth char *p, *q, *op, c;
63774a4d8c2SCharles.Forsyth int n;
63874a4d8c2SCharles.Forsyth
63974a4d8c2SCharles.Forsyth g = nullgen;
64074a4d8c2SCharles.Forsyth c = pathchar();
64174a4d8c2SCharles.Forsyth for(h = hist; h != H; h = h->link) {
64274a4d8c2SCharles.Forsyth p = h->name;
64374a4d8c2SCharles.Forsyth op = 0;
64474a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
64574a4d8c2SCharles.Forsyth if(systemtype(Windows) && p && p[1] == ':'){
64674a4d8c2SCharles.Forsyth p += 2;
64774a4d8c2SCharles.Forsyth c = *p;
64874a4d8c2SCharles.Forsyth }
64974a4d8c2SCharles.Forsyth if(p && p[0] != c && h->offset == 0 && pathname){
65074a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
65174a4d8c2SCharles.Forsyth if(systemtype(Windows) && pathname[1] == ':') {
65274a4d8c2SCharles.Forsyth op = p;
65374a4d8c2SCharles.Forsyth p = pathname+2;
65474a4d8c2SCharles.Forsyth c = *p;
65574a4d8c2SCharles.Forsyth } else if(pathname[0] == c){
65674a4d8c2SCharles.Forsyth op = p;
65774a4d8c2SCharles.Forsyth p = pathname;
65874a4d8c2SCharles.Forsyth }
65974a4d8c2SCharles.Forsyth }
66074a4d8c2SCharles.Forsyth while(p) {
66174a4d8c2SCharles.Forsyth q = strchr(p, c);
66274a4d8c2SCharles.Forsyth if(q) {
66374a4d8c2SCharles.Forsyth n = q-p;
66474a4d8c2SCharles.Forsyth if(n == 0){
66574a4d8c2SCharles.Forsyth n = 1; /* leading "/" */
66674a4d8c2SCharles.Forsyth *p = '/'; /* don't emit "\" on windows */
66774a4d8c2SCharles.Forsyth }
66874a4d8c2SCharles.Forsyth q++;
66974a4d8c2SCharles.Forsyth } else {
67074a4d8c2SCharles.Forsyth n = strlen(p);
67174a4d8c2SCharles.Forsyth q = 0;
67274a4d8c2SCharles.Forsyth }
67374a4d8c2SCharles.Forsyth if(n) {
67474a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
67574a4d8c2SCharles.Forsyth Bputc(&obuf, D_FILE); /* type */
67674a4d8c2SCharles.Forsyth Bputc(&obuf, 1); /* sym */
67774a4d8c2SCharles.Forsyth Bputc(&obuf, '<');
67874a4d8c2SCharles.Forsyth Bwrite(&obuf, p, n);
67974a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
68074a4d8c2SCharles.Forsyth }
68174a4d8c2SCharles.Forsyth p = q;
68274a4d8c2SCharles.Forsyth if(p == 0 && op) {
68374a4d8c2SCharles.Forsyth p = op;
68474a4d8c2SCharles.Forsyth op = 0;
68574a4d8c2SCharles.Forsyth }
68674a4d8c2SCharles.Forsyth }
68774a4d8c2SCharles.Forsyth g.offset = h->offset;
68874a4d8c2SCharles.Forsyth
68974a4d8c2SCharles.Forsyth Bputc(&obuf, AHISTORY);
69074a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
69174a4d8c2SCharles.Forsyth Bputc(&obuf, h->line);
69274a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>8);
69374a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>16);
69474a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>24);
69574a4d8c2SCharles.Forsyth zaddr(&nullgen, 0);
69674a4d8c2SCharles.Forsyth zaddr(&g, 0);
69774a4d8c2SCharles.Forsyth }
69874a4d8c2SCharles.Forsyth }
69974a4d8c2SCharles.Forsyth
70074a4d8c2SCharles.Forsyth #include "../cc/lexbody"
70174a4d8c2SCharles.Forsyth #include "../cc/macbody"
702