diff options
Diffstat (limited to 'src/cmd/9a/lex.c')
-rw-r--r-- | src/cmd/9a/lex.c | 726 |
1 files changed, 0 insertions, 726 deletions
diff --git a/src/cmd/9a/lex.c b/src/cmd/9a/lex.c deleted file mode 100644 index ad552370d4..0000000000 --- a/src/cmd/9a/lex.c +++ /dev/null @@ -1,726 +0,0 @@ -// cmd/9a/lex.c from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#define EXTERN -#include <u.h> -#include <libc.h> -#include "a.h" -#include "y.tab.h" - -enum -{ - Plan9 = 1<<0, - Unix = 1<<1, - Windows = 1<<2, -}; - -int -systemtype(int sys) -{ -#ifdef _WIN32 - return sys&Windows; -#else - return sys&Plan9; -#endif -} - -int -pathchar(void) -{ - return '/'; -} - -int -Lconv(Fmt *fp) -{ - return linklinefmt(ctxt, fp); -} - -void -dodef(char *p) -{ - if(nDlist%8 == 0) - Dlist = allocn(Dlist, nDlist*sizeof(char *), - 8*sizeof(char *)); - Dlist[nDlist++] = p; -} - -LinkArch* thelinkarch = &linkppc64; - -void -usage(void) -{ - print("usage: %ca [options] file.c...\n", thechar); - flagprint(1); - errorexit(); -} - -void -main(int argc, char *argv[]) -{ - char *p; - - thechar = '9'; - thestring = "ppc64"; - - // Allow GOARCH=thestring or GOARCH=thestringsuffix, - // but not other values. - p = getgoarch(); - if(strncmp(p, thestring, strlen(thestring)) != 0) - sysfatal("cannot use %cc with GOARCH=%s", thechar, p); - if(strcmp(p, "ppc64le") == 0) - thelinkarch = &linkppc64le; - - ctxt = linknew(thelinkarch); - ctxt->diag = yyerror; - ctxt->bso = &bstdout; - ctxt->enforce_data_order = 1; - Binit(&bstdout, 1, OWRITE); - listinit9(); - fmtinstall('L', Lconv); - - ensuresymb(NSYMB); - memset(debug, 0, sizeof(debug)); - cinit(); - outfile = 0; - setinclude("."); - - flagfn1("D", "name[=value]: add #define", dodef); - flagfn1("I", "dir: add dir to include path", setinclude); - flagcount("S", "print assembly and machine code", &debug['S']); - flagcount("m", "debug preprocessor macros", &debug['m']); - flagstr("o", "file: set output file", &outfile); - flagstr("trimpath", "prefix: remove prefix from recorded source file paths", &ctxt->trimpath); - - flagparse(&argc, &argv, usage); - ctxt->debugasm = debug['S']; - - if(argc < 1) - usage(); - if(argc > 1){ - print("can't assemble multiple files\n"); - errorexit(); - } - - if(assemble(argv[0])) - errorexit(); - Bflush(&bstdout); - if(nerrors > 0) - errorexit(); - exits(0); -} - -int -assemble(char *file) -{ - char *ofile, *p; - int i, of; - - ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar) - strcpy(ofile, file); - p = utfrrune(ofile, pathchar()); - if(p) { - include[0] = ofile; - *p++ = 0; - } else - p = ofile; - if(outfile == 0) { - outfile = p; - if(outfile){ - p = utfrrune(outfile, '.'); - if(p) - if(p[1] == 's' && p[2] == 0) - p[0] = 0; - p = utfrune(outfile, 0); - p[0] = '.'; - p[1] = thechar; - p[2] = 0; - } else - outfile = "/dev/null"; - } - - of = create(outfile, OWRITE, 0664); - if(of < 0) { - yyerror("%ca: cannot create %s", thechar, outfile); - errorexit(); - } - Binit(&obuf, of, OWRITE); - Bprint(&obuf, "go object %s %s %s\n", getgoos(), getgoarch(), getgoversion()); - Bprint(&obuf, "!\n"); - - for(pass = 1; pass <= 2; pass++) { - nosched = 0; - pinit(file); - for(i=0; i<nDlist; i++) - dodefine(Dlist[i]); - yyparse(); - cclean(); - if(nerrors) - return nerrors; - } - - writeobj(ctxt, &obuf); - Bflush(&obuf); - return 0; -} - -struct -{ - char *name; - ushort type; - ushort value; -} itab[] = -{ - "SP", LSP, NAME_AUTO, - "SB", LSB, NAME_EXTERN, - "FP", LFP, NAME_PARAM, - "PC", LPC, TYPE_BRANCH, - - "LR", LLR, REG_LR, - "CTR", LCTR, REG_CTR, - - "XER", LSPREG, REG_XER, - "MSR", LMSR, REG_MSR, - "FPSCR", LFPSCR, REG_FPSCR, - "SPR", LSPR, REG_SPR0, - "DCR", LSPR, REG_DCR0, - - "CR", LCR, REG_CR, - "CR0", LCREG, REG_C0, - "CR1", LCREG, REG_C1, - "CR2", LCREG, REG_C2, - "CR3", LCREG, REG_C3, - "CR4", LCREG, REG_C4, - "CR5", LCREG, REG_C5, - "CR6", LCREG, REG_C6, - "CR7", LCREG, REG_C7, - - "R", LR, 0, - "R0", LREG, REG_R0, - "R1", LREG, REG_R1, - "R2", LREG, REG_R2, - "R3", LREG, REG_R3, - "R4", LREG, REG_R4, - "R5", LREG, REG_R5, - "R6", LREG, REG_R6, - "R7", LREG, REG_R7, - "R8", LREG, REG_R8, - "R9", LREG, REG_R9, - "R10", LREG, REG_R10, - "R11", LREG, REG_R11, - "R12", LREG, REG_R12, - "R13", LREG, REG_R13, - "R14", LREG, REG_R14, - "R15", LREG, REG_R15, - "R16", LREG, REG_R16, - "R17", LREG, REG_R17, - "R18", LREG, REG_R18, - "R19", LREG, REG_R19, - "R20", LREG, REG_R20, - "R21", LREG, REG_R21, - "R22", LREG, REG_R22, - "R23", LREG, REG_R23, - "R24", LREG, REG_R24, - "R25", LREG, REG_R25, - "R26", LREG, REG_R26, - "R27", LREG, REG_R27, - "R28", LREG, REG_R28, - "R29", LREG, REG_R29, - "g", LREG, REG_R30, // avoid unintentionally clobbering g using R30 - "R31", LREG, REG_R31, - - "F", LF, 0, - "F0", LFREG, REG_F0, - "F1", LFREG, REG_F1, - "F2", LFREG, REG_F2, - "F3", LFREG, REG_F3, - "F4", LFREG, REG_F4, - "F5", LFREG, REG_F5, - "F6", LFREG, REG_F6, - "F7", LFREG, REG_F7, - "F8", LFREG, REG_F8, - "F9", LFREG, REG_F9, - "F10", LFREG, REG_F10, - "F11", LFREG, REG_F11, - "F12", LFREG, REG_F12, - "F13", LFREG, REG_F13, - "F14", LFREG, REG_F14, - "F15", LFREG, REG_F15, - "F16", LFREG, REG_F16, - "F17", LFREG, REG_F17, - "F18", LFREG, REG_F18, - "F19", LFREG, REG_F19, - "F20", LFREG, REG_F20, - "F21", LFREG, REG_F21, - "F22", LFREG, REG_F22, - "F23", LFREG, REG_F23, - "F24", LFREG, REG_F24, - "F25", LFREG, REG_F25, - "F26", LFREG, REG_F26, - "F27", LFREG, REG_F27, - "F28", LFREG, REG_F28, - "F29", LFREG, REG_F29, - "F30", LFREG, REG_F30, - "F31", LFREG, REG_F31, - - "CREQV", LCROP, ACREQV, - "CRXOR", LCROP, ACRXOR, - "CRAND", LCROP, ACRAND, - "CROR", LCROP, ACROR, - "CRANDN", LCROP, ACRANDN, - "CRORN", LCROP, ACRORN, - "CRNAND", LCROP, ACRNAND, - "CRNOR", LCROP, ACRNOR, - - "ADD", LADDW, AADD, - "ADDV", LADDW, AADDV, - "ADDCC", LADDW, AADDCC, - "ADDVCC", LADDW, AADDVCC, - "ADDC", LADDW, AADDC, - "ADDCV", LADDW, AADDCV, - "ADDCCC", LADDW, AADDCCC, - "ADDCVCC", LADDW, AADDCVCC, - "ADDE", LLOGW, AADDE, - "ADDEV", LLOGW, AADDEV, - "ADDECC", LLOGW, AADDECC, - "ADDEVCC", LLOGW, AADDEVCC, - - "ADDME", LABS, AADDME, - "ADDMEV", LABS, AADDMEV, - "ADDMECC", LABS, AADDMECC, - "ADDMEVCC", LABS, AADDMEVCC, - "ADDZE", LABS, AADDZE, - "ADDZEV", LABS, AADDZEV, - "ADDZECC", LABS, AADDZECC, - "ADDZEVCC", LABS, AADDZEVCC, - - "SUB", LADDW, ASUB, - "SUBV", LADDW, ASUBV, - "SUBCC", LADDW, ASUBCC, - "SUBVCC", LADDW, ASUBVCC, - "SUBE", LLOGW, ASUBE, - "SUBECC", LLOGW, ASUBECC, - "SUBEV", LLOGW, ASUBEV, - "SUBEVCC", LLOGW, ASUBEVCC, - "SUBC", LADDW, ASUBC, - "SUBCCC", LADDW, ASUBCCC, - "SUBCV", LADDW, ASUBCV, - "SUBCVCC", LADDW, ASUBCVCC, - - "SUBME", LABS, ASUBME, - "SUBMEV", LABS, ASUBMEV, - "SUBMECC", LABS, ASUBMECC, - "SUBMEVCC", LABS, ASUBMEVCC, - "SUBZE", LABS, ASUBZE, - "SUBZEV", LABS, ASUBZEV, - "SUBZECC", LABS, ASUBZECC, - "SUBZEVCC", LABS, ASUBZEVCC, - - "AND", LADDW, AAND, - "ANDCC", LADDW, AANDCC, /* includes andil & andiu */ - "ANDN", LLOGW, AANDN, - "ANDNCC", LLOGW, AANDNCC, - "EQV", LLOGW, AEQV, - "EQVCC", LLOGW, AEQVCC, - "NAND", LLOGW, ANAND, - "NANDCC", LLOGW, ANANDCC, - "NOR", LLOGW, ANOR, - "NORCC", LLOGW, ANORCC, - "OR", LADDW, AOR, /* includes oril & oriu */ - "ORCC", LADDW, AORCC, - "ORN", LLOGW, AORN, - "ORNCC", LLOGW, AORNCC, - "XOR", LADDW, AXOR, /* includes xoril & xoriu */ - "XORCC", LLOGW, AXORCC, - - "EXTSB", LABS, AEXTSB, - "EXTSBCC", LABS, AEXTSBCC, - "EXTSH", LABS, AEXTSH, - "EXTSHCC", LABS, AEXTSHCC, - - "CNTLZW", LABS, ACNTLZW, - "CNTLZWCC", LABS, ACNTLZWCC, - - "RLWMI", LRLWM, ARLWMI, - "RLWMICC", LRLWM, ARLWMICC, - "RLWNM", LRLWM, ARLWNM, - "RLWNMCC", LRLWM, ARLWNMCC, - - "SLW", LSHW, ASLW, - "SLWCC", LSHW, ASLWCC, - "SRW", LSHW, ASRW, - "SRWCC", LSHW, ASRWCC, - "SRAW", LSHW, ASRAW, - "SRAWCC", LSHW, ASRAWCC, - - "BR", LBRA, ABR, - "BC", LBRA, ABC, - "BCL", LBRA, ABC, - "BL", LBRA, ABL, - "BEQ", LBRA, ABEQ, - "BNE", LBRA, ABNE, - "BGT", LBRA, ABGT, - "BGE", LBRA, ABGE, - "BLT", LBRA, ABLT, - "BLE", LBRA, ABLE, - "BVC", LBRA, ABVC, - "BVS", LBRA, ABVS, - - "CMP", LCMP, ACMP, - "CMPU", LCMP, ACMPU, - "CMPW", LCMP, ACMPW, - "CMPWU", LCMP, ACMPWU, - - "DIVW", LLOGW, ADIVW, - "DIVWV", LLOGW, ADIVWV, - "DIVWCC", LLOGW, ADIVWCC, - "DIVWVCC", LLOGW, ADIVWVCC, - "DIVWU", LLOGW, ADIVWU, - "DIVWUV", LLOGW, ADIVWUV, - "DIVWUCC", LLOGW, ADIVWUCC, - "DIVWUVCC", LLOGW, ADIVWUVCC, - - "FABS", LFCONV, AFABS, - "FABSCC", LFCONV, AFABSCC, - "FNEG", LFCONV, AFNEG, - "FNEGCC", LFCONV, AFNEGCC, - "FNABS", LFCONV, AFNABS, - "FNABSCC", LFCONV, AFNABSCC, - - "FADD", LFADD, AFADD, - "FADDCC", LFADD, AFADDCC, - "FSUB", LFADD, AFSUB, - "FSUBCC", LFADD, AFSUBCC, - "FMUL", LFADD, AFMUL, - "FMULCC", LFADD, AFMULCC, - "FDIV", LFADD, AFDIV, - "FDIVCC", LFADD, AFDIVCC, - "FRSP", LFCONV, AFRSP, - "FRSPCC", LFCONV, AFRSPCC, - "FCTIW", LFCONV, AFCTIW, - "FCTIWCC", LFCONV, AFCTIWCC, - "FCTIWZ", LFCONV, AFCTIWZ, - "FCTIWZCC", LFCONV, AFCTIWZCC, - - "FMADD", LFMA, AFMADD, - "FMADDCC", LFMA, AFMADDCC, - "FMSUB", LFMA, AFMSUB, - "FMSUBCC", LFMA, AFMSUBCC, - "FNMADD", LFMA, AFNMADD, - "FNMADDCC", LFMA, AFNMADDCC, - "FNMSUB", LFMA, AFNMSUB, - "FNMSUBCC", LFMA, AFNMSUBCC, - "FMADDS", LFMA, AFMADDS, - "FMADDSCC", LFMA, AFMADDSCC, - "FMSUBS", LFMA, AFMSUBS, - "FMSUBSCC", LFMA, AFMSUBSCC, - "FNMADDS", LFMA, AFNMADDS, - "FNMADDSCC", LFMA, AFNMADDSCC, - "FNMSUBS", LFMA, AFNMSUBS, - "FNMSUBSCC", LFMA, AFNMSUBSCC, - - "FCMPU", LFCMP, AFCMPU, - "FCMPO", LFCMP, AFCMPO, - "MTFSB0", LMTFSB, AMTFSB0, - "MTFSB1", LMTFSB, AMTFSB1, - - "FMOVD", LFMOV, AFMOVD, - "FMOVS", LFMOV, AFMOVS, - "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */ - - "GLOBL", LGLOBL, AGLOBL, - - "MOVB", LMOVB, AMOVB, - "MOVBZ", LMOVB, AMOVBZ, - "MOVBU", LMOVB, AMOVBU, - "MOVBZU", LMOVB, AMOVBZU, - "MOVH", LMOVB, AMOVH, - "MOVHZ", LMOVB, AMOVHZ, - "MOVHU", LMOVB, AMOVHU, - "MOVHZU", LMOVB, AMOVHZU, - "MOVHBR", LXMV, AMOVHBR, - "MOVWBR", LXMV, AMOVWBR, - "MOVW", LMOVW, AMOVW, - "MOVWU", LMOVW, AMOVWU, - "MOVMW", LMOVMW, AMOVMW, - "MOVFL", LMOVW, AMOVFL, - - "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */ - "MULLWV", LLOGW, AMULLWV, - "MULLWCC", LLOGW, AMULLWCC, - "MULLWVCC", LLOGW, AMULLWVCC, - - "MULHW", LLOGW, AMULHW, - "MULHWCC", LLOGW, AMULHWCC, - "MULHWU", LLOGW, AMULHWU, - "MULHWUCC", LLOGW, AMULHWUCC, - - "NEG", LABS, ANEG, - "NEGV", LABS, ANEGV, - "NEGCC", LABS, ANEGCC, - "NEGVCC", LABS, ANEGVCC, - - "NOP", LNOP, ANOP, /* ori 0,0,0 */ - "SYSCALL", LNOP, ASYSCALL, - "UNDEF", LNOP, AUNDEF, - - "RET", LRETRN, ARETURN, - "RETURN", LRETRN, ARETURN, - "RFI", LRETRN, ARFI, - "RFCI", LRETRN, ARFCI, - - "DATA", LDATA, ADATA, - "END", LEND, AEND, - "TEXT", LTEXT, ATEXT, - - /* 64-bit instructions */ - "CNTLZD", LABS, ACNTLZD, - "CNTLZDCC", LABS, ACNTLZDCC, - "DIVD", LLOGW, ADIVD, - "DIVDCC", LLOGW, ADIVDCC, - "DIVDVCC", LLOGW, ADIVDVCC, - "DIVDV", LLOGW, ADIVDV, - "DIVDU", LLOGW, ADIVDU, - "DIVDUCC", LLOGW, ADIVDUCC, - "DIVDUVCC", LLOGW, ADIVDUVCC, - "DIVDUV", LLOGW, ADIVDUV, - "EXTSW", LABS, AEXTSW, - "EXTSWCC", LABS, AEXTSWCC, - "FCTID", LFCONV, AFCTID, - "FCTIDCC", LFCONV, AFCTIDCC, - "FCTIDZ", LFCONV, AFCTIDZ, - "FCTIDZCC", LFCONV, AFCTIDZCC, - "FCFID", LFCONV, AFCFID, - "FCFIDCC", LFCONV, AFCFIDCC, - "LDAR", LXLD, ALDAR, - "MOVD", LMOVW, AMOVD, - "MOVDU", LMOVW, AMOVDU, - "MOVWZ", LMOVW, AMOVWZ, - "MOVWZU", LMOVW, AMOVWZU, - "MULHD", LLOGW, AMULHD, - "MULHDCC", LLOGW, AMULHDCC, - "MULHDU", LLOGW, AMULHDU, - "MULHDUCC", LLOGW, AMULHDUCC, - "MULLD", LADDW, AMULLD, /* includes multiply immediate? */ - "MULLDCC", LLOGW, AMULLDCC, - "MULLDVCC", LLOGW, AMULLDVCC, - "MULLDV", LLOGW, AMULLDV, - "RFID", LRETRN, ARFID, - "HRFID", LRETRN, AHRFID, - "RLDMI", LRLWM, ARLDMI, - "RLDMICC", LRLWM, ARLDMICC, - "RLDC", LRLWM, ARLDC, - "RLDCCC", LRLWM, ARLDCCC, - "RLDCR", LRLWM, ARLDCR, - "RLDCRCC", LRLWM, ARLDCRCC, - "RLDCL", LRLWM, ARLDCL, - "RLDCLCC", LRLWM, ARLDCLCC, - "SLBIA", LNOP, ASLBIA, - "SLBIE", LNOP, ASLBIE, - "SLBMFEE", LABS, ASLBMFEE, - "SLBMFEV", LABS, ASLBMFEV, - "SLBMTE", LABS, ASLBMTE, - "SLD", LSHW, ASLD, - "SLDCC", LSHW, ASLDCC, - "SRD", LSHW, ASRD, - "SRAD", LSHW, ASRAD, - "SRADCC", LSHW, ASRADCC, - "SRDCC", LSHW, ASRDCC, - "STDCCC", LXST, ASTDCCC, - "TD", LADDW, ATD, - - /* pseudo instructions */ - "REM", LLOGW, AREM, - "REMCC", LLOGW, AREMCC, - "REMV", LLOGW, AREMV, - "REMVCC", LLOGW, AREMVCC, - "REMU", LLOGW, AREMU, - "REMUCC", LLOGW, AREMUCC, - "REMUV", LLOGW, AREMUV, - "REMUVCC", LLOGW, AREMUVCC, - "REMD", LLOGW, AREMD, - "REMDCC", LLOGW, AREMDCC, - "REMDV", LLOGW, AREMDV, - "REMDVCC", LLOGW, AREMDVCC, - "REMDU", LLOGW, AREMDU, - "REMDUCC", LLOGW, AREMDUCC, - "REMDUV", LLOGW, AREMDUV, - "REMDUVCC", LLOGW, AREMDUVCC, - -/* special instructions */ - "DCBF", LXOP, ADCBF, - "DCBI", LXOP, ADCBI, - "DCBST", LXOP, ADCBST, - "DCBT", LXOP, ADCBT, - "DCBTST", LXOP, ADCBTST, - "DCBZ", LXOP, ADCBZ, - "ICBI", LXOP, AICBI, - - "ECIWX", LXLD, AECIWX, - "ECOWX", LXST, AECOWX, - "LWAR", LXLD, ALWAR, - "LWAR", LXLD, ALWAR, - "STWCCC", LXST, ASTWCCC, - "EIEIO", LRETRN, AEIEIO, - "TLBIE", LNOP, ATLBIE, - "TLBIEL", LNOP, ATLBIEL, - "LSW", LXLD, ALSW, - "STSW", LXST, ASTSW, - - "ISYNC", LRETRN, AISYNC, - "SYNC", LRETRN, ASYNC, - "TLBSYNC", LRETRN, ATLBSYNC, - "PTESYNC", LRETRN, APTESYNC, -/* "TW", LADDW, ATW,*/ - - "WORD", LWORD, AWORD, - "DWORD", LWORD, ADWORD, - "SCHED", LSCHED, 0, - "NOSCHED", LSCHED, 0x80, - - "PCDATA", LPCDAT, APCDATA, - "FUNCDATA", LFUNCDAT, AFUNCDATA, - - 0 -}; - -void -cinit(void) -{ - Sym *s; - int i; - - nullgen.type = TYPE_NONE; - nullgen.name = NAME_NONE; - nullgen.reg = 0; - nullgen.scale = 0; // replaced Gen.xreg with Prog.scale - - nerrors = 0; - iostack = I; - iofree = I; - peekc = IGN; - nhunk = 0; - for(i=0; i<NHASH; i++) - hash[i] = S; - for(i=0; itab[i].name; i++) { - s = slookup(itab[i].name); - s->type = itab[i].type; - s->value = itab[i].value; - } -} - -void -syminit(Sym *s) -{ - - s->type = LNAME; - s->value = 0; -} - -void -cclean(void) -{ - - outcode(AEND, &nullgen, 0, &nullgen); -} - -void -outcode(int a, Addr *g1, int reg, Addr *g2) -{ - Prog *p; - Plist *pl; - - if(pass == 1) - goto out; - - if(g1->scale != 0) { - if(reg != 0 || g2->scale != 0) - yyerror("bad addressing modes"); - reg = g1->scale; - } else - if(g2->scale != 0) { - if(reg != 0) - yyerror("bad addressing modes"); - reg = g2->scale; - } - - p = emallocz(sizeof(Prog)); - p->as = a; - p->lineno = stmtline; - if(nosched) - p->mark |= NOSCHED; - p->from = *g1; - p->reg = reg; - p->to = *g2; - p->pc = pc; - - if(lastpc == nil) { - pl = linknewplist(ctxt); - pl->firstpc = p; - } else - lastpc->link = p; - lastpc = p; -out: - if(a != AGLOBL && a != ADATA) - pc++; -} - -void -outgcode(int a, Addr *g1, int reg, Addr *g2, Addr *g3) -{ - Prog *p; - Plist *pl; - - if(pass == 1) - goto out; - - p = emallocz(sizeof(Prog)); - p->as = a; - p->lineno = stmtline; - if(nosched) - p->mark |= NOSCHED; - p->from = *g1; - p->reg = reg; - p->from3 = *g2; - p->to = *g3; - p->pc = pc; - - if(lastpc == nil) { - pl = linknewplist(ctxt); - pl->firstpc = p; - } else - lastpc->link = p; - lastpc = p; -out: - if(a != AGLOBL && a != ADATA) - pc++; -} - -#include "../cc/lexbody" -#include "../cc/macbody" |