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