ref: 88181e1c5c8d19e61c76b93620abcbc7c2e57481
dir: /sys/src/cmd/7a/lex.c/
#define EXTERN #include "a.h" #include "y.tab.h" #include <ctype.h> void main(int argc, char *argv[]) { char *p; int nout, nproc, status, i, c; thechar = '7'; thestring = "arm64"; memset(debug, 0, sizeof(debug)); cinit(); outfile = 0; include[ninclude++] = "."; ARGBEGIN { default: c = ARGC(); if(c >= 0 || c < sizeof(debug)) debug[c] = 1; break; case 'o': outfile = ARGF(); break; case 'D': p = ARGF(); if(p) Dlist[nDlist++] = p; break; case 'I': p = ARGF(); setinclude(p); break; } ARGEND if(*argv == 0) { print("usage: %Ca [-options] file.s\n", thechar); errorexit(); } if(argc > 1 && systemtype(Windows)){ print("can't assemble multiple files on windows\n"); errorexit(); } if(argc > 1 && !systemtype(Windows)) { nproc = 1; if(p = getenv("NPROC")) nproc = atol(p); /* */ c = 0; nout = 0; for(;;) { while(nout < nproc && argc > 0) { i = myfork(); if(i < 0) { i = mywait(&status); if(i < 0) errorexit(); if(status) c++; nout--; continue; } if(i == 0) { print("%s:\n", *argv); if(assemble(*argv)) errorexit(); exits(0); } nout++; argc--; argv++; } i = mywait(&status); if(i < 0) { if(c) errorexit(); exits(0); } if(status) c++; nout--; } } if(assemble(argv[0])) errorexit(); exits(0); } int assemble(char *file) { char *ofile, *p; int i, of; ofile = strdup(file); p = utfrrune(ofile, pathchar()); if(p) { include[0] = ofile; *p++ = 0; } else p = ofile; if(outfile == 0) { if(p){ outfile = p; p = utfrrune(outfile, '.'); if(p) if(p[1] == 's' && p[2] == 0) p[0] = 0; outfile = smprint("%s.%C", outfile, thechar); } else outfile = "/dev/null"; } p = getenv("INCLUDE"); if(p) { setinclude(p); } else { if(systemtype(Plan9)) setinclude(smprint("/%s/include", thestring)); } of = mycreat(outfile, 0664); if(of < 0) { yyerror("%Ca: cannot create %s", thechar, outfile); errorexit(); } Binit(&obuf, of, OWRITE); pass = 1; pinit(file); for(i=0; i<nDlist; i++) dodefine(Dlist[i]); yyparse(); if(nerrors) { cclean(); return nerrors; } pass = 2; outhist(); pinit(file); for(i=0; i<nDlist; i++) dodefine(Dlist[i]); yyparse(); cclean(); return nerrors; } struct { char *name; ushort type; ulong value; } itab[] = { "SP", LSP, D_AUTO, "SB", LSB, D_EXTERN, "FP", LFP, D_PARAM, "PC", LPC, D_BRANCH, "R", LR, 0, "R0", LREG, 0, "R1", LREG, 1, "R2", LREG, 2, "R3", LREG, 3, "R4", LREG, 4, "R5", LREG, 5, "R6", LREG, 6, "R7", LREG, 7, "R8", LREG, 8, "R9", LREG, 9, "R10", LREG, 10, "R11", LREG, 11, "R12", LREG, 12, "R13", LREG, 13, "R14", LREG, 14, "R15", LREG, 15, "R16", LREG, 16, "R17", LREG, 17, "R18", LREG, 18, "R19", LREG, 19, "R20", LREG, 20, "R21", LREG, 21, "R22", LREG, 22, "R23", LREG, 23, "R24", LREG, 24, "R25", LREG, 25, "R26", LREG, 26, "R27", LREG, 27, "R28", LREG, 28, "R29", LREG, 29, "R30", LREG, 30, "LR", LREG, 30, "ZR", LREG, 31, "RARG", LREG, REGARG, "RARG0", LREG, REGARG, "RSP", LREG, 31, "F", LF, 0, "F0", LFREG, 0, "F1", LFREG, 1, "F2", LFREG, 2, "F3", LFREG, 3, "F4", LFREG, 4, "F5", LFREG, 5, "F6", LFREG, 6, "F7", LFREG, 7, "F8", LFREG, 8, "F9", LFREG, 9, "F10", LFREG, 10, "F11", LFREG, 11, "F12", LFREG, 12, "F13", LFREG, 13, "F14", LFREG, 14, "F15", LFREG, 15, "F16", LFREG, 16, "F17", LFREG, 17, "F18", LFREG, 18, "F19", LFREG, 19, "F20", LFREG, 20, "F21", LFREG, 21, "F22", LFREG, 22, "F23", LFREG, 23, "F24", LFREG, 24, "F25", LFREG, 25, "F26", LFREG, 26, "F27", LFREG, 27, "F28", LFREG, 28, "F29", LFREG, 29, "F30", LFREG, 30, "F31", LFREG, 31, "V", LV, 0, "V0", LVREG, 0, "V1", LVREG, 1, "V2", LVREG, 2, "V3", LVREG, 3, "V4", LVREG, 4, "V5", LVREG, 5, "V6", LVREG, 6, "V7", LVREG, 7, "V8", LVREG, 8, "V9", LVREG, 9, "V10", LVREG, 10, "V11", LVREG, 11, "V12", LVREG, 12, "V13", LVREG, 13, "V14", LVREG, 14, "V15", LVREG, 15, "V16", LVREG, 16, "V17", LVREG, 17, "V18", LVREG, 18, "V19", LVREG, 19, "V20", LVREG, 20, "V21", LVREG, 21, "V22", LVREG, 22, "V23", LVREG, 23, "V24", LVREG, 24, "V25", LVREG, 25, "V26", LVREG, 26, "V27", LVREG, 27, "V28", LVREG, 28, "V29", LVREG, 29, "V30", LVREG, 30, "V31", LVREG, 31, "FPSR", LFCR, D_FPSR, "FPCR", LFCR, D_FPCR, "SPR", LSPR, D_SPR, "NZCV", LSPREG, D_NZCV, "ELR_EL1", LSPREG, D_ELR_EL1, "ELR_EL2", LSPREG, D_ELR_EL2, // "ELR_EL3", LSPREG, D_ELR_EL3, // "LR_EL0", LSPREG, D_LR_EL0, "DAIF", LSPREG, D_DAIF, "CurrentEL", LSPREG, D_CurrentEL, "SP_EL0", LSPREG, D_SP_EL0, // "SP_EL1", LSPREG, D_SP_EL1, // "SP_EL2", LSPREG, D_SP_EL2, "SPSel", LSPREG, D_SPSel, // "SPSR_abt", LSPREG, D_SPSR_abt, "SPSR_EL1", LSPREG, D_SPSR_EL1, "SPSR_EL2", LSPREG, D_SPSR_EL2, // "SPSR_EL3", LSPREG, D_SPSR_EL3, // "SPSR_fiq", LSPREG, D_SPSR_fiq, // "SPSR_ieq", LSPREG, D_SPSR_ieq, // "SPSR_und", LSPREG, D_SPSR_und, "DAIFSet", LSPREG, D_DAIFSet, "DAIFClr", LSPREG, D_DAIFClr, "EQ", LCOND, 0, "NE", LCOND, 1, "CS", LCOND, 2, "HS", LCOND, 2, "CC", LCOND, 3, "LO", LCOND, 3, "MI", LCOND, 4, "PL", LCOND, 5, "VS", LCOND, 6, "VC", LCOND, 7, "HI", LCOND, 8, "LS", LCOND, 9, "GE", LCOND, 10, "LT", LCOND, 11, "GT", LCOND, 12, "LE", LCOND, 13, "AL", LCOND, 14, ".UXTB", LEXT, 0, ".UXTH", LEXT, 1, ".UXTW", LEXT, 2, ".UXTX", LEXT, 3, ".SXTB", LEXT, 4, ".SXTH", LEXT, 5, ".SXTW", LEXT, 6, ".SXTX", LEXT, 7, ".UB", LEXT, 0, ".UH", LEXT, 1, ".UW", LEXT, 2, ".UX", LEXT, 3, ".SB", LEXT, 4, ".SH", LEXT, 5, ".SW", LEXT, 6, ".SX", LEXT, 7, "@", LAT, 0, "ADC", LTYPE1, AADC, "ADCS", LTYPE1, AADCS, "ADCSW", LTYPE1, AADCSW, "ADCW", LTYPE1, AADCW, "ADD", LTYPE1, AADD, "ADDS", LTYPE1, AADDS, "ADDSW", LTYPE1, AADDSW, "ADDW", LTYPE1, AADDW, "ADR", LTYPEV, AADR, "ADRP", LTYPEV, AADRP, "AND", LTYPE1, AAND, "ANDS", LTYPE1, AANDS, "ANDSW", LTYPE1, AANDSW, "ANDW", LTYPE1, AANDW, "ASR", LTYPE1, AASR, "ASRW", LTYPE1, AASRW, "AT", LTYPEN, AAT, "BFI", LTYPEY, ABFI, "BFIW", LTYPEY, ABFIW, "BFM", LTYPEY, ABFM, "BFMW", LTYPEY, ABFMW, "BFXIL", LTYPEY, ABFXIL, "BFXILW", LTYPEY, ABFXILW, "BIC", LTYPE1, ABIC, "BICS", LTYPE1, ABICS, "BICSW", LTYPE1, ABICSW, "BICW", LTYPE1, ABICW, "BRK", LTYPE6, ABRK, "CBNZ", LTYPE8, ACBNZ, "CBNZW", LTYPE8, ACBNZW, "CBZ", LTYPE8, ACBZ, "CBZW", LTYPE8, ACBZW, "CCMN", LTYPEU, ACCMN, "CCMNW", LTYPEU, ACCMNW, "CCMP", LTYPEU, ACCMP, "CCMPW", LTYPEU, ACCMPW, "CINC", LTYPES, ACINC, "CINCW", LTYPES, ACINCW, "CINV", LTYPES, ACINV, "CINVW", LTYPES, ACINVW, "CLREX", LTYPE6, ACLREX, "CLS", LTYPE2, ACLS, "CLSW", LTYPE2, ACLSW, "CLZ", LTYPE2, ACLZ, "CLZW", LTYPE2, ACLZW, "CMN", LTYPE7, ACMN, "CMNW", LTYPE7, ACMNW, "CMP", LTYPE7, ACMP, "CMPW", LTYPE7, ACMPW, "CNEG", LTYPES, ACNEG, "CNEGW", LTYPES, ACNEGW, "CRC32B", LTYPE1, ACRC32B, "CRC32CB", LTYPE1, ACRC32CB, "CRC32CH", LTYPE1, ACRC32CH, "CRC32CW", LTYPE1, ACRC32CW, "CRC32CX", LTYPE1, ACRC32CX, "CRC32H", LTYPE1, ACRC32H, "CRC32W", LTYPE1, ACRC32W, "CRC32X", LTYPE1, ACRC32X, "CSEL", LTYPES, ACSEL, "CSELW", LTYPES, ACSELW, "CSET", LTYPER, ACSET, "CSETM", LTYPER, ACSETM, "CSETMW", LTYPER, ACSETMW, "CSETW", LTYPER, ACSETW, "CSINC", LTYPES, ACSINC, "CSINCW", LTYPES, ACSINCW, "CSINV", LTYPES, ACSINV, "CSINVW", LTYPES, ACSINVW, "CSNEG", LTYPES, ACSNEG, "CSNEGW", LTYPES, ACSNEGW, "DC", LTYPEN, ADC, "DCPS1", LTYPE6, ADCPS1, "DCPS2", LTYPE6, ADCPS2, "DCPS3", LTYPE6, ADCPS3, "DMB", LDMB, ADMB, "DRPS", LTYPE6, ADRPS, "DSB", LDMB, ADSB, "EON", LTYPE1, AEON, "EONW", LTYPE1, AEONW, "EOR", LTYPE1, AEOR, "EORW", LTYPE1, AEORW, "ERET", LTYPE0, AERET, "EXTR", LTYPEP, AEXTR, "EXTRW", LTYPEP, AEXTRW, "HINT", LDMB, AHINT, "HLT", LTYPE6, AHLT, "HVC", LTYPE6, AHVC, "IC", LTYPEN, AIC, "ISB", LDMB, AISB, "LSL", LTYPE1, ALSL, "LSLW", LTYPE1, ALSLW, "LSR", LTYPE1, ALSR, "LSRW", LTYPE1, ALSRW, "MADD", LTYPEM, AMADD, "MADDW", LTYPEM, AMADDW, "MNEG", LTYPE1, AMNEG, "MNEGW", LTYPE1, AMNEGW, "MRS", LTYPE3, AMRS, "MSR", LTYPE3, AMSR, "MSUB", LTYPEM, AMSUB, "MSUBW", LTYPEM, AMSUBW, "MUL", LTYPE1, AMUL, "MULW", LTYPE1, AMULW, "MVN", LTYPE1, AMVN, "MVNW", LTYPE1, AMVNW, "NEG", LTYPE1, ANEG, "NEGS", LTYPE1, ANEGS, "NEGSW", LTYPE1, ANEGSW, "NEGW", LTYPE1, ANEGW, "NGC", LTYPE2, ANGC, "NGCS", LTYPE2, ANGCS, "NGCSW", LTYPE2, ANGCSW, "NGCW", LTYPE2, ANGCW, "ORN", LTYPE1, AORN, "ORNW", LTYPE1, AORNW, "ORR", LTYPE1, AORR, "ORRW", LTYPE1, AORRW, "PRFM", LTYPE1, APRFM, "PRFUM", LTYPE1, APRFUM, "RBIT", LTYPE2, ARBIT, "RBITW", LTYPE2, ARBITW, "REM", LTYPE1, AREM, "REMW", LTYPE1, AREMW, "RET", LTYPEA, ARET, "REV", LTYPE2, AREV, "REV16", LTYPE2, AREV16, "REV16W", LTYPE2, AREV16W, "REV32", LTYPE2, AREV32, "REVW", LTYPE2, AREVW, "ROR", LTYPE1, AROR, "RORW", LTYPE1, ARORW, "SBC", LTYPE1, ASBC, "SBCS", LTYPE1, ASBCS, "SBCSW", LTYPE1, ASBCSW, "SBCW", LTYPE1, ASBCW, "SBFIZ", LTYPEY, ASBFIZ, "SBFIZW", LTYPEY, ASBFIZW, "SBFM", LTYPEY, ASBFM, "SBFMW", LTYPEY, ASBFMW, "SBFX", LTYPEY, ASBFX, "SBFXW", LTYPEY, ASBFXW, "SDIV", LTYPE1, ASDIV, "SDIVW", LTYPE1, ASDIVW, "SEV", LTYPE0, ASEV, "SEVL", LTYPE0, ASEVL, "SMADDL", LTYPEM, ASMADDL, "SMC", LTYPE6, ASMC, "SMNEGL", LTYPE1, ASMNEGL, "SMSUBL", LTYPEM, ASMSUBL, "SMULH", LTYPE1, ASMULH, "SMULL", LTYPE1, ASMULL, "STLR", LSTXR, ASTLR, "STLRB", LSTXR, ASTLRB, "STLRH", LSTXR, ASTLRH, "STLRW", LSTXR, ASTLRW, "STLXP", LSTXR, ASTLXP, "STLXR", LSTXR, ASTLXR, "STLXRB", LSTXR, ASTLXRB, "STLXRH", LSTXR, ASTLXRH, "STLXRW", LSTXR, ASTLXRW, "STXR", LSTXR, ASTXR, "STXRB", LSTXR, ASTXRB, "STXRH", LSTXR, ASTXRH, "STXP", LSTXR, ASTXP, "STXPW", LSTXR, ASTXPW, "STXRW", LSTXR, ASTXRW, "SUB", LTYPE1, ASUB, "SUBS", LTYPE1, ASUBS, "SUBSW", LTYPE1, ASUBSW, "SUBW", LTYPE1, ASUBW, "SVC", LTYPE6, ASVC, "SXTB", LTYPE2, ASXTB, "SXTBW", LTYPE2, ASXTBW, "SXTH", LTYPE2, ASXTH, "SXTHW", LTYPE2, ASXTHW, "SXTW", LTYPE2, ASXTW, "SYS", LTYPEN, ASYS, "SYSL", LTYPEO, ASYSL, "TBNZ", LTYPET, ATBNZ, "TBZ", LTYPET, ATBZ, "TLBI", LTYPEN, ATLBI, "TST", LTYPE7, ATST, "TSTW", LTYPE7, ATSTW, "UBFIZ", LTYPEY, AUBFIZ, "UBFIZW", LTYPEY, AUBFIZW, "UBFM", LTYPEY, AUBFM, "UBFMW", LTYPEY, AUBFMW, "UBFX", LTYPEY, AUBFX, "UBFXW", LTYPEY, AUBFXW, "UDIV", LTYPE1, AUDIV, "UDIVW", LTYPE1, AUDIVW, "UMADDL", LTYPEM, AUMADDL, "UMNEGL", LTYPE1, AUMNEGL, "UMSUBL", LTYPEM, AUMSUBL, "UMULH", LTYPE1, AUMULH, "UMULL", LTYPE1, AUMULL, "UREM", LTYPE1, AUREM, "UREMW", LTYPE1, AUREMW, "UXTB", LTYPE2, AUXTB, "UXTH", LTYPE2, AUXTH, "UXTBW", LTYPE2, AUXTBW, "UXTHW", LTYPE2, AUXTHW, "UXTW", LTYPE2, AUXTW, "WFE", LTYPE0, AWFE, "WFI", LTYPE0, AWFI, "YIELD", LTYPE0, AYIELD, "LDXR", LTYPE3, ALDXR, "LDXRB", LTYPE3, ALDXRB, "LDXRH", LTYPE3, ALDXRH, "LDXRW", LTYPE3, ALDXRW, "LDAR", LTYPE3, ALDAR, "LDARB", LTYPE3, ALDARB, "LDARH", LTYPE3, ALDARH, "LDARW", LTYPE3, ALDARW, "LDXP", LTYPE3, ALDXP, "LDXPW", LTYPE3, ALDXPW, "LDAXP", LTYPE3, ALDAXP, "LDAXPW", LTYPE3, ALDAXPW, "LDAXR", LTYPE3, ALDAXR, "LDAXRB", LTYPE3, ALDAXRB, "LDAXRH", LTYPE3, ALDAXRH, "LDAXRW", LTYPE3, ALDAXRW, "MOVK", LMOVK, AMOVK, "MOVKW", LMOVK, AMOVKW, "MOVN", LMOVK, AMOVN, "MOVNW", LMOVK, AMOVNW, "MOVZ", LMOVK, AMOVZ, "MOVZW", LMOVK, AMOVZW, "MOVB", LTYPE3, AMOVB, "MOVBU", LTYPE3, AMOVBU, "MOVH", LTYPE3, AMOVH, "MOVHU", LTYPE3, AMOVHU, "MOVW", LTYPE3, AMOVW, "MOVWU", LTYPE3, AMOVWU, "MOV", LTYPE3, AMOV, "MOVP", LTYPEJ, AMOVP, "MOVPD", LTYPEJ, AMOVPD, "MOVPQ", LTYPEJ, AMOVPQ, "MOVPS", LTYPEJ, AMOVPS, "MOVPSW", LTYPEJ, AMOVPSW, "MOVPW", LTYPEJ, AMOVPW, "MOVNP", LTYPEJ, AMOVNP, "MOVNPW", LTYPEJ, AMOVNPW, "FMOVD", LTYPE3, AFMOVD, "FMOVS", LTYPE3, AFMOVS, "SCVTFD", LTYPE3, ASCVTFD, "SCVTFS", LTYPE3, ASCVTFS, "SCVTFWD", LTYPE3, ASCVTFWD, "SCVTFWS", LTYPE3, ASCVTFWS, "UCVTFD", LTYPE3, AUCVTFD, "UCVTFS", LTYPE3, AUCVTFS, "UCVTFWD", LTYPE3, AUCVTFWD, "UCVTFWS", LTYPE3, AUCVTFWS, "FCVTSD", LTYPE3, AFCVTSD, "FCVTDS", LTYPE3, AFCVTDS, "FCVTZSD", LTYPE3, AFCVTZSD, "FCVTZSDW", LTYPE3, AFCVTZSDW, "FCVTZSS", LTYPE3, AFCVTZSS, "FCVTZSSW", LTYPE3, AFCVTZSSW, "FCVTZUD", LTYPE3, AFCVTZUD, "FCVTZUDW", LTYPE3, AFCVTZUDW, "FCVTZUS", LTYPE3, AFCVTZUS, "FCVTZUSW", LTYPE3, AFCVTZUSW, "FCMPS", LTYPEL, AFCMPS, "FCMPD", LTYPEL, AFCMPD, "FCMPES", LTYPEL, AFCMPES, "FCMPED", LTYPEL, AFCMPED, "FCCMPS", LTYPEF, AFCCMPS, "FCCMPD", LTYPEF, AFCCMPD, "FCCMPES", LTYPEF, AFCCMPES, "FCCMPED", LTYPEF, AFCCMPED, "FADDS", LTYPEK, AFADDS, "FADDD", LTYPEK, AFADDD, "FSUBS", LTYPEK, AFSUBS, "FSUBD", LTYPEK, AFSUBD, "FMULS", LTYPEK, AFMULS, "FMULD", LTYPEK, AFMULD, "FDIVS", LTYPEK, AFDIVS, "FDIVD", LTYPEK, AFDIVD, "FCSELS", LFCSEL, AFCSELS, "FCSELD", LFCSEL, AFCSELD, "FMAXS", LTYPEK, AFMAXS, "FMINS", LTYPEK, AFMINS, "FMAXD", LTYPEK, AFMAXD, "FMIND", LTYPEK, AFMIND, "FMAXNMS", LTYPEK, AFMAXNMS, "FMAXNMD", LTYPEK, AFMAXNMD, "FMINNMS", LTYPEK, AFMINNMS, "FMINNMD", LTYPEK, AFMINNMD, "FNMULS", LTYPEK, AFNMULS, "FNMULD", LTYPEK, AFNMULD, "FRINTNS", LTYPE3, AFRINTNS, "FRINTND", LTYPE3, AFRINTND, "FRINTPS", LTYPE3, AFRINTPS, "FRINTPD", LTYPE3, AFRINTPD, "FRINTMS", LTYPE3, AFRINTMS, "FRINTMD", LTYPE3, AFRINTMD, "FRINTZS", LTYPE3, AFRINTZS, "FRINTZD", LTYPE3, AFRINTZD, "FRINTAS", LTYPE3, AFRINTAS, "FRINTAD", LTYPE3, AFRINTAD, "FRINTXS", LTYPE3, AFRINTXS, "FRINTXD", LTYPE3, AFRINTXD, "FRINTIS", LTYPE3, AFRINTIS, "FRINTID", LTYPE3, AFRINTID, "FMADDS", LTYPEM, AFMADDS, "FMADDD", LTYPEM, AFMADDD, "FMSUBS", LTYPEM, AFMSUBS, "FMSUBD", LTYPEM, AFMSUBD, "FNMADDS", LTYPEM, AFNMADDS, "FNMADDD", LTYPEM, AFNMADDD, "FNMSUBS", LTYPEM, AFNMSUBS, "FNMSUBD", LTYPEM, AFNMSUBD, "FABSS", LTYPE3, AFABSS, "FABSD", LTYPE3, AFABSD, "FNEGS", LTYPE3, AFNEGS, "FNEGD", LTYPE3, AFNEGD, "FSQRTS", LTYPE3, AFSQRTS, "FSQRTD", LTYPE3, AFSQRTD, "FCVTDH", LTYPE3, AFCVTDH, "FCVTHS", LTYPE3, AFCVTHS, "FCVTHD", LTYPE3, AFCVTHD, "FCVTSH", LTYPE3, AFCVTSH, "AESD", LTYPEW, AAESD, "AESE", LTYPEW, AAESE, "AESIMC", LTYPEW, AAESIMC, "AESMC", LTYPEW, AAESMC, "SHA1C", LTYPEW, ASHA1C, "SHA1H", LTYPEW, ASHA1H, "SHA1M", LTYPEW, ASHA1M, "SHA1P", LTYPEW, ASHA1P, "SHA1SU0", LTYPEW, ASHA1SU0, "SHA1SU1", LTYPEW, ASHA1SU1, "SHA256H", LTYPEW, ASHA256H, "SHA256H2", LTYPEW, ASHA256H2, "SHA256SU0", LTYPEW, ASHA256SU0, "SHA256SU1", LTYPEW, ASHA256SU1, "B", LTYPE4, AB, "BL", LTYPE4, ABL, "BEQ", LTYPE5, ABEQ, "BNE", LTYPE5, ABNE, "BCS", LTYPE5, ABCS, "BHS", LTYPE5, ABHS, "BCC", LTYPE5, ABCC, "BLO", LTYPE5, ABLO, "BMI", LTYPE5, ABMI, "BPL", LTYPE5, ABPL, "BVS", LTYPE5, ABVS, "BVC", LTYPE5, ABVC, "BHI", LTYPE5, ABHI, "BLS", LTYPE5, ABLS, "BGE", LTYPE5, ABGE, "BLT", LTYPE5, ABLT, "BGT", LTYPE5, ABGT, "BLE", LTYPE5, ABLE, "BCASE", LTYPE5, ABCASE, "TEXT", LTYPEB, ATEXT, "GLOBL", LTYPEB, AGLOBL, "DATA", LTYPEC, ADATA, "CASE", LTYPED, ACASE, "END", LTYPEE, AEND, "WORD", LTYPEH, AWORD, "DWORD", LTYPEH, ADWORD, "NOP", LTYPEQ, ANOP, "RETURN", LTYPEA, ARETURN, 0 }; void cinit(void) { Sym *s; int i; nullgen.sym = S; nullgen.offset = 0; nullgen.type = D_NONE; nullgen.name = D_NONE; nullgen.reg = NREG; nullgen.xreg = NREG; if(FPCHIP) nullgen.dval = 0; for(i=0; i<sizeof(nullgen.sval); i++) nullgen.sval[i] = 0; nerrors = 0; iostack = I; iofree = I; peekc = IGN; for(i=0; i<NHASH; i++) hash[i] = S; for(i=0; itab[i].name; i++) { s = slookup(itab[i].name); if(s->value != 0) yyerror("internal: duplicate %s", s->name); s->type = itab[i].type; s->value = itab[i].value; } pathname = allocn(pathname, 0, 100); if(getwd(pathname, 99) == 0) { pathname = allocn(pathname, 100, 900); if(getwd(pathname, 999) == 0) strcpy(pathname, "/???"); } } void syminit(Sym *s) { s->type = LNAME; s->value = 0; } void cclean(void) { outcode(AEND, &nullgen, NREG, &nullgen); Bflush(&obuf); } void zname(char *n, int t, int s) { Bputc(&obuf, ANAME); Bputc(&obuf, ANAME>>8); Bputc(&obuf, t); /* type */ Bputc(&obuf, s); /* sym */ while(*n) { Bputc(&obuf, *n); n++; } Bputc(&obuf, 0); } void zaddr(Gen *a, int s) { long l; int i; char *n; Ieee e; if(a->type == D_CONST){ l = a->offset; if((vlong)l != a->offset) a->type = D_DCONST; } Bputc(&obuf, a->type); Bputc(&obuf, a->reg); Bputc(&obuf, s); Bputc(&obuf, a->name); switch(a->type) { default: print("unknown type %d\n", a->type); exits("arg"); case D_NONE: case D_REG: case D_SP: case D_FREG: case D_VREG: case D_COND: break; case D_DCONST: l = a->offset; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); l = a->offset>>32; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); break; case D_OREG: case D_XPRE: case D_XPOST: case D_CONST: case D_BRANCH: case D_SHIFT: case D_EXTREG: case D_ROFF: case D_SPR: l = a->offset; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); break; case D_SCONST: n = a->sval; for(i=0; i<NSNAME; i++) { Bputc(&obuf, *n); n++; } break; case D_FCONST: ieeedtod(&e, a->dval); Bputc(&obuf, e.l); Bputc(&obuf, e.l>>8); Bputc(&obuf, e.l>>16); Bputc(&obuf, e.l>>24); Bputc(&obuf, e.h); Bputc(&obuf, e.h>>8); Bputc(&obuf, e.h>>16); Bputc(&obuf, e.h>>24); break; } } static int outsim(Gen *g) { Sym *s; int sno, t; s = g->sym; if(s == S) return 0; sno = s->sym; if(sno < 0 || sno >= NSYM) sno = 0; t = g->name; if(h[sno].type == t && h[sno].sym == s) return sno; zname(s->name, t, sym); s->sym = sym; h[sym].sym = s; h[sym].type = t; sno = sym; sym++; if(sym >= NSYM) sym = 1; return sno; } void outcode(int a, Gen *g1, int reg, Gen *g2) { int sf, st; if(a != AGLOBL && a != ADATA) pc++; if(pass == 1) return; do{ sf = outsim(g1); st = outsim(g2); } while(sf != 0 && st == sf); Bputc(&obuf, a); Bputc(&obuf, a>>8); Bputc(&obuf, reg); Bputc(&obuf, lineno); Bputc(&obuf, lineno>>8); Bputc(&obuf, lineno>>16); Bputc(&obuf, lineno>>24); zaddr(g1, sf); zaddr(g2, st); } void outcode4(int a, Gen *g1, int reg, Gen *g2, Gen *g3) { int s1, s2, s3, flag; if(a != AGLOBL && a != ADATA) pc++; if(pass == 1) return; do{ s1 = outsim(g1); s2 = outsim(g2); s3 = outsim(g3); } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3)); flag = 0; if(g2->type != D_NONE) flag = 0x40; /* flags extra operand */ Bputc(&obuf, a); Bputc(&obuf, a>>8); Bputc(&obuf, reg | flag); Bputc(&obuf, lineno); Bputc(&obuf, lineno>>8); Bputc(&obuf, lineno>>16); Bputc(&obuf, lineno>>24); zaddr(g1, s1); if(flag) zaddr(g2, s2); zaddr(g3, s3); } void outhist(void) { Gen g; Hist *h; char *p, *q, *op, c; int n; g = nullgen; c = pathchar(); for(h = hist; h != H; h = h->link) { p = h->name; op = 0; /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && p && p[1] == ':'){ p += 2; c = *p; } if(p && p[0] != c && h->offset == 0 && pathname){ /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && pathname[1] == ':') { op = p; p = pathname+2; c = *p; } else if(pathname[0] == c){ op = p; p = pathname; } } while(p) { q = strchr(p, c); if(q) { n = q-p; if(n == 0){ n = 1; /* leading "/" */ *p = '/'; /* don't emit "\" on windows */ } q++; } else { n = strlen(p); q = 0; } if(n) { Bputc(&obuf, ANAME); Bputc(&obuf, ANAME>>8); Bputc(&obuf, D_FILE); /* type */ Bputc(&obuf, 1); /* sym */ Bputc(&obuf, '<'); Bwrite(&obuf, p, n); Bputc(&obuf, 0); } p = q; if(p == 0 && op) { p = op; op = 0; } } g.offset = h->offset; Bputc(&obuf, AHISTORY); Bputc(&obuf, AHISTORY>>8); Bputc(&obuf, 0); Bputc(&obuf, h->line); Bputc(&obuf, h->line>>8); Bputc(&obuf, h->line>>16); Bputc(&obuf, h->line>>24); zaddr(&nullgen, 0); zaddr(&g, 0); } } #include "../cc/lexbody" #include "../cc/macbody" #include "../cc/compat"