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 = '5';
1374a4d8c2SCharles.Forsyth thestring = "arm";
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;
3974a4d8c2SCharles.Forsyth case 't':
4074a4d8c2SCharles.Forsyth thechar = 't';
4174a4d8c2SCharles.Forsyth thestring = "thumb";
4274a4d8c2SCharles.Forsyth 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
17274a4d8c2SCharles.Forsyth "R", LR, 0,
17374a4d8c2SCharles.Forsyth "R0", LREG, 0,
17474a4d8c2SCharles.Forsyth "R1", LREG, 1,
17574a4d8c2SCharles.Forsyth "R2", LREG, 2,
17674a4d8c2SCharles.Forsyth "R3", LREG, 3,
17774a4d8c2SCharles.Forsyth "R4", LREG, 4,
17874a4d8c2SCharles.Forsyth "R5", LREG, 5,
17974a4d8c2SCharles.Forsyth "R6", LREG, 6,
18074a4d8c2SCharles.Forsyth "R7", LREG, 7,
18174a4d8c2SCharles.Forsyth "R8", LREG, 8,
18274a4d8c2SCharles.Forsyth "R9", LREG, 9,
18374a4d8c2SCharles.Forsyth "R10", LREG, 10,
18474a4d8c2SCharles.Forsyth "R11", LREG, 11,
18574a4d8c2SCharles.Forsyth "R12", LREG, 12,
18674a4d8c2SCharles.Forsyth "R13", LREG, 13,
18774a4d8c2SCharles.Forsyth "R14", LREG, 14,
18874a4d8c2SCharles.Forsyth "R15", LREG, 15,
18974a4d8c2SCharles.Forsyth
19074a4d8c2SCharles.Forsyth "F", LF, 0,
19174a4d8c2SCharles.Forsyth
19274a4d8c2SCharles.Forsyth "F0", LFREG, 0,
19374a4d8c2SCharles.Forsyth "F1", LFREG, 1,
19474a4d8c2SCharles.Forsyth "F2", LFREG, 2,
19574a4d8c2SCharles.Forsyth "F3", LFREG, 3,
19674a4d8c2SCharles.Forsyth "F4", LFREG, 4,
19774a4d8c2SCharles.Forsyth "F5", LFREG, 5,
19874a4d8c2SCharles.Forsyth "F6", LFREG, 6,
19974a4d8c2SCharles.Forsyth "F7", LFREG, 7,
20074a4d8c2SCharles.Forsyth "F8", LFREG, 8,
20174a4d8c2SCharles.Forsyth "F9", LFREG, 9,
20274a4d8c2SCharles.Forsyth "F10", LFREG, 10,
20374a4d8c2SCharles.Forsyth "F11", LFREG, 11,
20474a4d8c2SCharles.Forsyth "F12", LFREG, 12,
20574a4d8c2SCharles.Forsyth "F13", LFREG, 13,
20674a4d8c2SCharles.Forsyth "F14", LFREG, 14,
20774a4d8c2SCharles.Forsyth "F15", LFREG, 15,
20874a4d8c2SCharles.Forsyth
20974a4d8c2SCharles.Forsyth "C", LC, 0,
21074a4d8c2SCharles.Forsyth
21174a4d8c2SCharles.Forsyth "C0", LCREG, 0,
21274a4d8c2SCharles.Forsyth "C1", LCREG, 1,
21374a4d8c2SCharles.Forsyth "C2", LCREG, 2,
21474a4d8c2SCharles.Forsyth "C3", LCREG, 3,
21574a4d8c2SCharles.Forsyth "C4", LCREG, 4,
21674a4d8c2SCharles.Forsyth "C5", LCREG, 5,
21774a4d8c2SCharles.Forsyth "C6", LCREG, 6,
21874a4d8c2SCharles.Forsyth "C7", LCREG, 7,
21974a4d8c2SCharles.Forsyth "C8", LCREG, 8,
22074a4d8c2SCharles.Forsyth "C9", LCREG, 9,
22174a4d8c2SCharles.Forsyth "C10", LCREG, 10,
22274a4d8c2SCharles.Forsyth "C11", LCREG, 11,
22374a4d8c2SCharles.Forsyth "C12", LCREG, 12,
22474a4d8c2SCharles.Forsyth "C13", LCREG, 13,
22574a4d8c2SCharles.Forsyth "C14", LCREG, 14,
22674a4d8c2SCharles.Forsyth "C15", LCREG, 15,
22774a4d8c2SCharles.Forsyth
22874a4d8c2SCharles.Forsyth "CPSR", LPSR, 0,
22974a4d8c2SCharles.Forsyth "SPSR", LPSR, 1,
23074a4d8c2SCharles.Forsyth
23174a4d8c2SCharles.Forsyth "FPSR", LFCR, 0,
23274a4d8c2SCharles.Forsyth "FPCR", LFCR, 1,
23374a4d8c2SCharles.Forsyth
23474a4d8c2SCharles.Forsyth ".EQ", LCOND, 0,
23574a4d8c2SCharles.Forsyth ".NE", LCOND, 1,
23674a4d8c2SCharles.Forsyth ".CS", LCOND, 2,
23774a4d8c2SCharles.Forsyth ".HS", LCOND, 2,
23874a4d8c2SCharles.Forsyth ".CC", LCOND, 3,
23974a4d8c2SCharles.Forsyth ".LO", LCOND, 3,
24074a4d8c2SCharles.Forsyth ".MI", LCOND, 4,
24174a4d8c2SCharles.Forsyth ".PL", LCOND, 5,
24274a4d8c2SCharles.Forsyth ".VS", LCOND, 6,
24374a4d8c2SCharles.Forsyth ".VC", LCOND, 7,
24474a4d8c2SCharles.Forsyth ".HI", LCOND, 8,
24574a4d8c2SCharles.Forsyth ".LS", LCOND, 9,
24674a4d8c2SCharles.Forsyth ".GE", LCOND, 10,
24774a4d8c2SCharles.Forsyth ".LT", LCOND, 11,
24874a4d8c2SCharles.Forsyth ".GT", LCOND, 12,
24974a4d8c2SCharles.Forsyth ".LE", LCOND, 13,
25074a4d8c2SCharles.Forsyth ".AL", LCOND, Always,
25174a4d8c2SCharles.Forsyth
25274a4d8c2SCharles.Forsyth ".U", LS, C_UBIT,
25374a4d8c2SCharles.Forsyth ".S", LS, C_SBIT,
25474a4d8c2SCharles.Forsyth ".W", LS, C_WBIT,
25574a4d8c2SCharles.Forsyth ".P", LS, C_PBIT,
25674a4d8c2SCharles.Forsyth ".PW", LS, C_WBIT|C_PBIT,
25774a4d8c2SCharles.Forsyth ".WP", LS, C_WBIT|C_PBIT,
25874a4d8c2SCharles.Forsyth
25974a4d8c2SCharles.Forsyth ".F", LS, C_FBIT,
26074a4d8c2SCharles.Forsyth
26174a4d8c2SCharles.Forsyth ".IBW", LS, C_WBIT|C_PBIT|C_UBIT,
26274a4d8c2SCharles.Forsyth ".IAW", LS, C_WBIT|C_UBIT,
26374a4d8c2SCharles.Forsyth ".DBW", LS, C_WBIT|C_PBIT,
26474a4d8c2SCharles.Forsyth ".DAW", LS, C_WBIT,
26574a4d8c2SCharles.Forsyth ".IB", LS, C_PBIT|C_UBIT,
26674a4d8c2SCharles.Forsyth ".IA", LS, C_UBIT,
26774a4d8c2SCharles.Forsyth ".DB", LS, C_PBIT,
26874a4d8c2SCharles.Forsyth ".DA", LS, 0,
26974a4d8c2SCharles.Forsyth
27074a4d8c2SCharles.Forsyth "@", LAT, 0,
27174a4d8c2SCharles.Forsyth
27274a4d8c2SCharles.Forsyth "AND", LTYPE1, AAND,
27374a4d8c2SCharles.Forsyth "EOR", LTYPE1, AEOR,
27474a4d8c2SCharles.Forsyth "SUB", LTYPE1, ASUB,
27574a4d8c2SCharles.Forsyth "RSB", LTYPE1, ARSB,
27674a4d8c2SCharles.Forsyth "ADD", LTYPE1, AADD,
27774a4d8c2SCharles.Forsyth "ADC", LTYPE1, AADC,
27874a4d8c2SCharles.Forsyth "SBC", LTYPE1, ASBC,
27974a4d8c2SCharles.Forsyth "RSC", LTYPE1, ARSC,
28074a4d8c2SCharles.Forsyth "ORR", LTYPE1, AORR,
28174a4d8c2SCharles.Forsyth "BIC", LTYPE1, ABIC,
28274a4d8c2SCharles.Forsyth
28374a4d8c2SCharles.Forsyth "SLL", LTYPE1, ASLL,
28474a4d8c2SCharles.Forsyth "SRL", LTYPE1, ASRL,
28574a4d8c2SCharles.Forsyth "SRA", LTYPE1, ASRA,
28674a4d8c2SCharles.Forsyth
28774a4d8c2SCharles.Forsyth "MUL", LTYPE1, AMUL,
28874a4d8c2SCharles.Forsyth "MULA", LTYPEN, AMULA,
28974a4d8c2SCharles.Forsyth "DIV", LTYPE1, ADIV,
29074a4d8c2SCharles.Forsyth "MOD", LTYPE1, AMOD,
29174a4d8c2SCharles.Forsyth
29274a4d8c2SCharles.Forsyth "MULL", LTYPEM, AMULL,
29374a4d8c2SCharles.Forsyth "MULAL", LTYPEM, AMULAL,
29474a4d8c2SCharles.Forsyth "MULLU", LTYPEM, AMULLU,
29574a4d8c2SCharles.Forsyth "MULALU", LTYPEM, AMULALU,
29674a4d8c2SCharles.Forsyth
29774a4d8c2SCharles.Forsyth "MVN", LTYPE2, AMVN, /* op2 ignored */
29874a4d8c2SCharles.Forsyth
29974a4d8c2SCharles.Forsyth "MOVB", LTYPE3, AMOVB,
30074a4d8c2SCharles.Forsyth "MOVBU", LTYPE3, AMOVBU,
30174a4d8c2SCharles.Forsyth "MOVH", LTYPE3, AMOVH,
30274a4d8c2SCharles.Forsyth "MOVHU", LTYPE3, AMOVHU,
30374a4d8c2SCharles.Forsyth "MOVW", LTYPE3, AMOVW,
30474a4d8c2SCharles.Forsyth
30574a4d8c2SCharles.Forsyth "MOVD", LTYPE3, AMOVD,
30674a4d8c2SCharles.Forsyth "MOVDF", LTYPE3, AMOVDF,
30774a4d8c2SCharles.Forsyth "MOVDW", LTYPE3, AMOVDW,
30874a4d8c2SCharles.Forsyth "MOVF", LTYPE3, AMOVF,
30974a4d8c2SCharles.Forsyth "MOVFD", LTYPE3, AMOVFD,
31074a4d8c2SCharles.Forsyth "MOVFW", LTYPE3, AMOVFW,
31174a4d8c2SCharles.Forsyth "MOVWD", LTYPE3, AMOVWD,
31274a4d8c2SCharles.Forsyth "MOVWF", LTYPE3, AMOVWF,
31374a4d8c2SCharles.Forsyth
314*45a20ab7Sforsyth "LDREX", LTYPE3, ALDREX,
315*45a20ab7Sforsyth "LDREXD", LTYPE3, ALDREXD,
316*45a20ab7Sforsyth "STREX", LTYPE9, ASTREX,
317*45a20ab7Sforsyth "STREXD", LTYPE9, ASTREXD,
318*45a20ab7Sforsyth
31974a4d8c2SCharles.Forsyth /*
32074a4d8c2SCharles.Forsyth "ABSF", LTYPEI, AABSF,
32174a4d8c2SCharles.Forsyth "ABSD", LTYPEI, AABSD,
32274a4d8c2SCharles.Forsyth "NEGF", LTYPEI, ANEGF,
32374a4d8c2SCharles.Forsyth "NEGD", LTYPEI, ANEGD,
32474a4d8c2SCharles.Forsyth "SQTF", LTYPEI, ASQTF,
32574a4d8c2SCharles.Forsyth "SQTD", LTYPEI, ASQTD,
32674a4d8c2SCharles.Forsyth "RNDF", LTYPEI, ARNDF,
32774a4d8c2SCharles.Forsyth "RNDD", LTYPEI, ARNDD,
32874a4d8c2SCharles.Forsyth "URDF", LTYPEI, AURDF,
32974a4d8c2SCharles.Forsyth "URDD", LTYPEI, AURDD,
33074a4d8c2SCharles.Forsyth "NRMF", LTYPEI, ANRMF,
33174a4d8c2SCharles.Forsyth "NRMD", LTYPEI, ANRMD,
33274a4d8c2SCharles.Forsyth */
33374a4d8c2SCharles.Forsyth
334*45a20ab7Sforsyth "SQRTF", LTYPEI, ASQRTF,
335*45a20ab7Sforsyth "SQRTD", LTYPEI, ASQRTD,
33674a4d8c2SCharles.Forsyth "CMPF", LTYPEL, ACMPF,
33774a4d8c2SCharles.Forsyth "CMPD", LTYPEL, ACMPD,
33874a4d8c2SCharles.Forsyth "ADDF", LTYPEK, AADDF,
33974a4d8c2SCharles.Forsyth "ADDD", LTYPEK, AADDD,
34074a4d8c2SCharles.Forsyth "SUBF", LTYPEK, ASUBF,
34174a4d8c2SCharles.Forsyth "SUBD", LTYPEK, ASUBD,
34274a4d8c2SCharles.Forsyth "MULF", LTYPEK, AMULF,
34374a4d8c2SCharles.Forsyth "MULD", LTYPEK, AMULD,
34474a4d8c2SCharles.Forsyth "DIVF", LTYPEK, ADIVF,
34574a4d8c2SCharles.Forsyth "DIVD", LTYPEK, ADIVD,
34674a4d8c2SCharles.Forsyth
34774a4d8c2SCharles.Forsyth "B", LTYPE4, AB,
34874a4d8c2SCharles.Forsyth "BL", LTYPE4, ABL,
34974a4d8c2SCharles.Forsyth "BX", LTYPEBX, ABX,
35074a4d8c2SCharles.Forsyth
35174a4d8c2SCharles.Forsyth "BEQ", LTYPE5, ABEQ,
35274a4d8c2SCharles.Forsyth "BNE", LTYPE5, ABNE,
35374a4d8c2SCharles.Forsyth "BCS", LTYPE5, ABCS,
35474a4d8c2SCharles.Forsyth "BHS", LTYPE5, ABHS,
35574a4d8c2SCharles.Forsyth "BCC", LTYPE5, ABCC,
35674a4d8c2SCharles.Forsyth "BLO", LTYPE5, ABLO,
35774a4d8c2SCharles.Forsyth "BMI", LTYPE5, ABMI,
35874a4d8c2SCharles.Forsyth "BPL", LTYPE5, ABPL,
35974a4d8c2SCharles.Forsyth "BVS", LTYPE5, ABVS,
36074a4d8c2SCharles.Forsyth "BVC", LTYPE5, ABVC,
36174a4d8c2SCharles.Forsyth "BHI", LTYPE5, ABHI,
36274a4d8c2SCharles.Forsyth "BLS", LTYPE5, ABLS,
36374a4d8c2SCharles.Forsyth "BGE", LTYPE5, ABGE,
36474a4d8c2SCharles.Forsyth "BLT", LTYPE5, ABLT,
36574a4d8c2SCharles.Forsyth "BGT", LTYPE5, ABGT,
36674a4d8c2SCharles.Forsyth "BLE", LTYPE5, ABLE,
36774a4d8c2SCharles.Forsyth "BCASE", LTYPE5, ABCASE,
36874a4d8c2SCharles.Forsyth
36974a4d8c2SCharles.Forsyth "SWI", LTYPE6, ASWI,
37074a4d8c2SCharles.Forsyth
37174a4d8c2SCharles.Forsyth "CMP", LTYPE7, ACMP,
37274a4d8c2SCharles.Forsyth "TST", LTYPE7, ATST,
37374a4d8c2SCharles.Forsyth "TEQ", LTYPE7, ATEQ,
37474a4d8c2SCharles.Forsyth "CMN", LTYPE7, ACMN,
37574a4d8c2SCharles.Forsyth
37674a4d8c2SCharles.Forsyth "MOVM", LTYPE8, AMOVM,
37774a4d8c2SCharles.Forsyth
37874a4d8c2SCharles.Forsyth "SWPBU", LTYPE9, ASWPBU,
37974a4d8c2SCharles.Forsyth "SWPW", LTYPE9, ASWPW,
38074a4d8c2SCharles.Forsyth
38174a4d8c2SCharles.Forsyth "RET", LTYPEA, ARET,
38274a4d8c2SCharles.Forsyth "RFE", LTYPEA, ARFE,
38374a4d8c2SCharles.Forsyth
38474a4d8c2SCharles.Forsyth "TEXT", LTYPEB, ATEXT,
38574a4d8c2SCharles.Forsyth "GLOBL", LTYPEB, AGLOBL,
38674a4d8c2SCharles.Forsyth "DATA", LTYPEC, ADATA,
38774a4d8c2SCharles.Forsyth "CASE", LTYPED, ACASE,
38874a4d8c2SCharles.Forsyth "END", LTYPEE, AEND,
38974a4d8c2SCharles.Forsyth "WORD", LTYPEH, AWORD,
39074a4d8c2SCharles.Forsyth "NOP", LTYPEI, ANOP,
39174a4d8c2SCharles.Forsyth
39274a4d8c2SCharles.Forsyth "MCR", LTYPEJ, 0,
39374a4d8c2SCharles.Forsyth "MRC", LTYPEJ, 1,
39474a4d8c2SCharles.Forsyth 0
39574a4d8c2SCharles.Forsyth };
39674a4d8c2SCharles.Forsyth
39774a4d8c2SCharles.Forsyth void
cinit(void)39874a4d8c2SCharles.Forsyth cinit(void)
39974a4d8c2SCharles.Forsyth {
40074a4d8c2SCharles.Forsyth Sym *s;
40174a4d8c2SCharles.Forsyth int i;
40274a4d8c2SCharles.Forsyth
40374a4d8c2SCharles.Forsyth nullgen.sym = S;
40474a4d8c2SCharles.Forsyth nullgen.offset = 0;
40574a4d8c2SCharles.Forsyth nullgen.type = D_NONE;
40674a4d8c2SCharles.Forsyth nullgen.name = D_NONE;
40774a4d8c2SCharles.Forsyth nullgen.reg = NREG;
40874a4d8c2SCharles.Forsyth if(FPCHIP)
40974a4d8c2SCharles.Forsyth nullgen.dval = 0;
41074a4d8c2SCharles.Forsyth for(i=0; i<sizeof(nullgen.sval); i++)
41174a4d8c2SCharles.Forsyth nullgen.sval[i] = 0;
41274a4d8c2SCharles.Forsyth
41374a4d8c2SCharles.Forsyth nerrors = 0;
41474a4d8c2SCharles.Forsyth iostack = I;
41574a4d8c2SCharles.Forsyth iofree = I;
41674a4d8c2SCharles.Forsyth peekc = IGN;
41774a4d8c2SCharles.Forsyth nhunk = 0;
41874a4d8c2SCharles.Forsyth for(i=0; i<NHASH; i++)
41974a4d8c2SCharles.Forsyth hash[i] = S;
42074a4d8c2SCharles.Forsyth for(i=0; itab[i].name; i++) {
42174a4d8c2SCharles.Forsyth s = slookup(itab[i].name);
42274a4d8c2SCharles.Forsyth s->type = itab[i].type;
42374a4d8c2SCharles.Forsyth s->value = itab[i].value;
42474a4d8c2SCharles.Forsyth }
42574a4d8c2SCharles.Forsyth
42674a4d8c2SCharles.Forsyth pathname = allocn(pathname, 0, 100);
427*45a20ab7Sforsyth if(getwd(pathname, 99) == 0) {
42874a4d8c2SCharles.Forsyth pathname = allocn(pathname, 100, 900);
429*45a20ab7Sforsyth if(getwd(pathname, 999) == 0)
430*45a20ab7Sforsyth strcpy(pathname, "/?");
43174a4d8c2SCharles.Forsyth }
43274a4d8c2SCharles.Forsyth }
43374a4d8c2SCharles.Forsyth
43474a4d8c2SCharles.Forsyth void
syminit(Sym * s)43574a4d8c2SCharles.Forsyth syminit(Sym *s)
43674a4d8c2SCharles.Forsyth {
43774a4d8c2SCharles.Forsyth
43874a4d8c2SCharles.Forsyth s->type = LNAME;
43974a4d8c2SCharles.Forsyth s->value = 0;
44074a4d8c2SCharles.Forsyth }
44174a4d8c2SCharles.Forsyth
44274a4d8c2SCharles.Forsyth int
isreg(Gen * g)44374a4d8c2SCharles.Forsyth isreg(Gen *g)
44474a4d8c2SCharles.Forsyth {
44574a4d8c2SCharles.Forsyth
44674a4d8c2SCharles.Forsyth USED(g);
44774a4d8c2SCharles.Forsyth return 1;
44874a4d8c2SCharles.Forsyth }
44974a4d8c2SCharles.Forsyth
45074a4d8c2SCharles.Forsyth void
cclean(void)45174a4d8c2SCharles.Forsyth cclean(void)
45274a4d8c2SCharles.Forsyth {
45374a4d8c2SCharles.Forsyth
45474a4d8c2SCharles.Forsyth outcode(AEND, Always, &nullgen, NREG, &nullgen);
45574a4d8c2SCharles.Forsyth Bflush(&obuf);
45674a4d8c2SCharles.Forsyth }
45774a4d8c2SCharles.Forsyth
45874a4d8c2SCharles.Forsyth void
zname(char * n,int t,int s)45974a4d8c2SCharles.Forsyth zname(char *n, int t, int s)
46074a4d8c2SCharles.Forsyth {
46174a4d8c2SCharles.Forsyth
46274a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
46374a4d8c2SCharles.Forsyth Bputc(&obuf, t); /* type */
46474a4d8c2SCharles.Forsyth Bputc(&obuf, s); /* sym */
46574a4d8c2SCharles.Forsyth while(*n) {
46674a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
46774a4d8c2SCharles.Forsyth n++;
46874a4d8c2SCharles.Forsyth }
46974a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
47074a4d8c2SCharles.Forsyth }
47174a4d8c2SCharles.Forsyth
47274a4d8c2SCharles.Forsyth void
zaddr(Gen * a,int s)47374a4d8c2SCharles.Forsyth zaddr(Gen *a, int s)
47474a4d8c2SCharles.Forsyth {
47574a4d8c2SCharles.Forsyth long l;
47674a4d8c2SCharles.Forsyth int i;
47774a4d8c2SCharles.Forsyth char *n;
47874a4d8c2SCharles.Forsyth Ieee e;
47974a4d8c2SCharles.Forsyth
48074a4d8c2SCharles.Forsyth Bputc(&obuf, a->type);
48174a4d8c2SCharles.Forsyth Bputc(&obuf, a->reg);
48274a4d8c2SCharles.Forsyth Bputc(&obuf, s);
48374a4d8c2SCharles.Forsyth Bputc(&obuf, a->name);
48474a4d8c2SCharles.Forsyth switch(a->type) {
48574a4d8c2SCharles.Forsyth default:
48674a4d8c2SCharles.Forsyth print("unknown type %d\n", a->type);
48774a4d8c2SCharles.Forsyth exits("arg");
48874a4d8c2SCharles.Forsyth
48974a4d8c2SCharles.Forsyth case D_NONE:
49074a4d8c2SCharles.Forsyth case D_REG:
49174a4d8c2SCharles.Forsyth case D_FREG:
49274a4d8c2SCharles.Forsyth case D_PSR:
49374a4d8c2SCharles.Forsyth case D_FPCR:
49474a4d8c2SCharles.Forsyth break;
49574a4d8c2SCharles.Forsyth
49674a4d8c2SCharles.Forsyth case D_REGREG:
49774a4d8c2SCharles.Forsyth Bputc(&obuf, a->offset);
49874a4d8c2SCharles.Forsyth break;
49974a4d8c2SCharles.Forsyth
50074a4d8c2SCharles.Forsyth case D_OREG:
50174a4d8c2SCharles.Forsyth case D_CONST:
50274a4d8c2SCharles.Forsyth case D_BRANCH:
50374a4d8c2SCharles.Forsyth case D_SHIFT:
50474a4d8c2SCharles.Forsyth l = a->offset;
50574a4d8c2SCharles.Forsyth Bputc(&obuf, l);
50674a4d8c2SCharles.Forsyth Bputc(&obuf, l>>8);
50774a4d8c2SCharles.Forsyth Bputc(&obuf, l>>16);
50874a4d8c2SCharles.Forsyth Bputc(&obuf, l>>24);
50974a4d8c2SCharles.Forsyth break;
51074a4d8c2SCharles.Forsyth
51174a4d8c2SCharles.Forsyth case D_SCONST:
51274a4d8c2SCharles.Forsyth n = a->sval;
51374a4d8c2SCharles.Forsyth for(i=0; i<NSNAME; i++) {
51474a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
51574a4d8c2SCharles.Forsyth n++;
51674a4d8c2SCharles.Forsyth }
51774a4d8c2SCharles.Forsyth break;
51874a4d8c2SCharles.Forsyth
51974a4d8c2SCharles.Forsyth case D_FCONST:
52074a4d8c2SCharles.Forsyth ieeedtod(&e, a->dval);
52174a4d8c2SCharles.Forsyth Bputc(&obuf, e.l);
52274a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>8);
52374a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>16);
52474a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>24);
52574a4d8c2SCharles.Forsyth Bputc(&obuf, e.h);
52674a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>8);
52774a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>16);
52874a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>24);
52974a4d8c2SCharles.Forsyth break;
53074a4d8c2SCharles.Forsyth }
53174a4d8c2SCharles.Forsyth }
53274a4d8c2SCharles.Forsyth
53374a4d8c2SCharles.Forsyth static int bcode[] =
53474a4d8c2SCharles.Forsyth {
53574a4d8c2SCharles.Forsyth ABEQ,
53674a4d8c2SCharles.Forsyth ABNE,
53774a4d8c2SCharles.Forsyth ABCS,
53874a4d8c2SCharles.Forsyth ABCC,
53974a4d8c2SCharles.Forsyth ABMI,
54074a4d8c2SCharles.Forsyth ABPL,
54174a4d8c2SCharles.Forsyth ABVS,
54274a4d8c2SCharles.Forsyth ABVC,
54374a4d8c2SCharles.Forsyth ABHI,
54474a4d8c2SCharles.Forsyth ABLS,
54574a4d8c2SCharles.Forsyth ABGE,
54674a4d8c2SCharles.Forsyth ABLT,
54774a4d8c2SCharles.Forsyth ABGT,
54874a4d8c2SCharles.Forsyth ABLE,
54974a4d8c2SCharles.Forsyth AB,
55074a4d8c2SCharles.Forsyth ANOP,
55174a4d8c2SCharles.Forsyth };
55274a4d8c2SCharles.Forsyth
55374a4d8c2SCharles.Forsyth void
outcode(int a,int scond,Gen * g1,int reg,Gen * g2)55474a4d8c2SCharles.Forsyth outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
55574a4d8c2SCharles.Forsyth {
55674a4d8c2SCharles.Forsyth int sf, st, t;
55774a4d8c2SCharles.Forsyth Sym *s;
55874a4d8c2SCharles.Forsyth
55974a4d8c2SCharles.Forsyth /* hack to make B.NE etc. work: turn it into the corresponding conditional */
56074a4d8c2SCharles.Forsyth if(a == AB){
56174a4d8c2SCharles.Forsyth a = bcode[scond&0xf];
56274a4d8c2SCharles.Forsyth scond = (scond & ~0xf) | Always;
56374a4d8c2SCharles.Forsyth }
56474a4d8c2SCharles.Forsyth
56574a4d8c2SCharles.Forsyth if(pass == 1)
56674a4d8c2SCharles.Forsyth goto out;
56774a4d8c2SCharles.Forsyth jackpot:
56874a4d8c2SCharles.Forsyth sf = 0;
56974a4d8c2SCharles.Forsyth s = g1->sym;
57074a4d8c2SCharles.Forsyth while(s != S) {
57174a4d8c2SCharles.Forsyth sf = s->sym;
57274a4d8c2SCharles.Forsyth if(sf < 0 || sf >= NSYM)
57374a4d8c2SCharles.Forsyth sf = 0;
57474a4d8c2SCharles.Forsyth t = g1->name;
57574a4d8c2SCharles.Forsyth if(h[sf].type == t)
57674a4d8c2SCharles.Forsyth if(h[sf].sym == s)
57774a4d8c2SCharles.Forsyth break;
57874a4d8c2SCharles.Forsyth zname(s->name, t, sym);
57974a4d8c2SCharles.Forsyth s->sym = sym;
58074a4d8c2SCharles.Forsyth h[sym].sym = s;
58174a4d8c2SCharles.Forsyth h[sym].type = t;
58274a4d8c2SCharles.Forsyth sf = sym;
58374a4d8c2SCharles.Forsyth sym++;
58474a4d8c2SCharles.Forsyth if(sym >= NSYM)
58574a4d8c2SCharles.Forsyth sym = 1;
58674a4d8c2SCharles.Forsyth break;
58774a4d8c2SCharles.Forsyth }
58874a4d8c2SCharles.Forsyth st = 0;
58974a4d8c2SCharles.Forsyth s = g2->sym;
59074a4d8c2SCharles.Forsyth while(s != S) {
59174a4d8c2SCharles.Forsyth st = s->sym;
59274a4d8c2SCharles.Forsyth if(st < 0 || st >= NSYM)
59374a4d8c2SCharles.Forsyth st = 0;
59474a4d8c2SCharles.Forsyth t = g2->name;
59574a4d8c2SCharles.Forsyth if(h[st].type == t)
59674a4d8c2SCharles.Forsyth if(h[st].sym == s)
59774a4d8c2SCharles.Forsyth break;
59874a4d8c2SCharles.Forsyth zname(s->name, t, sym);
59974a4d8c2SCharles.Forsyth s->sym = sym;
60074a4d8c2SCharles.Forsyth h[sym].sym = s;
60174a4d8c2SCharles.Forsyth h[sym].type = t;
60274a4d8c2SCharles.Forsyth st = sym;
60374a4d8c2SCharles.Forsyth sym++;
60474a4d8c2SCharles.Forsyth if(sym >= NSYM)
60574a4d8c2SCharles.Forsyth sym = 1;
60674a4d8c2SCharles.Forsyth if(st == sf)
60774a4d8c2SCharles.Forsyth goto jackpot;
60874a4d8c2SCharles.Forsyth break;
60974a4d8c2SCharles.Forsyth }
61074a4d8c2SCharles.Forsyth Bputc(&obuf, a);
61174a4d8c2SCharles.Forsyth Bputc(&obuf, scond);
61274a4d8c2SCharles.Forsyth Bputc(&obuf, reg);
61374a4d8c2SCharles.Forsyth Bputc(&obuf, lineno);
61474a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>8);
61574a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>16);
61674a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>24);
61774a4d8c2SCharles.Forsyth zaddr(g1, sf);
61874a4d8c2SCharles.Forsyth zaddr(g2, st);
61974a4d8c2SCharles.Forsyth
62074a4d8c2SCharles.Forsyth out:
62174a4d8c2SCharles.Forsyth if(a != AGLOBL && a != ADATA)
62274a4d8c2SCharles.Forsyth pc++;
62374a4d8c2SCharles.Forsyth }
62474a4d8c2SCharles.Forsyth
62574a4d8c2SCharles.Forsyth void
outhist(void)62674a4d8c2SCharles.Forsyth outhist(void)
62774a4d8c2SCharles.Forsyth {
62874a4d8c2SCharles.Forsyth Gen g;
62974a4d8c2SCharles.Forsyth Hist *h;
63074a4d8c2SCharles.Forsyth char *p, *q, *op, c;
63174a4d8c2SCharles.Forsyth int n;
63274a4d8c2SCharles.Forsyth
63374a4d8c2SCharles.Forsyth g = nullgen;
63474a4d8c2SCharles.Forsyth c = pathchar();
63574a4d8c2SCharles.Forsyth for(h = hist; h != H; h = h->link) {
63674a4d8c2SCharles.Forsyth p = h->name;
63774a4d8c2SCharles.Forsyth op = 0;
63874a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
63974a4d8c2SCharles.Forsyth if(systemtype(Windows) && p && p[1] == ':'){
64074a4d8c2SCharles.Forsyth p += 2;
64174a4d8c2SCharles.Forsyth c = *p;
64274a4d8c2SCharles.Forsyth }
64374a4d8c2SCharles.Forsyth if(p && p[0] != c && h->offset == 0 && pathname){
64474a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
64574a4d8c2SCharles.Forsyth if(systemtype(Windows) && pathname[1] == ':') {
64674a4d8c2SCharles.Forsyth op = p;
64774a4d8c2SCharles.Forsyth p = pathname+2;
64874a4d8c2SCharles.Forsyth c = *p;
64974a4d8c2SCharles.Forsyth } else if(pathname[0] == c){
65074a4d8c2SCharles.Forsyth op = p;
65174a4d8c2SCharles.Forsyth p = pathname;
65274a4d8c2SCharles.Forsyth }
65374a4d8c2SCharles.Forsyth }
65474a4d8c2SCharles.Forsyth while(p) {
65574a4d8c2SCharles.Forsyth q = strchr(p, c);
65674a4d8c2SCharles.Forsyth if(q) {
65774a4d8c2SCharles.Forsyth n = q-p;
65874a4d8c2SCharles.Forsyth if(n == 0){
65974a4d8c2SCharles.Forsyth n = 1; /* leading "/" */
66074a4d8c2SCharles.Forsyth *p = '/'; /* don't emit "\" on windows */
66174a4d8c2SCharles.Forsyth }
66274a4d8c2SCharles.Forsyth q++;
66374a4d8c2SCharles.Forsyth } else {
66474a4d8c2SCharles.Forsyth n = strlen(p);
66574a4d8c2SCharles.Forsyth q = 0;
66674a4d8c2SCharles.Forsyth }
66774a4d8c2SCharles.Forsyth if(n) {
66874a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
66974a4d8c2SCharles.Forsyth Bputc(&obuf, D_FILE); /* type */
67074a4d8c2SCharles.Forsyth Bputc(&obuf, 1); /* sym */
67174a4d8c2SCharles.Forsyth Bputc(&obuf, '<');
67274a4d8c2SCharles.Forsyth Bwrite(&obuf, p, n);
67374a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
67474a4d8c2SCharles.Forsyth }
67574a4d8c2SCharles.Forsyth p = q;
67674a4d8c2SCharles.Forsyth if(p == 0 && op) {
67774a4d8c2SCharles.Forsyth p = op;
67874a4d8c2SCharles.Forsyth op = 0;
67974a4d8c2SCharles.Forsyth }
68074a4d8c2SCharles.Forsyth }
68174a4d8c2SCharles.Forsyth g.offset = h->offset;
68274a4d8c2SCharles.Forsyth
68374a4d8c2SCharles.Forsyth Bputc(&obuf, AHISTORY);
68474a4d8c2SCharles.Forsyth Bputc(&obuf, Always);
68574a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
68674a4d8c2SCharles.Forsyth Bputc(&obuf, h->line);
68774a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>8);
68874a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>16);
68974a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>24);
69074a4d8c2SCharles.Forsyth zaddr(&nullgen, 0);
69174a4d8c2SCharles.Forsyth zaddr(&g, 0);
69274a4d8c2SCharles.Forsyth }
69374a4d8c2SCharles.Forsyth }
69474a4d8c2SCharles.Forsyth
69574a4d8c2SCharles.Forsyth #include "../cc/lexbody"
69674a4d8c2SCharles.Forsyth #include "../cc/macbody"
697