diff options
Diffstat (limited to 'src/cmd/8a/lex.c')
-rw-r--r-- | src/cmd/8a/lex.c | 971 |
1 files changed, 0 insertions, 971 deletions
diff --git a/src/cmd/8a/lex.c b/src/cmd/8a/lex.c deleted file mode 100644 index ab4de417a..000000000 --- a/src/cmd/8a/lex.c +++ /dev/null @@ -1,971 +0,0 @@ -// Inferno utils/8a/lex.c -// http://code.google.com/p/inferno-os/source/browse/utils/8a/lex.c -// -// 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-2007 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-2007 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) -{ - return sys&Plan9; -} - -int -pathchar(void) -{ - return '/'; -} - -void -main(int argc, char *argv[]) -{ - char *p; - int c; - - thechar = '8'; - thestring = "386"; - - ensuresymb(NSYMB); - memset(debug, 0, sizeof(debug)); - cinit(); - outfile = 0; - setinclude("."); - 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) { - if (nDlist%8 == 0) - Dlist = allocn(Dlist, nDlist*sizeof(char *), - 8*sizeof(char *)); - 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){ - print("can't assemble multiple files\n"); - errorexit(); - } - if(assemble(argv[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); - - pass = 1; - pinit(file); - - Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion()); - - for(i=0; i<nDlist; i++) - dodefine(Dlist[i]); - yyparse(); - if(nerrors) { - cclean(); - return nerrors; - } - - Bprint(&obuf, "\n!\n"); - - pass = 2; - outhist(); - pinit(file); - for(i=0; i<nDlist; i++) - dodefine(Dlist[i]); - yyparse(); - cclean(); - return nerrors; -} - -struct -{ - char *name; - ushort type; - ushort value; -} itab[] = -{ - "SP", LSP, D_AUTO, - "SB", LSB, D_EXTERN, - "FP", LFP, D_PARAM, - "PC", LPC, D_BRANCH, - - "AL", LBREG, D_AL, - "CL", LBREG, D_CL, - "DL", LBREG, D_DL, - "BL", LBREG, D_BL, - "AH", LBREG, D_AH, - "CH", LBREG, D_CH, - "DH", LBREG, D_DH, - "BH", LBREG, D_BH, - - "AX", LLREG, D_AX, - "CX", LLREG, D_CX, - "DX", LLREG, D_DX, - "BX", LLREG, D_BX, -/* "SP", LLREG, D_SP, */ - "BP", LLREG, D_BP, - "SI", LLREG, D_SI, - "DI", LLREG, D_DI, - - "F0", LFREG, D_F0+0, - "F1", LFREG, D_F0+1, - "F2", LFREG, D_F0+2, - "F3", LFREG, D_F0+3, - "F4", LFREG, D_F0+4, - "F5", LFREG, D_F0+5, - "F6", LFREG, D_F0+6, - "F7", LFREG, D_F0+7, - - "CS", LSREG, D_CS, - "SS", LSREG, D_SS, - "DS", LSREG, D_DS, - "ES", LSREG, D_ES, - "FS", LSREG, D_FS, - "GS", LSREG, D_GS, - - "GDTR", LBREG, D_GDTR, - "IDTR", LBREG, D_IDTR, - "LDTR", LBREG, D_LDTR, - "MSW", LBREG, D_MSW, - "TASK", LBREG, D_TASK, - - "CR0", LBREG, D_CR+0, - "CR1", LBREG, D_CR+1, - "CR2", LBREG, D_CR+2, - "CR3", LBREG, D_CR+3, - "CR4", LBREG, D_CR+4, - "CR5", LBREG, D_CR+5, - "CR6", LBREG, D_CR+6, - "CR7", LBREG, D_CR+7, - - "DR0", LBREG, D_DR+0, - "DR1", LBREG, D_DR+1, - "DR2", LBREG, D_DR+2, - "DR3", LBREG, D_DR+3, - "DR4", LBREG, D_DR+4, - "DR5", LBREG, D_DR+5, - "DR6", LBREG, D_DR+6, - "DR7", LBREG, D_DR+7, - - "TR0", LBREG, D_TR+0, - "TR1", LBREG, D_TR+1, - "TR2", LBREG, D_TR+2, - "TR3", LBREG, D_TR+3, - "TR4", LBREG, D_TR+4, - "TR5", LBREG, D_TR+5, - "TR6", LBREG, D_TR+6, - "TR7", LBREG, D_TR+7, - - "AAA", LTYPE0, AAAA, - "AAD", LTYPE0, AAAD, - "AAM", LTYPE0, AAAM, - "AAS", LTYPE0, AAAS, - "ADCB", LTYPE3, AADCB, - "ADCL", LTYPE3, AADCL, - "ADCW", LTYPE3, AADCW, - "ADDB", LTYPE3, AADDB, - "ADDL", LTYPE3, AADDL, - "ADDW", LTYPE3, AADDW, - "ADJSP", LTYPE2, AADJSP, - "ANDB", LTYPE3, AANDB, - "ANDL", LTYPE3, AANDL, - "ANDW", LTYPE3, AANDW, - "ARPL", LTYPE3, AARPL, - "BOUNDL", LTYPE3, ABOUNDL, - "BOUNDW", LTYPE3, ABOUNDW, - "BSFL", LTYPE3, ABSFL, - "BSFW", LTYPE3, ABSFW, - "BSRL", LTYPE3, ABSRL, - "BSRW", LTYPE3, ABSRW, - "BTCL", LTYPE3, ABTCL, - "BTCW", LTYPE3, ABTCW, - "BTL", LTYPE3, ABTL, - "BTRL", LTYPE3, ABTRL, - "BTRW", LTYPE3, ABTRW, - "BTSL", LTYPE3, ABTSL, - "BTSW", LTYPE3, ABTSW, - "BTW", LTYPE3, ABTW, - "BYTE", LTYPE2, ABYTE, - "CALL", LTYPEC, ACALL, - "CLC", LTYPE0, ACLC, - "CLD", LTYPE0, ACLD, - "CLI", LTYPE0, ACLI, - "CLTS", LTYPE0, ACLTS, - "CMC", LTYPE0, ACMC, - "CMPB", LTYPE4, ACMPB, - "CMPL", LTYPE4, ACMPL, - "CMPW", LTYPE4, ACMPW, - "CMPSB", LTYPE0, ACMPSB, - "CMPSL", LTYPE0, ACMPSL, - "CMPSW", LTYPE0, ACMPSW, - "CMPXCHG8B", LTYPE1, ACMPXCHG8B, - "CMPXCHGB", LTYPE3, ACMPXCHGB, - "CMPXCHGL", LTYPE3, ACMPXCHGL, - "CMPXCHGW", LTYPE3, ACMPXCHGW, - "DAA", LTYPE0, ADAA, - "DAS", LTYPE0, ADAS, - "DATA", LTYPED, ADATA, - "DECB", LTYPE1, ADECB, - "DECL", LTYPE1, ADECL, - "DECW", LTYPE1, ADECW, - "DIVB", LTYPE2, ADIVB, - "DIVL", LTYPE2, ADIVL, - "DIVW", LTYPE2, ADIVW, - "END", LTYPE0, AEND, - "ENTER", LTYPE2, AENTER, - "GLOBL", LTYPEG, AGLOBL, - "HLT", LTYPE0, AHLT, - "IDIVB", LTYPE2, AIDIVB, - "IDIVL", LTYPE2, AIDIVL, - "IDIVW", LTYPE2, AIDIVW, - "IMULB", LTYPE2, AIMULB, - "IMULL", LTYPE2, AIMULL, - "IMULW", LTYPE2, AIMULW, - "INB", LTYPE0, AINB, - "INL", LTYPE0, AINL, - "INW", LTYPE0, AINW, - "INCB", LTYPE1, AINCB, - "INCL", LTYPE1, AINCL, - "INCW", LTYPE1, AINCW, - "INSB", LTYPE0, AINSB, - "INSL", LTYPE0, AINSL, - "INSW", LTYPE0, AINSW, - "INT", LTYPE2, AINT, - "INTO", LTYPE0, AINTO, - "IRETL", LTYPE0, AIRETL, - "IRETW", LTYPE0, AIRETW, - - "JOS", LTYPER, AJOS, - "JO", LTYPER, AJOS, /* alternate */ - "JOC", LTYPER, AJOC, - "JNO", LTYPER, AJOC, /* alternate */ - "JCS", LTYPER, AJCS, - "JB", LTYPER, AJCS, /* alternate */ - "JC", LTYPER, AJCS, /* alternate */ - "JNAE", LTYPER, AJCS, /* alternate */ - "JLO", LTYPER, AJCS, /* alternate */ - "JCC", LTYPER, AJCC, - "JAE", LTYPER, AJCC, /* alternate */ - "JNB", LTYPER, AJCC, /* alternate */ - "JNC", LTYPER, AJCC, /* alternate */ - "JHS", LTYPER, AJCC, /* alternate */ - "JEQ", LTYPER, AJEQ, - "JE", LTYPER, AJEQ, /* alternate */ - "JZ", LTYPER, AJEQ, /* alternate */ - "JNE", LTYPER, AJNE, - "JNZ", LTYPER, AJNE, /* alternate */ - "JLS", LTYPER, AJLS, - "JBE", LTYPER, AJLS, /* alternate */ - "JNA", LTYPER, AJLS, /* alternate */ - "JHI", LTYPER, AJHI, - "JA", LTYPER, AJHI, /* alternate */ - "JNBE", LTYPER, AJHI, /* alternate */ - "JMI", LTYPER, AJMI, - "JS", LTYPER, AJMI, /* alternate */ - "JPL", LTYPER, AJPL, - "JNS", LTYPER, AJPL, /* alternate */ - "JPS", LTYPER, AJPS, - "JP", LTYPER, AJPS, /* alternate */ - "JPE", LTYPER, AJPS, /* alternate */ - "JPC", LTYPER, AJPC, - "JNP", LTYPER, AJPC, /* alternate */ - "JPO", LTYPER, AJPC, /* alternate */ - "JLT", LTYPER, AJLT, - "JL", LTYPER, AJLT, /* alternate */ - "JNGE", LTYPER, AJLT, /* alternate */ - "JGE", LTYPER, AJGE, - "JNL", LTYPER, AJGE, /* alternate */ - "JLE", LTYPER, AJLE, - "JNG", LTYPER, AJLE, /* alternate */ - "JGT", LTYPER, AJGT, - "JG", LTYPER, AJGT, /* alternate */ - "JNLE", LTYPER, AJGT, /* alternate */ - - "JCXZ", LTYPER, AJCXZ, - "JMP", LTYPEC, AJMP, - "LAHF", LTYPE0, ALAHF, - "LARL", LTYPE3, ALARL, - "LARW", LTYPE3, ALARW, - "LEAL", LTYPE3, ALEAL, - "LEAW", LTYPE3, ALEAW, - "LEAVEL", LTYPE0, ALEAVEL, - "LEAVEW", LTYPE0, ALEAVEW, - "LOCK", LTYPE0, ALOCK, - "LODSB", LTYPE0, ALODSB, - "LODSL", LTYPE0, ALODSL, - "LODSW", LTYPE0, ALODSW, - "LONG", LTYPE2, ALONG, - "LOOP", LTYPER, ALOOP, - "LOOPEQ", LTYPER, ALOOPEQ, - "LOOPNE", LTYPER, ALOOPNE, - "LSLL", LTYPE3, ALSLL, - "LSLW", LTYPE3, ALSLW, - "MOVB", LTYPE3, AMOVB, - "MOVL", LTYPEM, AMOVL, - "MOVW", LTYPEM, AMOVW, - "MOVBLSX", LTYPE3, AMOVBLSX, - "MOVBLZX", LTYPE3, AMOVBLZX, - "MOVBWSX", LTYPE3, AMOVBWSX, - "MOVBWZX", LTYPE3, AMOVBWZX, - "MOVWLSX", LTYPE3, AMOVWLSX, - "MOVWLZX", LTYPE3, AMOVWLZX, - "MOVSB", LTYPE0, AMOVSB, - "MOVSL", LTYPE0, AMOVSL, - "MOVSW", LTYPE0, AMOVSW, - "MULB", LTYPE2, AMULB, - "MULL", LTYPE2, AMULL, - "MULW", LTYPE2, AMULW, - "NEGB", LTYPE1, ANEGB, - "NEGL", LTYPE1, ANEGL, - "NEGW", LTYPE1, ANEGW, - "NOP", LTYPEN, ANOP, - "NOTB", LTYPE1, ANOTB, - "NOTL", LTYPE1, ANOTL, - "NOTW", LTYPE1, ANOTW, - "ORB", LTYPE3, AORB, - "ORL", LTYPE3, AORL, - "ORW", LTYPE3, AORW, - "OUTB", LTYPE0, AOUTB, - "OUTL", LTYPE0, AOUTL, - "OUTW", LTYPE0, AOUTW, - "OUTSB", LTYPE0, AOUTSB, - "OUTSL", LTYPE0, AOUTSL, - "OUTSW", LTYPE0, AOUTSW, - "POPAL", LTYPE0, APOPAL, - "POPAW", LTYPE0, APOPAW, - "POPFL", LTYPE0, APOPFL, - "POPFW", LTYPE0, APOPFW, - "POPL", LTYPE1, APOPL, - "POPW", LTYPE1, APOPW, - "PUSHAL", LTYPE0, APUSHAL, - "PUSHAW", LTYPE0, APUSHAW, - "PUSHFL", LTYPE0, APUSHFL, - "PUSHFW", LTYPE0, APUSHFW, - "PUSHL", LTYPE2, APUSHL, - "PUSHW", LTYPE2, APUSHW, - "RCLB", LTYPE3, ARCLB, - "RCLL", LTYPE3, ARCLL, - "RCLW", LTYPE3, ARCLW, - "RCRB", LTYPE3, ARCRB, - "RCRL", LTYPE3, ARCRL, - "RCRW", LTYPE3, ARCRW, - "REP", LTYPE0, AREP, - "REPN", LTYPE0, AREPN, - "RET", LTYPE0, ARET, - "ROLB", LTYPE3, AROLB, - "ROLL", LTYPE3, AROLL, - "ROLW", LTYPE3, AROLW, - "RORB", LTYPE3, ARORB, - "RORL", LTYPE3, ARORL, - "RORW", LTYPE3, ARORW, - "SAHF", LTYPE0, ASAHF, - "SALB", LTYPE3, ASALB, - "SALL", LTYPE3, ASALL, - "SALW", LTYPE3, ASALW, - "SARB", LTYPE3, ASARB, - "SARL", LTYPE3, ASARL, - "SARW", LTYPE3, ASARW, - "SBBB", LTYPE3, ASBBB, - "SBBL", LTYPE3, ASBBL, - "SBBW", LTYPE3, ASBBW, - "SCASB", LTYPE0, ASCASB, - "SCASL", LTYPE0, ASCASL, - "SCASW", LTYPE0, ASCASW, - "SETCC", LTYPE1, ASETCC, - "SETCS", LTYPE1, ASETCS, - "SETEQ", LTYPE1, ASETEQ, - "SETGE", LTYPE1, ASETGE, - "SETGT", LTYPE1, ASETGT, - "SETHI", LTYPE1, ASETHI, - "SETLE", LTYPE1, ASETLE, - "SETLS", LTYPE1, ASETLS, - "SETLT", LTYPE1, ASETLT, - "SETMI", LTYPE1, ASETMI, - "SETNE", LTYPE1, ASETNE, - "SETOC", LTYPE1, ASETOC, - "SETOS", LTYPE1, ASETOS, - "SETPC", LTYPE1, ASETPC, - "SETPL", LTYPE1, ASETPL, - "SETPS", LTYPE1, ASETPS, - "CDQ", LTYPE0, ACDQ, - "CWD", LTYPE0, ACWD, - "SHLB", LTYPE3, ASHLB, - "SHLL", LTYPES, ASHLL, - "SHLW", LTYPES, ASHLW, - "SHRB", LTYPE3, ASHRB, - "SHRL", LTYPES, ASHRL, - "SHRW", LTYPES, ASHRW, - "STC", LTYPE0, ASTC, - "STD", LTYPE0, ASTD, - "STI", LTYPE0, ASTI, - "STOSB", LTYPE0, ASTOSB, - "STOSL", LTYPE0, ASTOSL, - "STOSW", LTYPE0, ASTOSW, - "SUBB", LTYPE3, ASUBB, - "SUBL", LTYPE3, ASUBL, - "SUBW", LTYPE3, ASUBW, - "SYSCALL", LTYPE0, ASYSCALL, - "TESTB", LTYPE3, ATESTB, - "TESTL", LTYPE3, ATESTL, - "TESTW", LTYPE3, ATESTW, - "TEXT", LTYPET, ATEXT, - "VERR", LTYPE2, AVERR, - "VERW", LTYPE2, AVERW, - "WAIT", LTYPE0, AWAIT, - "WORD", LTYPE2, AWORD, - "XADDB", LTYPE3, AXADDB, - "XADDL", LTYPE3, AXADDL, - "XADDW", LTYPE3, AXADDW, - "XCHGB", LTYPE3, AXCHGB, - "XCHGL", LTYPE3, AXCHGL, - "XCHGW", LTYPE3, AXCHGW, - "XLAT", LTYPE2, AXLAT, - "XORB", LTYPE3, AXORB, - "XORL", LTYPE3, AXORL, - "XORW", LTYPE3, AXORW, - - "CMOVLCC", LTYPE3, ACMOVLCC, - "CMOVLCS", LTYPE3, ACMOVLCS, - "CMOVLEQ", LTYPE3, ACMOVLEQ, - "CMOVLGE", LTYPE3, ACMOVLGE, - "CMOVLGT", LTYPE3, ACMOVLGT, - "CMOVLHI", LTYPE3, ACMOVLHI, - "CMOVLLE", LTYPE3, ACMOVLLE, - "CMOVLLS", LTYPE3, ACMOVLLS, - "CMOVLLT", LTYPE3, ACMOVLLT, - "CMOVLMI", LTYPE3, ACMOVLMI, - "CMOVLNE", LTYPE3, ACMOVLNE, - "CMOVLOC", LTYPE3, ACMOVLOC, - "CMOVLOS", LTYPE3, ACMOVLOS, - "CMOVLPC", LTYPE3, ACMOVLPC, - "CMOVLPL", LTYPE3, ACMOVLPL, - "CMOVLPS", LTYPE3, ACMOVLPS, - "CMOVWCC", LTYPE3, ACMOVWCC, - "CMOVWCS", LTYPE3, ACMOVWCS, - "CMOVWEQ", LTYPE3, ACMOVWEQ, - "CMOVWGE", LTYPE3, ACMOVWGE, - "CMOVWGT", LTYPE3, ACMOVWGT, - "CMOVWHI", LTYPE3, ACMOVWHI, - "CMOVWLE", LTYPE3, ACMOVWLE, - "CMOVWLS", LTYPE3, ACMOVWLS, - "CMOVWLT", LTYPE3, ACMOVWLT, - "CMOVWMI", LTYPE3, ACMOVWMI, - "CMOVWNE", LTYPE3, ACMOVWNE, - "CMOVWOC", LTYPE3, ACMOVWOC, - "CMOVWOS", LTYPE3, ACMOVWOS, - "CMOVWPC", LTYPE3, ACMOVWPC, - "CMOVWPL", LTYPE3, ACMOVWPL, - "CMOVWPS", LTYPE3, ACMOVWPS, - - "FMOVB", LTYPE3, AFMOVB, - "FMOVBP", LTYPE3, AFMOVBP, - "FMOVD", LTYPE3, AFMOVD, - "FMOVDP", LTYPE3, AFMOVDP, - "FMOVF", LTYPE3, AFMOVF, - "FMOVFP", LTYPE3, AFMOVFP, - "FMOVL", LTYPE3, AFMOVL, - "FMOVLP", LTYPE3, AFMOVLP, - "FMOVV", LTYPE3, AFMOVV, - "FMOVVP", LTYPE3, AFMOVVP, - "FMOVW", LTYPE3, AFMOVW, - "FMOVWP", LTYPE3, AFMOVWP, - "FMOVX", LTYPE3, AFMOVX, - "FMOVXP", LTYPE3, AFMOVXP, - "FCMOVCC", LTYPE3, AFCMOVCC, - "FCMOVCS", LTYPE3, AFCMOVCS, - "FCMOVEQ", LTYPE3, AFCMOVEQ, - "FCMOVHI", LTYPE3, AFCMOVHI, - "FCMOVLS", LTYPE3, AFCMOVLS, - "FCMOVNE", LTYPE3, AFCMOVNE, - "FCMOVNU", LTYPE3, AFCMOVNU, - "FCMOVUN", LTYPE3, AFCMOVUN, - "FCOMB", LTYPE3, AFCOMB, - "FCOMBP", LTYPE3, AFCOMBP, - "FCOMD", LTYPE3, AFCOMD, - "FCOMDP", LTYPE3, AFCOMDP, - "FCOMDPP", LTYPE3, AFCOMDPP, - "FCOMF", LTYPE3, AFCOMF, - "FCOMFP", LTYPE3, AFCOMFP, - "FCOMI", LTYPE3, AFCOMI, - "FCOMIP", LTYPE3, AFCOMIP, - "FCOML", LTYPE3, AFCOML, - "FCOMLP", LTYPE3, AFCOMLP, - "FCOMW", LTYPE3, AFCOMW, - "FCOMWP", LTYPE3, AFCOMWP, - "FUCOM", LTYPE3, AFUCOM, - "FUCOMI", LTYPE3, AFUCOMI, - "FUCOMIP", LTYPE3, AFUCOMIP, - "FUCOMP", LTYPE3, AFUCOMP, - "FUCOMPP", LTYPE3, AFUCOMPP, - "FADDW", LTYPE3, AFADDW, - "FADDL", LTYPE3, AFADDL, - "FADDF", LTYPE3, AFADDF, - "FADDD", LTYPE3, AFADDD, - "FADDDP", LTYPE3, AFADDDP, - "FSUBDP", LTYPE3, AFSUBDP, - "FSUBW", LTYPE3, AFSUBW, - "FSUBL", LTYPE3, AFSUBL, - "FSUBF", LTYPE3, AFSUBF, - "FSUBD", LTYPE3, AFSUBD, - "FSUBRDP", LTYPE3, AFSUBRDP, - "FSUBRW", LTYPE3, AFSUBRW, - "FSUBRL", LTYPE3, AFSUBRL, - "FSUBRF", LTYPE3, AFSUBRF, - "FSUBRD", LTYPE3, AFSUBRD, - "FMULDP", LTYPE3, AFMULDP, - "FMULW", LTYPE3, AFMULW, - "FMULL", LTYPE3, AFMULL, - "FMULF", LTYPE3, AFMULF, - "FMULD", LTYPE3, AFMULD, - "FDIVDP", LTYPE3, AFDIVDP, - "FDIVW", LTYPE3, AFDIVW, - "FDIVL", LTYPE3, AFDIVL, - "FDIVF", LTYPE3, AFDIVF, - "FDIVD", LTYPE3, AFDIVD, - "FDIVRDP", LTYPE3, AFDIVRDP, - "FDIVRW", LTYPE3, AFDIVRW, - "FDIVRL", LTYPE3, AFDIVRL, - "FDIVRF", LTYPE3, AFDIVRF, - "FDIVRD", LTYPE3, AFDIVRD, - "FXCHD", LTYPE3, AFXCHD, - "FFREE", LTYPE1, AFFREE, - "FLDCW", LTYPE2, AFLDCW, - "FLDENV", LTYPE1, AFLDENV, - "FRSTOR", LTYPE2, AFRSTOR, - "FSAVE", LTYPE1, AFSAVE, - "FSTCW", LTYPE1, AFSTCW, - "FSTENV", LTYPE1, AFSTENV, - "FSTSW", LTYPE1, AFSTSW, - "F2XM1", LTYPE0, AF2XM1, - "FABS", LTYPE0, AFABS, - "FCHS", LTYPE0, AFCHS, - "FCLEX", LTYPE0, AFCLEX, - "FCOS", LTYPE0, AFCOS, - "FDECSTP", LTYPE0, AFDECSTP, - "FINCSTP", LTYPE0, AFINCSTP, - "FINIT", LTYPE0, AFINIT, - "FLD1", LTYPE0, AFLD1, - "FLDL2E", LTYPE0, AFLDL2E, - "FLDL2T", LTYPE0, AFLDL2T, - "FLDLG2", LTYPE0, AFLDLG2, - "FLDLN2", LTYPE0, AFLDLN2, - "FLDPI", LTYPE0, AFLDPI, - "FLDZ", LTYPE0, AFLDZ, - "FNOP", LTYPE0, AFNOP, - "FPATAN", LTYPE0, AFPATAN, - "FPREM", LTYPE0, AFPREM, - "FPREM1", LTYPE0, AFPREM1, - "FPTAN", LTYPE0, AFPTAN, - "FRNDINT", LTYPE0, AFRNDINT, - "FSCALE", LTYPE0, AFSCALE, - "FSIN", LTYPE0, AFSIN, - "FSINCOS", LTYPE0, AFSINCOS, - "FSQRT", LTYPE0, AFSQRT, - "FTST", LTYPE0, AFTST, - "FXAM", LTYPE0, AFXAM, - "FXTRACT", LTYPE0, AFXTRACT, - "FYL2X", LTYPE0, AFYL2X, - "FYL2XP1", LTYPE0, AFYL2XP1, - - 0 -}; - -void -cinit(void) -{ - Sym *s; - int i; - - nullgen.sym = S; - nullgen.offset = 0; - if(FPCHIP) - nullgen.dval = 0; - for(i=0; i<sizeof(nullgen.sval); i++) - nullgen.sval[i] = 0; - nullgen.type = D_NONE; - nullgen.index = D_NONE; - nullgen.scale = 0; - - 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); - if(s->type != LNAME) - yyerror("double initialization %s", itab[i].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 -checkscale(int scale) -{ - - switch(scale) { - case 1: - case 2: - case 4: - case 8: - return; - } - yyerror("scale must be 1248: %d", scale); -} - -void -syminit(Sym *s) -{ - - s->type = LNAME; - s->value = 0; -} - -void -cclean(void) -{ - Gen2 g2; - - g2.from = nullgen; - g2.to = nullgen; - outcode(AEND, &g2); - Bflush(&obuf); -} - -void -zname(char *n, int t, int s) -{ - - Bputc(&obuf, ANAME); /* as(2) */ - 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) -{ - int32 l; - int i, t; - char *n; - Ieee e; - - t = 0; - if(a->index != D_NONE || a->scale != 0) - t |= T_INDEX; - if(a->offset != 0) - t |= T_OFFSET; - if(s != 0) - t |= T_SYM; - - switch(a->type) { - default: - t |= T_TYPE; - break; - case D_FCONST: - t |= T_FCONST; - break; - case D_CONST2: - t |= T_OFFSET|T_OFFSET2; - break; - case D_SCONST: - t |= T_SCONST; - break; - case D_NONE: - break; - } - Bputc(&obuf, t); - - if(t & T_INDEX) { /* implies index, scale */ - Bputc(&obuf, a->index); - Bputc(&obuf, a->scale); - } - if(t & T_OFFSET) { /* implies offset */ - l = a->offset; - Bputc(&obuf, l); - Bputc(&obuf, l>>8); - Bputc(&obuf, l>>16); - Bputc(&obuf, l>>24); - } - if(t & T_OFFSET2) { - l = a->offset2; - Bputc(&obuf, l); - Bputc(&obuf, l>>8); - Bputc(&obuf, l>>16); - Bputc(&obuf, l>>24); - } - if(t & T_SYM) /* implies sym */ - Bputc(&obuf, s); - if(t & T_FCONST) { - ieeedtod(&e, a->dval); - l = e.l; - Bputc(&obuf, l); - Bputc(&obuf, l>>8); - Bputc(&obuf, l>>16); - Bputc(&obuf, l>>24); - l = e.h; - Bputc(&obuf, l); - Bputc(&obuf, l>>8); - Bputc(&obuf, l>>16); - Bputc(&obuf, l>>24); - return; - } - if(t & T_SCONST) { - n = a->sval; - for(i=0; i<NSNAME; i++) { - Bputc(&obuf, *n); - n++; - } - return; - } - if(t & T_TYPE) - Bputc(&obuf, a->type); -} - -void -outcode(int a, Gen2 *g2) -{ - int sf, st, t; - Sym *s; - - if(pass == 1) - goto out; - -jackpot: - sf = 0; - s = g2->from.sym; - while(s != S) { - sf = s->sym; - if(sf < 0 || sf >= NSYM) - sf = 0; - t = g2->from.type; - if(t == D_ADDR) - t = g2->from.index; - if(h[sf].type == t) - if(h[sf].sym == s) - break; - zname(s->name, t, sym); - s->sym = sym; - h[sym].sym = s; - h[sym].type = t; - sf = sym; - sym++; - if(sym >= NSYM) - sym = 1; - break; - } - st = 0; - s = g2->to.sym; - while(s != S) { - st = s->sym; - if(st < 0 || st >= NSYM) - st = 0; - t = g2->to.type; - if(t == D_ADDR) - t = g2->to.index; - if(h[st].type == t) - if(h[st].sym == s) - break; - zname(s->name, t, sym); - s->sym = sym; - h[sym].sym = s; - h[sym].type = t; - st = sym; - sym++; - if(sym >= NSYM) - sym = 1; - if(st == sf) - goto jackpot; - break; - } - Bputc(&obuf, a); - Bputc(&obuf, a>>8); - Bputc(&obuf, stmtline); - Bputc(&obuf, stmtline>>8); - Bputc(&obuf, stmtline>>16); - Bputc(&obuf, stmtline>>24); - zaddr(&g2->from, sf); - zaddr(&g2->to, st); - -out: - if(a != AGLOBL && a != ADATA) - pc++; -} - -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, 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" |