17dd7cddfSDavid du Colombier #define EXTERN
23e12c5d1SDavid du Colombier #include "a.h"
33e12c5d1SDavid du Colombier #include "y.tab.h"
4375daca8SDavid du Colombier #include <ctype.h>
53e12c5d1SDavid du Colombier
63e12c5d1SDavid du Colombier void
main(int argc,char * argv[])73e12c5d1SDavid du Colombier main(int argc, char *argv[])
83e12c5d1SDavid du Colombier {
97dd7cddfSDavid du Colombier char *p;
107dd7cddfSDavid du Colombier int nout, nproc, status, i, c;
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier thechar = 'v';
133e12c5d1SDavid du Colombier thestring = "mips";
143e12c5d1SDavid du Colombier memset(debug, 0, sizeof(debug));
153e12c5d1SDavid du Colombier cinit();
163e12c5d1SDavid du Colombier outfile = 0;
173e12c5d1SDavid du Colombier include[ninclude++] = ".";
183e12c5d1SDavid du Colombier ARGBEGIN {
193e12c5d1SDavid du Colombier default:
203e12c5d1SDavid du Colombier c = ARGC();
213e12c5d1SDavid du Colombier if(c >= 0 || c < sizeof(debug))
223e12c5d1SDavid du Colombier debug[c] = 1;
233e12c5d1SDavid du Colombier break;
243e12c5d1SDavid du Colombier
253e12c5d1SDavid du Colombier case 'o':
263e12c5d1SDavid du Colombier outfile = ARGF();
273e12c5d1SDavid du Colombier break;
283e12c5d1SDavid du Colombier
293e12c5d1SDavid du Colombier case 'D':
303e12c5d1SDavid du Colombier p = ARGF();
313e12c5d1SDavid du Colombier if(p)
32219b2ee8SDavid du Colombier Dlist[nDlist++] = p;
333e12c5d1SDavid du Colombier break;
343e12c5d1SDavid du Colombier
353e12c5d1SDavid du Colombier case 'I':
363e12c5d1SDavid du Colombier p = ARGF();
377dd7cddfSDavid du Colombier setinclude(p);
383e12c5d1SDavid du Colombier break;
39*91178603SDavid du Colombier case 'L': /* for little-endian mips */
40*91178603SDavid du Colombier thechar = '0';
41*91178603SDavid du Colombier thestring = "spim";
42*91178603SDavid du Colombier break;
433e12c5d1SDavid du Colombier } ARGEND
443e12c5d1SDavid du Colombier if(*argv == 0) {
453e12c5d1SDavid du Colombier print("usage: %ca [-options] file.s\n", thechar);
463e12c5d1SDavid du Colombier errorexit();
473e12c5d1SDavid du Colombier }
487dd7cddfSDavid du Colombier if(argc > 1 && systemtype(Windows)){
497dd7cddfSDavid du Colombier print("can't assemble multiple files on windows\n");
507dd7cddfSDavid du Colombier errorexit();
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier if(argc > 1 && !systemtype(Windows)) {
537dd7cddfSDavid du Colombier nproc = 1;
543e12c5d1SDavid du Colombier if(p = getenv("NPROC"))
557dd7cddfSDavid du Colombier nproc = atol(p); /* */
563e12c5d1SDavid du Colombier c = 0;
573e12c5d1SDavid du Colombier nout = 0;
583e12c5d1SDavid du Colombier for(;;) {
593e12c5d1SDavid du Colombier while(nout < nproc && argc > 0) {
607dd7cddfSDavid du Colombier i = myfork();
613e12c5d1SDavid du Colombier if(i < 0) {
623e12c5d1SDavid du Colombier i = mywait(&status);
633e12c5d1SDavid du Colombier if(i < 0)
643e12c5d1SDavid du Colombier errorexit();
653e12c5d1SDavid du Colombier if(status)
663e12c5d1SDavid du Colombier c++;
673e12c5d1SDavid du Colombier nout--;
683e12c5d1SDavid du Colombier continue;
693e12c5d1SDavid du Colombier }
703e12c5d1SDavid du Colombier if(i == 0) {
713e12c5d1SDavid du Colombier print("%s:\n", *argv);
727dd7cddfSDavid du Colombier if(assemble(*argv))
737dd7cddfSDavid du Colombier errorexit();
747dd7cddfSDavid du Colombier exits(0);
753e12c5d1SDavid du Colombier }
763e12c5d1SDavid du Colombier nout++;
773e12c5d1SDavid du Colombier argc--;
783e12c5d1SDavid du Colombier argv++;
793e12c5d1SDavid du Colombier }
803e12c5d1SDavid du Colombier i = mywait(&status);
813e12c5d1SDavid du Colombier if(i < 0) {
823e12c5d1SDavid du Colombier if(c)
833e12c5d1SDavid du Colombier errorexit();
843e12c5d1SDavid du Colombier exits(0);
853e12c5d1SDavid du Colombier }
863e12c5d1SDavid du Colombier if(status)
873e12c5d1SDavid du Colombier c++;
883e12c5d1SDavid du Colombier nout--;
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier }
917dd7cddfSDavid du Colombier if(assemble(argv[0]))
927dd7cddfSDavid du Colombier errorexit();
937dd7cddfSDavid du Colombier exits(0);
947dd7cddfSDavid du Colombier }
953e12c5d1SDavid du Colombier
967dd7cddfSDavid du Colombier int
assemble(char * file)977dd7cddfSDavid du Colombier assemble(char *file)
987dd7cddfSDavid du Colombier {
997dd7cddfSDavid du Colombier char ofile[100], incfile[20], *p;
1007dd7cddfSDavid du Colombier int i, of;
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier strcpy(ofile, file);
1037dd7cddfSDavid du Colombier p = utfrrune(ofile, pathchar());
1047dd7cddfSDavid du Colombier if(p) {
1053e12c5d1SDavid du Colombier include[0] = ofile;
1063e12c5d1SDavid du Colombier *p++ = 0;
1073e12c5d1SDavid du Colombier } else
1083e12c5d1SDavid du Colombier p = ofile;
1093e12c5d1SDavid du Colombier if(outfile == 0) {
1103e12c5d1SDavid du Colombier outfile = p;
1117dd7cddfSDavid du Colombier if(outfile){
1127dd7cddfSDavid du Colombier p = utfrrune(outfile, '.');
1137dd7cddfSDavid du Colombier if(p)
1143e12c5d1SDavid du Colombier if(p[1] == 's' && p[2] == 0)
1153e12c5d1SDavid du Colombier p[0] = 0;
1167dd7cddfSDavid du Colombier p = utfrune(outfile, 0);
1173e12c5d1SDavid du Colombier p[0] = '.';
1183e12c5d1SDavid du Colombier p[1] = thechar;
1193e12c5d1SDavid du Colombier p[2] = 0;
1207dd7cddfSDavid du Colombier } else
1217dd7cddfSDavid du Colombier outfile = "/dev/null";
1223e12c5d1SDavid du Colombier }
1237dd7cddfSDavid du Colombier p = getenv("INCLUDE");
1247dd7cddfSDavid du Colombier if(p) {
1257dd7cddfSDavid du Colombier setinclude(p);
1263e12c5d1SDavid du Colombier } else {
1277dd7cddfSDavid du Colombier if(systemtype(Plan9)) {
1287dd7cddfSDavid du Colombier sprint(incfile,"/%s/include", thestring);
1297dd7cddfSDavid du Colombier setinclude(strdup(incfile));
1303e12c5d1SDavid du Colombier }
1317dd7cddfSDavid du Colombier }
1327dd7cddfSDavid du Colombier
1333e12c5d1SDavid du Colombier of = mycreat(outfile, 0664);
1343e12c5d1SDavid du Colombier if(of < 0) {
1353e12c5d1SDavid du Colombier yyerror("%ca: cannot create %s", thechar, outfile);
1363e12c5d1SDavid du Colombier errorexit();
1373e12c5d1SDavid du Colombier }
1383e12c5d1SDavid du Colombier Binit(&obuf, of, OWRITE);
1393e12c5d1SDavid du Colombier
1403e12c5d1SDavid du Colombier pass = 1;
1417dd7cddfSDavid du Colombier pinit(file);
142219b2ee8SDavid du Colombier for(i=0; i<nDlist; i++)
143219b2ee8SDavid du Colombier dodefine(Dlist[i]);
1443e12c5d1SDavid du Colombier yyparse();
1453e12c5d1SDavid du Colombier if(nerrors) {
1463e12c5d1SDavid du Colombier cclean();
1477dd7cddfSDavid du Colombier return nerrors;
1483e12c5d1SDavid du Colombier }
1493e12c5d1SDavid du Colombier
1503e12c5d1SDavid du Colombier pass = 2;
1513e12c5d1SDavid du Colombier outhist();
1527dd7cddfSDavid du Colombier pinit(file);
153219b2ee8SDavid du Colombier for(i=0; i<nDlist; i++)
154219b2ee8SDavid du Colombier dodefine(Dlist[i]);
1553e12c5d1SDavid du Colombier yyparse();
1563e12c5d1SDavid du Colombier cclean();
1577dd7cddfSDavid du Colombier return nerrors;
1583e12c5d1SDavid du Colombier }
1593e12c5d1SDavid du Colombier
1603e12c5d1SDavid du Colombier struct
1613e12c5d1SDavid du Colombier {
1623e12c5d1SDavid du Colombier char *name;
1633e12c5d1SDavid du Colombier ushort type;
1643e12c5d1SDavid du Colombier ushort value;
1653e12c5d1SDavid du Colombier } itab[] =
1663e12c5d1SDavid du Colombier {
1673e12c5d1SDavid du Colombier "SP", LSP, D_AUTO,
1683e12c5d1SDavid du Colombier "SB", LSB, D_EXTERN,
1693e12c5d1SDavid du Colombier "FP", LFP, D_PARAM,
1703e12c5d1SDavid du Colombier "PC", LPC, D_BRANCH,
1713e12c5d1SDavid du Colombier "HI", LHI, D_HI,
1723e12c5d1SDavid du Colombier "LO", LLO, D_LO,
1733e12c5d1SDavid du Colombier
1743e12c5d1SDavid du Colombier "R", LR, 0,
1753e12c5d1SDavid du Colombier "R0", LREG, 0,
1763e12c5d1SDavid du Colombier "R1", LREG, 1,
1773e12c5d1SDavid du Colombier "R2", LREG, 2,
1783e12c5d1SDavid du Colombier "R3", LREG, 3,
1793e12c5d1SDavid du Colombier "R4", LREG, 4,
1803e12c5d1SDavid du Colombier "R5", LREG, 5,
1813e12c5d1SDavid du Colombier "R6", LREG, 6,
1823e12c5d1SDavid du Colombier "R7", LREG, 7,
1833e12c5d1SDavid du Colombier "R8", LREG, 8,
1843e12c5d1SDavid du Colombier "R9", LREG, 9,
1853e12c5d1SDavid du Colombier "R10", LREG, 10,
1863e12c5d1SDavid du Colombier "R11", LREG, 11,
1873e12c5d1SDavid du Colombier "R12", LREG, 12,
1883e12c5d1SDavid du Colombier "R13", LREG, 13,
1893e12c5d1SDavid du Colombier "R14", LREG, 14,
1903e12c5d1SDavid du Colombier "R15", LREG, 15,
1913e12c5d1SDavid du Colombier "R16", LREG, 16,
1923e12c5d1SDavid du Colombier "R17", LREG, 17,
1933e12c5d1SDavid du Colombier "R18", LREG, 18,
1943e12c5d1SDavid du Colombier "R19", LREG, 19,
1953e12c5d1SDavid du Colombier "R20", LREG, 20,
1963e12c5d1SDavid du Colombier "R21", LREG, 21,
1973e12c5d1SDavid du Colombier "R22", LREG, 22,
1983e12c5d1SDavid du Colombier "R23", LREG, 23,
1993e12c5d1SDavid du Colombier "R24", LREG, 24,
2003e12c5d1SDavid du Colombier "R25", LREG, 25,
2013e12c5d1SDavid du Colombier "R26", LREG, 26,
2023e12c5d1SDavid du Colombier "R27", LREG, 27,
2033e12c5d1SDavid du Colombier "R28", LREG, 28,
2043e12c5d1SDavid du Colombier "R29", LREG, 29,
2053e12c5d1SDavid du Colombier "R30", LREG, 30,
2063e12c5d1SDavid du Colombier "R31", LREG, 31,
2073e12c5d1SDavid du Colombier
2083e12c5d1SDavid du Colombier "M", LM, 0,
2093e12c5d1SDavid du Colombier "M0", LMREG, 0,
2103e12c5d1SDavid du Colombier "M1", LMREG, 1,
2113e12c5d1SDavid du Colombier "M2", LMREG, 2,
2123e12c5d1SDavid du Colombier "M3", LMREG, 3,
2133e12c5d1SDavid du Colombier "M4", LMREG, 4,
2143e12c5d1SDavid du Colombier "M5", LMREG, 5,
2153e12c5d1SDavid du Colombier "M6", LMREG, 6,
2163e12c5d1SDavid du Colombier "M7", LMREG, 7,
2173e12c5d1SDavid du Colombier "M8", LMREG, 8,
2183e12c5d1SDavid du Colombier "M9", LMREG, 9,
2193e12c5d1SDavid du Colombier "M10", LMREG, 10,
2203e12c5d1SDavid du Colombier "M11", LMREG, 11,
2213e12c5d1SDavid du Colombier "M12", LMREG, 12,
2223e12c5d1SDavid du Colombier "M13", LMREG, 13,
2233e12c5d1SDavid du Colombier "M14", LMREG, 14,
2243e12c5d1SDavid du Colombier "M15", LMREG, 15,
2253e12c5d1SDavid du Colombier "M16", LMREG, 16,
2263e12c5d1SDavid du Colombier "M17", LMREG, 17,
2273e12c5d1SDavid du Colombier "M18", LMREG, 18,
2283e12c5d1SDavid du Colombier "M19", LMREG, 19,
2293e12c5d1SDavid du Colombier "M20", LMREG, 20,
2303e12c5d1SDavid du Colombier "M21", LMREG, 21,
2313e12c5d1SDavid du Colombier "M22", LMREG, 22,
2323e12c5d1SDavid du Colombier "M23", LMREG, 23,
2333e12c5d1SDavid du Colombier "M24", LMREG, 24,
2343e12c5d1SDavid du Colombier "M25", LMREG, 25,
2353e12c5d1SDavid du Colombier "M26", LMREG, 26,
2363e12c5d1SDavid du Colombier "M27", LMREG, 27,
2373e12c5d1SDavid du Colombier "M28", LMREG, 28,
2383e12c5d1SDavid du Colombier "M29", LMREG, 29,
2393e12c5d1SDavid du Colombier "M30", LMREG, 30,
2403e12c5d1SDavid du Colombier "M31", LMREG, 31,
2413e12c5d1SDavid du Colombier
2423e12c5d1SDavid du Colombier "F", LF, 0,
2433e12c5d1SDavid du Colombier
2443e12c5d1SDavid du Colombier "F0", LFREG, 0,
2453e12c5d1SDavid du Colombier "F1", LFREG, 1,
2463e12c5d1SDavid du Colombier "F2", LFREG, 2,
2473e12c5d1SDavid du Colombier "F3", LFREG, 3,
2483e12c5d1SDavid du Colombier "F4", LFREG, 4,
2493e12c5d1SDavid du Colombier "F5", LFREG, 5,
2503e12c5d1SDavid du Colombier "F6", LFREG, 6,
2513e12c5d1SDavid du Colombier "F7", LFREG, 7,
2523e12c5d1SDavid du Colombier "F8", LFREG, 8,
2533e12c5d1SDavid du Colombier "F9", LFREG, 9,
2543e12c5d1SDavid du Colombier "F10", LFREG, 10,
2553e12c5d1SDavid du Colombier "F11", LFREG, 11,
2563e12c5d1SDavid du Colombier "F12", LFREG, 12,
2573e12c5d1SDavid du Colombier "F13", LFREG, 13,
2583e12c5d1SDavid du Colombier "F14", LFREG, 14,
2593e12c5d1SDavid du Colombier "F15", LFREG, 15,
2603e12c5d1SDavid du Colombier "F16", LFREG, 16,
2613e12c5d1SDavid du Colombier "F17", LFREG, 17,
2623e12c5d1SDavid du Colombier "F18", LFREG, 18,
2633e12c5d1SDavid du Colombier "F19", LFREG, 19,
2643e12c5d1SDavid du Colombier "F20", LFREG, 20,
2653e12c5d1SDavid du Colombier "F21", LFREG, 21,
2663e12c5d1SDavid du Colombier "F22", LFREG, 22,
2673e12c5d1SDavid du Colombier "F23", LFREG, 23,
2683e12c5d1SDavid du Colombier "F24", LFREG, 24,
2693e12c5d1SDavid du Colombier "F25", LFREG, 25,
2703e12c5d1SDavid du Colombier "F26", LFREG, 26,
2713e12c5d1SDavid du Colombier "F27", LFREG, 27,
2723e12c5d1SDavid du Colombier "F28", LFREG, 28,
2733e12c5d1SDavid du Colombier "F29", LFREG, 29,
2743e12c5d1SDavid du Colombier "F30", LFREG, 30,
2753e12c5d1SDavid du Colombier "F31", LFREG, 31,
2763e12c5d1SDavid du Colombier
2773e12c5d1SDavid du Colombier "FCR", LFCR, 0,
2783e12c5d1SDavid du Colombier "FCR0", LFCREG, 0,
2793e12c5d1SDavid du Colombier "FCR1", LFCREG, 1,
2803e12c5d1SDavid du Colombier "FCR2", LFCREG, 2,
2813e12c5d1SDavid du Colombier "FCR3", LFCREG, 3,
2823e12c5d1SDavid du Colombier "FCR4", LFCREG, 4,
2833e12c5d1SDavid du Colombier "FCR5", LFCREG, 5,
2843e12c5d1SDavid du Colombier "FCR6", LFCREG, 6,
2853e12c5d1SDavid du Colombier "FCR7", LFCREG, 7,
2863e12c5d1SDavid du Colombier "FCR8", LFCREG, 8,
2873e12c5d1SDavid du Colombier "FCR9", LFCREG, 9,
2883e12c5d1SDavid du Colombier "FCR10", LFCREG, 10,
2893e12c5d1SDavid du Colombier "FCR11", LFCREG, 11,
2903e12c5d1SDavid du Colombier "FCR12", LFCREG, 12,
2913e12c5d1SDavid du Colombier "FCR13", LFCREG, 13,
2923e12c5d1SDavid du Colombier "FCR14", LFCREG, 14,
2933e12c5d1SDavid du Colombier "FCR15", LFCREG, 15,
2943e12c5d1SDavid du Colombier "FCR16", LFCREG, 16,
2953e12c5d1SDavid du Colombier "FCR17", LFCREG, 17,
2963e12c5d1SDavid du Colombier "FCR18", LFCREG, 18,
2973e12c5d1SDavid du Colombier "FCR19", LFCREG, 19,
2983e12c5d1SDavid du Colombier "FCR20", LFCREG, 20,
2993e12c5d1SDavid du Colombier "FCR21", LFCREG, 21,
3003e12c5d1SDavid du Colombier "FCR22", LFCREG, 22,
3013e12c5d1SDavid du Colombier "FCR23", LFCREG, 23,
3023e12c5d1SDavid du Colombier "FCR24", LFCREG, 24,
3033e12c5d1SDavid du Colombier "FCR25", LFCREG, 25,
3043e12c5d1SDavid du Colombier "FCR26", LFCREG, 26,
3053e12c5d1SDavid du Colombier "FCR27", LFCREG, 27,
3063e12c5d1SDavid du Colombier "FCR28", LFCREG, 28,
3073e12c5d1SDavid du Colombier "FCR29", LFCREG, 29,
3083e12c5d1SDavid du Colombier "FCR30", LFCREG, 30,
3093e12c5d1SDavid du Colombier "FCR31", LFCREG, 31,
3103e12c5d1SDavid du Colombier
3113e12c5d1SDavid du Colombier "ADD", LTYPE1, AADD,
3123e12c5d1SDavid du Colombier "ADDU", LTYPE1, AADDU,
3133e12c5d1SDavid du Colombier "SUB", LTYPE1, ASUB, /* converted to ADD(-) in loader */
3143e12c5d1SDavid du Colombier "SUBU", LTYPE1, ASUBU,
3153e12c5d1SDavid du Colombier "SGT", LTYPE1, ASGT,
3163e12c5d1SDavid du Colombier "SGTU", LTYPE1, ASGTU,
3173e12c5d1SDavid du Colombier "AND", LTYPE1, AAND,
3183e12c5d1SDavid du Colombier "OR", LTYPE1, AOR,
3193e12c5d1SDavid du Colombier "XOR", LTYPE1, AXOR,
3203e12c5d1SDavid du Colombier "SLL", LTYPE1, ASLL,
3213e12c5d1SDavid du Colombier "SRL", LTYPE1, ASRL,
3223e12c5d1SDavid du Colombier "SRA", LTYPE1, ASRA,
3233e12c5d1SDavid du Colombier
324219b2ee8SDavid du Colombier "ADDV", LTYPE1, AADDV,
325219b2ee8SDavid du Colombier "ADDVU", LTYPE1, AADDVU,
326219b2ee8SDavid du Colombier "SUBV", LTYPE1, ASUBV, /* converted to ADD(-) in loader */
327219b2ee8SDavid du Colombier "SUBVU", LTYPE1, ASUBVU,
328219b2ee8SDavid du Colombier "SLLV", LTYPE1, ASLLV,
329219b2ee8SDavid du Colombier "SRLV", LTYPE1, ASRLV,
330219b2ee8SDavid du Colombier "SRAV", LTYPE1, ASRAV,
331219b2ee8SDavid du Colombier
3323e12c5d1SDavid du Colombier "NOR", LTYPE2, ANOR,
3333e12c5d1SDavid du Colombier
3343e12c5d1SDavid du Colombier "MOVB", LTYPE3, AMOVB,
3353e12c5d1SDavid du Colombier "MOVBU", LTYPE3, AMOVBU,
3363e12c5d1SDavid du Colombier "MOVH", LTYPE3, AMOVH,
3373e12c5d1SDavid du Colombier "MOVHU", LTYPE3, AMOVHU,
3383e12c5d1SDavid du Colombier "MOVWL", LTYPE3, AMOVWL,
3393e12c5d1SDavid du Colombier "MOVWR", LTYPE3, AMOVWR,
340219b2ee8SDavid du Colombier "MOVVL", LTYPE3, AMOVVL,
341219b2ee8SDavid du Colombier "MOVVR", LTYPE3, AMOVVR,
3423e12c5d1SDavid du Colombier
343bd389b36SDavid du Colombier "BREAK", LTYPEJ, ABREAK, /* overloaded CACHE opcode */
3443e12c5d1SDavid du Colombier "END", LTYPE4, AEND,
3453e12c5d1SDavid du Colombier "REM", LTYPE6, AREM,
3463e12c5d1SDavid du Colombier "REMU", LTYPE6, AREMU,
3473e12c5d1SDavid du Colombier "RET", LTYPE4, ARET,
3483e12c5d1SDavid du Colombier "SYSCALL", LTYPE4, ASYSCALL,
3493e12c5d1SDavid du Colombier "TLBP", LTYPE4, ATLBP,
3503e12c5d1SDavid du Colombier "TLBR", LTYPE4, ATLBR,
3513e12c5d1SDavid du Colombier "TLBWI", LTYPE4, ATLBWI,
3523e12c5d1SDavid du Colombier "TLBWR", LTYPE4, ATLBWR,
3533e12c5d1SDavid du Colombier
3543e12c5d1SDavid du Colombier "MOVW", LTYPE5, AMOVW,
355219b2ee8SDavid du Colombier "MOVV", LTYPE5, AMOVV,
3563e12c5d1SDavid du Colombier "MOVD", LTYPE5, AMOVD,
3573e12c5d1SDavid du Colombier "MOVF", LTYPE5, AMOVF,
3583e12c5d1SDavid du Colombier
3593e12c5d1SDavid du Colombier "DIV", LTYPE6, ADIV,
3603e12c5d1SDavid du Colombier "DIVU", LTYPE6, ADIVU,
3613e12c5d1SDavid du Colombier "MUL", LTYPE6, AMUL,
3623e12c5d1SDavid du Colombier "MULU", LTYPE6, AMULU,
363219b2ee8SDavid du Colombier "DIVV", LTYPE6, ADIVV,
364219b2ee8SDavid du Colombier "DIVVU", LTYPE6, ADIVVU,
365219b2ee8SDavid du Colombier "MULV", LTYPE6, AMULV,
366219b2ee8SDavid du Colombier "MULVU", LTYPE6, AMULVU,
3673e12c5d1SDavid du Colombier
3683e12c5d1SDavid du Colombier "RFE", LTYPE7, ARFE,
3693e12c5d1SDavid du Colombier "JMP", LTYPE7, AJMP,
3703e12c5d1SDavid du Colombier
3713e12c5d1SDavid du Colombier "JAL", LTYPE8, AJAL,
3723e12c5d1SDavid du Colombier
3733e12c5d1SDavid du Colombier "BEQ", LTYPE9, ABEQ,
3743e12c5d1SDavid du Colombier "BNE", LTYPE9, ABNE,
3753e12c5d1SDavid du Colombier
3763e12c5d1SDavid du Colombier "BGEZ", LTYPEA, ABGEZ,
3773e12c5d1SDavid du Colombier "BGEZAL", LTYPEA, ABGEZAL,
3783e12c5d1SDavid du Colombier "BGTZ", LTYPEA, ABGTZ,
3793e12c5d1SDavid du Colombier "BLEZ", LTYPEA, ABLEZ,
3803e12c5d1SDavid du Colombier "BLTZ", LTYPEA, ABLTZ,
3813e12c5d1SDavid du Colombier "BLTZAL", LTYPEA, ABLTZAL,
3823e12c5d1SDavid du Colombier
3833e12c5d1SDavid du Colombier "TEXT", LTYPEB, ATEXT,
3843e12c5d1SDavid du Colombier "GLOBL", LTYPEB, AGLOBL,
3853e12c5d1SDavid du Colombier
3863e12c5d1SDavid du Colombier "DATA", LTYPEC, ADATA,
3873e12c5d1SDavid du Colombier
3883e12c5d1SDavid du Colombier "MOVDF", LTYPE5, AMOVDF,
3893e12c5d1SDavid du Colombier "MOVDW", LTYPE5, AMOVDW,
3903e12c5d1SDavid du Colombier "MOVFD", LTYPE5, AMOVFD,
3913e12c5d1SDavid du Colombier "MOVFW", LTYPE5, AMOVFW,
3923e12c5d1SDavid du Colombier "MOVWD", LTYPE5, AMOVWD,
3933e12c5d1SDavid du Colombier "MOVWF", LTYPE5, AMOVWF,
3943e12c5d1SDavid du Colombier
3953e12c5d1SDavid du Colombier "ABSD", LTYPED, AABSD,
3963e12c5d1SDavid du Colombier "ABSF", LTYPED, AABSF,
3973e12c5d1SDavid du Colombier "ABSW", LTYPED, AABSW,
3983e12c5d1SDavid du Colombier "NEGD", LTYPED, ANEGD,
3993e12c5d1SDavid du Colombier "NEGF", LTYPED, ANEGF,
4003e12c5d1SDavid du Colombier "NEGW", LTYPED, ANEGW,
4013e12c5d1SDavid du Colombier
4023e12c5d1SDavid du Colombier "CMPEQD", LTYPEF, ACMPEQD,
4033e12c5d1SDavid du Colombier "CMPEQF", LTYPEF, ACMPEQF,
4043e12c5d1SDavid du Colombier "CMPGED", LTYPEF, ACMPGED,
4053e12c5d1SDavid du Colombier "CMPGEF", LTYPEF, ACMPGEF,
4063e12c5d1SDavid du Colombier "CMPGTD", LTYPEF, ACMPGTD,
4073e12c5d1SDavid du Colombier "CMPGTF", LTYPEF, ACMPGTF,
4083e12c5d1SDavid du Colombier
4093e12c5d1SDavid du Colombier "ADDD", LTYPEE, AADDD,
4103e12c5d1SDavid du Colombier "ADDF", LTYPEE, AADDF,
4113e12c5d1SDavid du Colombier "ADDW", LTYPEE, AADDW,
4123e12c5d1SDavid du Colombier "DIVD", LTYPEE, ADIVD,
4133e12c5d1SDavid du Colombier "DIVF", LTYPEE, ADIVF,
4143e12c5d1SDavid du Colombier "DIVW", LTYPEE, ADIVW,
4153e12c5d1SDavid du Colombier "MULD", LTYPEE, AMULD,
4163e12c5d1SDavid du Colombier "MULF", LTYPEE, AMULF,
4173e12c5d1SDavid du Colombier "MULW", LTYPEE, AMULW,
4183e12c5d1SDavid du Colombier "SUBD", LTYPEE, ASUBD,
4193e12c5d1SDavid du Colombier "SUBF", LTYPEE, ASUBF,
4203e12c5d1SDavid du Colombier "SUBW", LTYPEE, ASUBW,
4213e12c5d1SDavid du Colombier
4223e12c5d1SDavid du Colombier "BFPT", LTYPEG, ABFPT,
4233e12c5d1SDavid du Colombier "BFPF", LTYPEG, ABFPF,
4243e12c5d1SDavid du Colombier
4253e12c5d1SDavid du Colombier "WORD", LTYPEH, AWORD,
4263e12c5d1SDavid du Colombier "NOP", LTYPEI, ANOP,
427219b2ee8SDavid du Colombier "SCHED", LSCHED, 0,
428219b2ee8SDavid du Colombier "NOSCHED", LSCHED, 0x80,
4293e12c5d1SDavid du Colombier 0
4303e12c5d1SDavid du Colombier };
4313e12c5d1SDavid du Colombier
4323e12c5d1SDavid du Colombier void
cinit(void)4333e12c5d1SDavid du Colombier cinit(void)
4343e12c5d1SDavid du Colombier {
4353e12c5d1SDavid du Colombier Sym *s;
4363e12c5d1SDavid du Colombier int i;
4373e12c5d1SDavid du Colombier
4383e12c5d1SDavid du Colombier nullgen.sym = S;
4393e12c5d1SDavid du Colombier nullgen.offset = 0;
4403e12c5d1SDavid du Colombier nullgen.type = D_NONE;
4413e12c5d1SDavid du Colombier nullgen.name = D_NONE;
4423e12c5d1SDavid du Colombier nullgen.reg = NREG;
4433e12c5d1SDavid du Colombier if(FPCHIP)
4443e12c5d1SDavid du Colombier nullgen.dval = 0;
4453e12c5d1SDavid du Colombier for(i=0; i<sizeof(nullgen.sval); i++)
4463e12c5d1SDavid du Colombier nullgen.sval[i] = 0;
4473e12c5d1SDavid du Colombier
4483e12c5d1SDavid du Colombier nerrors = 0;
4493e12c5d1SDavid du Colombier iostack = I;
4503e12c5d1SDavid du Colombier iofree = I;
4513e12c5d1SDavid du Colombier peekc = IGN;
4523e12c5d1SDavid du Colombier nhunk = 0;
4533e12c5d1SDavid du Colombier for(i=0; i<NHASH; i++)
4543e12c5d1SDavid du Colombier hash[i] = S;
4553e12c5d1SDavid du Colombier for(i=0; itab[i].name; i++) {
4563e12c5d1SDavid du Colombier s = slookup(itab[i].name);
4573e12c5d1SDavid du Colombier s->type = itab[i].type;
4583e12c5d1SDavid du Colombier s->value = itab[i].value;
4593e12c5d1SDavid du Colombier }
460219b2ee8SDavid du Colombier
4617dd7cddfSDavid du Colombier pathname = allocn(pathname, 0, 100);
4627dd7cddfSDavid du Colombier if(mygetwd(pathname, 99) == 0) {
4637dd7cddfSDavid du Colombier pathname = allocn(pathname, 100, 900);
4647dd7cddfSDavid du Colombier if(mygetwd(pathname, 999) == 0)
465219b2ee8SDavid du Colombier strcpy(pathname, "/???");
466219b2ee8SDavid du Colombier }
4673e12c5d1SDavid du Colombier }
4683e12c5d1SDavid du Colombier
4693e12c5d1SDavid du Colombier void
syminit(Sym * s)4703e12c5d1SDavid du Colombier syminit(Sym *s)
4713e12c5d1SDavid du Colombier {
4723e12c5d1SDavid du Colombier
4733e12c5d1SDavid du Colombier s->type = LNAME;
4743e12c5d1SDavid du Colombier s->value = 0;
4753e12c5d1SDavid du Colombier }
4763e12c5d1SDavid du Colombier
4773e12c5d1SDavid du Colombier int
isreg(Gen * g)4783e12c5d1SDavid du Colombier isreg(Gen *g)
4793e12c5d1SDavid du Colombier {
4803e12c5d1SDavid du Colombier
4813e12c5d1SDavid du Colombier USED(g);
4823e12c5d1SDavid du Colombier return 1;
4833e12c5d1SDavid du Colombier }
4843e12c5d1SDavid du Colombier
4853e12c5d1SDavid du Colombier void
cclean(void)4863e12c5d1SDavid du Colombier cclean(void)
4873e12c5d1SDavid du Colombier {
4883e12c5d1SDavid du Colombier
4893e12c5d1SDavid du Colombier outcode(AEND, &nullgen, NREG, &nullgen);
4903e12c5d1SDavid du Colombier Bflush(&obuf);
4913e12c5d1SDavid du Colombier }
4923e12c5d1SDavid du Colombier
4933e12c5d1SDavid du Colombier void
zname(char * n,int t,int s)4943e12c5d1SDavid du Colombier zname(char *n, int t, int s)
4953e12c5d1SDavid du Colombier {
4963e12c5d1SDavid du Colombier
4973e12c5d1SDavid du Colombier Bputc(&obuf, ANAME);
4983e12c5d1SDavid du Colombier Bputc(&obuf, t); /* type */
4993e12c5d1SDavid du Colombier Bputc(&obuf, s); /* sym */
5003e12c5d1SDavid du Colombier while(*n) {
5013e12c5d1SDavid du Colombier Bputc(&obuf, *n);
5023e12c5d1SDavid du Colombier n++;
5033e12c5d1SDavid du Colombier }
5043e12c5d1SDavid du Colombier Bputc(&obuf, 0);
5053e12c5d1SDavid du Colombier }
5063e12c5d1SDavid du Colombier
5073e12c5d1SDavid du Colombier void
zaddr(Gen * a,int s)5083e12c5d1SDavid du Colombier zaddr(Gen *a, int s)
5093e12c5d1SDavid du Colombier {
5103e12c5d1SDavid du Colombier long l;
5113e12c5d1SDavid du Colombier int i;
5123e12c5d1SDavid du Colombier char *n;
5133e12c5d1SDavid du Colombier Ieee e;
5143e12c5d1SDavid du Colombier
5153e12c5d1SDavid du Colombier Bputc(&obuf, a->type);
5163e12c5d1SDavid du Colombier Bputc(&obuf, a->reg);
5173e12c5d1SDavid du Colombier Bputc(&obuf, s);
5183e12c5d1SDavid du Colombier Bputc(&obuf, a->name);
5193e12c5d1SDavid du Colombier switch(a->type) {
5203e12c5d1SDavid du Colombier default:
5213e12c5d1SDavid du Colombier print("unknown type %d\n", a->type);
5223e12c5d1SDavid du Colombier exits("arg");
5233e12c5d1SDavid du Colombier
5243e12c5d1SDavid du Colombier case D_NONE:
5253e12c5d1SDavid du Colombier case D_REG:
5263e12c5d1SDavid du Colombier case D_FREG:
5273e12c5d1SDavid du Colombier case D_MREG:
5283e12c5d1SDavid du Colombier case D_FCREG:
5293e12c5d1SDavid du Colombier case D_LO:
5303e12c5d1SDavid du Colombier case D_HI:
5313e12c5d1SDavid du Colombier break;
5323e12c5d1SDavid du Colombier
5333e12c5d1SDavid du Colombier case D_OREG:
5343e12c5d1SDavid du Colombier case D_CONST:
535219b2ee8SDavid du Colombier case D_OCONST:
5363e12c5d1SDavid du Colombier case D_BRANCH:
5373e12c5d1SDavid du Colombier l = a->offset;
5383e12c5d1SDavid du Colombier Bputc(&obuf, l);
5393e12c5d1SDavid du Colombier Bputc(&obuf, l>>8);
5403e12c5d1SDavid du Colombier Bputc(&obuf, l>>16);
5413e12c5d1SDavid du Colombier Bputc(&obuf, l>>24);
5423e12c5d1SDavid du Colombier break;
5433e12c5d1SDavid du Colombier
5443e12c5d1SDavid du Colombier case D_SCONST:
5453e12c5d1SDavid du Colombier n = a->sval;
5463e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) {
5473e12c5d1SDavid du Colombier Bputc(&obuf, *n);
5483e12c5d1SDavid du Colombier n++;
5493e12c5d1SDavid du Colombier }
5503e12c5d1SDavid du Colombier break;
5513e12c5d1SDavid du Colombier
5523e12c5d1SDavid du Colombier case D_FCONST:
5533e12c5d1SDavid du Colombier ieeedtod(&e, a->dval);
5543e12c5d1SDavid du Colombier Bputc(&obuf, e.l);
5553e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>8);
5563e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>16);
5573e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>24);
5583e12c5d1SDavid du Colombier Bputc(&obuf, e.h);
5593e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>8);
5603e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>16);
5613e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>24);
5623e12c5d1SDavid du Colombier break;
5633e12c5d1SDavid du Colombier }
5643e12c5d1SDavid du Colombier }
5653e12c5d1SDavid du Colombier
5663e12c5d1SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)5673e12c5d1SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
5683e12c5d1SDavid du Colombier {
5693e12c5d1SDavid du Colombier int sf, st, t;
5703e12c5d1SDavid du Colombier Sym *s;
5713e12c5d1SDavid du Colombier
5723e12c5d1SDavid du Colombier if(pass == 1)
5733e12c5d1SDavid du Colombier goto out;
5743e12c5d1SDavid du Colombier jackpot:
5753e12c5d1SDavid du Colombier sf = 0;
5763e12c5d1SDavid du Colombier s = g1->sym;
5773e12c5d1SDavid du Colombier while(s != S) {
5783e12c5d1SDavid du Colombier sf = s->sym;
5793e12c5d1SDavid du Colombier if(sf < 0 || sf >= NSYM)
5803e12c5d1SDavid du Colombier sf = 0;
5813e12c5d1SDavid du Colombier t = g1->name;
5823e12c5d1SDavid du Colombier if(h[sf].type == t)
5833e12c5d1SDavid du Colombier if(h[sf].sym == s)
5843e12c5d1SDavid du Colombier break;
5853e12c5d1SDavid du Colombier zname(s->name, t, sym);
5863e12c5d1SDavid du Colombier s->sym = sym;
5873e12c5d1SDavid du Colombier h[sym].sym = s;
5883e12c5d1SDavid du Colombier h[sym].type = t;
5893e12c5d1SDavid du Colombier sf = sym;
5903e12c5d1SDavid du Colombier sym++;
5913e12c5d1SDavid du Colombier if(sym >= NSYM)
5923e12c5d1SDavid du Colombier sym = 1;
5933e12c5d1SDavid du Colombier break;
5943e12c5d1SDavid du Colombier }
5953e12c5d1SDavid du Colombier st = 0;
5963e12c5d1SDavid du Colombier s = g2->sym;
5973e12c5d1SDavid du Colombier while(s != S) {
5983e12c5d1SDavid du Colombier st = s->sym;
5993e12c5d1SDavid du Colombier if(st < 0 || st >= NSYM)
6003e12c5d1SDavid du Colombier st = 0;
6013e12c5d1SDavid du Colombier t = g2->name;
6023e12c5d1SDavid du Colombier if(h[st].type == t)
6033e12c5d1SDavid du Colombier if(h[st].sym == s)
6043e12c5d1SDavid du Colombier break;
6053e12c5d1SDavid du Colombier zname(s->name, t, sym);
6063e12c5d1SDavid du Colombier s->sym = sym;
6073e12c5d1SDavid du Colombier h[sym].sym = s;
6083e12c5d1SDavid du Colombier h[sym].type = t;
6093e12c5d1SDavid du Colombier st = sym;
6103e12c5d1SDavid du Colombier sym++;
6113e12c5d1SDavid du Colombier if(sym >= NSYM)
6123e12c5d1SDavid du Colombier sym = 1;
6133e12c5d1SDavid du Colombier if(st == sf)
6143e12c5d1SDavid du Colombier goto jackpot;
6153e12c5d1SDavid du Colombier break;
6163e12c5d1SDavid du Colombier }
6173e12c5d1SDavid du Colombier Bputc(&obuf, a);
618219b2ee8SDavid du Colombier Bputc(&obuf, reg|nosched);
6193e12c5d1SDavid du Colombier Bputc(&obuf, lineno);
6203e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>8);
6213e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>16);
6223e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>24);
6233e12c5d1SDavid du Colombier zaddr(g1, sf);
6243e12c5d1SDavid du Colombier zaddr(g2, st);
6253e12c5d1SDavid du Colombier
6263e12c5d1SDavid du Colombier out:
6273e12c5d1SDavid du Colombier if(a != AGLOBL && a != ADATA)
6283e12c5d1SDavid du Colombier pc++;
6293e12c5d1SDavid du Colombier }
6303e12c5d1SDavid du Colombier
6313e12c5d1SDavid du Colombier void
outhist(void)6323e12c5d1SDavid du Colombier outhist(void)
6333e12c5d1SDavid du Colombier {
6343e12c5d1SDavid du Colombier Gen g;
6353e12c5d1SDavid du Colombier Hist *h;
6367dd7cddfSDavid du Colombier char *p, *q, *op, c;
6373e12c5d1SDavid du Colombier int n;
6383e12c5d1SDavid du Colombier
6393e12c5d1SDavid du Colombier g = nullgen;
6407dd7cddfSDavid du Colombier c = pathchar();
6413e12c5d1SDavid du Colombier for(h = hist; h != H; h = h->link) {
6423e12c5d1SDavid du Colombier p = h->name;
643219b2ee8SDavid du Colombier op = 0;
644375daca8SDavid du Colombier /* on windows skip drive specifier in pathname */
645375daca8SDavid du Colombier if(systemtype(Windows) && p && p[1] == ':'){
646375daca8SDavid du Colombier p += 2;
647375daca8SDavid du Colombier c = *p;
648375daca8SDavid du Colombier }
6497dd7cddfSDavid du Colombier if(p && p[0] != c && h->offset == 0 && pathname){
6507dd7cddfSDavid du Colombier /* on windows skip drive specifier in pathname */
651375daca8SDavid du Colombier if(systemtype(Windows) && pathname[1] == ':') {
6527dd7cddfSDavid du Colombier op = p;
6537dd7cddfSDavid du Colombier p = pathname+2;
654375daca8SDavid du Colombier c = *p;
6557dd7cddfSDavid du Colombier } else if(pathname[0] == c){
656219b2ee8SDavid du Colombier op = p;
657219b2ee8SDavid du Colombier p = pathname;
658219b2ee8SDavid du Colombier }
6597dd7cddfSDavid du Colombier }
6603e12c5d1SDavid du Colombier while(p) {
6617dd7cddfSDavid du Colombier q = strchr(p, c);
6623e12c5d1SDavid du Colombier if(q) {
6633e12c5d1SDavid du Colombier n = q-p;
664375daca8SDavid du Colombier if(n == 0){
6653e12c5d1SDavid du Colombier n = 1; /* leading "/" */
666375daca8SDavid du Colombier *p = '/'; /* don't emit "\" on windows */
667375daca8SDavid du Colombier }
6683e12c5d1SDavid du Colombier q++;
6693e12c5d1SDavid du Colombier } else {
6703e12c5d1SDavid du Colombier n = strlen(p);
6713e12c5d1SDavid du Colombier q = 0;
6723e12c5d1SDavid du Colombier }
6733e12c5d1SDavid du Colombier if(n) {
674219b2ee8SDavid du Colombier Bputc(&obuf, ANAME);
675219b2ee8SDavid du Colombier Bputc(&obuf, D_FILE); /* type */
676219b2ee8SDavid du Colombier Bputc(&obuf, 1); /* sym */
677219b2ee8SDavid du Colombier Bputc(&obuf, '<');
678219b2ee8SDavid du Colombier Bwrite(&obuf, p, n);
679219b2ee8SDavid du Colombier Bputc(&obuf, 0);
6803e12c5d1SDavid du Colombier }
6813e12c5d1SDavid du Colombier p = q;
682219b2ee8SDavid du Colombier if(p == 0 && op) {
683219b2ee8SDavid du Colombier p = op;
684219b2ee8SDavid du Colombier op = 0;
685219b2ee8SDavid du Colombier }
6863e12c5d1SDavid du Colombier }
6873e12c5d1SDavid du Colombier g.offset = h->offset;
6883e12c5d1SDavid du Colombier
6893e12c5d1SDavid du Colombier Bputc(&obuf, AHISTORY);
6903e12c5d1SDavid du Colombier Bputc(&obuf, 0);
6913e12c5d1SDavid du Colombier Bputc(&obuf, h->line);
6923e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>8);
6933e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>16);
6943e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>24);
6953e12c5d1SDavid du Colombier zaddr(&nullgen, 0);
6963e12c5d1SDavid du Colombier zaddr(&g, 0);
6973e12c5d1SDavid du Colombier }
6983e12c5d1SDavid du Colombier }
6993e12c5d1SDavid du Colombier
7003e12c5d1SDavid du Colombier #include "../cc/lexbody"
7013e12c5d1SDavid du Colombier #include "../cc/macbody"
7027dd7cddfSDavid du Colombier #include "../cc/compat"
703