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