diff options
| author | bhgv <bhgv.empire@gmail.com> | 2018-03-01 16:54:45 +0200 |
|---|---|---|
| committer | bhgv <bhgv.empire@gmail.com> | 2018-03-01 16:54:45 +0200 |
| commit | b786f20bbab5a59046aa78a2c6c2a11536497202 (patch) | |
| tree | 0851ecdec889eb9b7ba3751cc04d4f0b474e4a9e /utils/8a | |
inferno-os tree was separated from the inferno-os-android (separated from the Android driver)
Diffstat (limited to 'utils/8a')
| -rw-r--r-- | utils/8a/a.h | 194 | ||||
| -rw-r--r-- | utils/8a/a.y | 577 | ||||
| -rw-r--r-- | utils/8a/l.s | 704 | ||||
| -rw-r--r-- | utils/8a/lex.c | 953 | ||||
| -rw-r--r-- | utils/8a/mkfile | 30 | ||||
| -rw-r--r-- | utils/8a/y.debug | 283 | ||||
| -rw-r--r-- | utils/8a/y.tab.c | 1069 | ||||
| -rw-r--r-- | utils/8a/y.tab.h | 42 |
8 files changed, 3852 insertions, 0 deletions
diff --git a/utils/8a/a.h b/utils/8a/a.h new file mode 100644 index 0000000..46de8b7 --- /dev/null +++ b/utils/8a/a.h @@ -0,0 +1,194 @@ +#include <lib9.h> +#include <bio.h> +#include "../8c/8.out.h" + +#ifndef EXTERN +#define EXTERN extern +#endif + +typedef struct Sym Sym; +typedef struct Ref Ref; +typedef struct Gen Gen; +typedef struct Io Io; +typedef struct Hist Hist; +typedef struct Gen2 Gen2; + +#define MAXALIGN 7 +#define FPCHIP 1 +#define NSYMB 500 +#define BUFSIZ 8192 +#define HISTSZ 20 +#define NINCLUDE 10 +#define NHUNK 10000 +#define EOF (-1) +#define IGN (-2) +#define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) +#define NHASH 503 +#define STRINGSZ 200 +#define NMACRO 10 + +struct Sym +{ + Sym* link; + Ref* ref; + char* macro; + long value; + ushort type; + char *name; + char sym; +}; +#define S ((Sym*)0) + +struct Ref +{ + int class; +}; + +EXTERN struct +{ + char* p; + int c; +} fi; + +struct Io +{ + Io* link; + char b[BUFSIZ]; + char* p; + short c; + short f; +}; +#define I ((Io*)0) + +EXTERN struct +{ + Sym* sym; + short type; +} h[NSYM]; + +struct Gen +{ + double dval; + char sval[8]; + long offset; + long offset2; + Sym* sym; + short type; + short index; + short scale; +}; +struct Gen2 +{ + Gen from; + Gen to; +}; + +struct Hist +{ + Hist* link; + char* name; + long line; + long offset; +}; +#define H ((Hist*)0) + +enum +{ + CLAST, + CMACARG, + CMACRO, + CPREPROC, +}; + + +EXTERN char debug[256]; +EXTERN Sym* hash[NHASH]; +EXTERN char* Dlist[30]; +EXTERN int nDlist; +EXTERN Hist* ehist; +EXTERN int newflag; +EXTERN Hist* hist; +EXTERN char* hunk; +EXTERN char* include[NINCLUDE]; +EXTERN Io* iofree; +EXTERN Io* ionext; +EXTERN Io* iostack; +EXTERN long lineno; +EXTERN int nerrors; +EXTERN long nhunk; +EXTERN int ninclude; +EXTERN Gen nullgen; +EXTERN char* outfile; +EXTERN int pass; +EXTERN char* pathname; +EXTERN long pc; +EXTERN int peekc; +EXTERN int sym; +EXTERN char symb[NSYMB]; +EXTERN int thechar; +EXTERN char* thestring; +EXTERN long thunk; +EXTERN Biobuf obuf; + +void* allocn(void*, long, long); +void errorexit(void); +void pushio(void); +void newio(void); +void newfile(char*, int); +Sym* slookup(char*); +Sym* lookup(void); +void syminit(Sym*); +long yylex(void); +int getc(void); +int getnsc(void); +void unget(int); +int escchar(int); +void cinit(void); +void checkscale(int); +void pinit(char*); +void cclean(void); +int isreg(Gen*); +void outcode(int, Gen2*); +void outhist(void); +void zaddr(Gen*, int); +void zname(char*, int, int); +void ieeedtod(Ieee*, double); +int filbuf(void); +Sym* getsym(void); +void domacro(void); +void macund(void); +void macdef(void); +void macexpand(Sym*, char*); +void macinc(void); +void macprag(void); +void maclin(void); +void macif(int); +void macend(void); +void dodefine(char*); +void prfile(long); +void linehist(char*, int); +void gethunk(void); +void yyerror(char*, ...); +int yyparse(void); +void setinclude(char*); +int assemble(char*); + +/* + * system-dependent stuff from ../cc/compat.c + */ +enum /* keep in synch with ../cc/cc.h */ +{ + Plan9 = 1<<0, + Unix = 1<<1, + Windows = 1<<2 +}; +int mywait(int*); +int mycreat(char*, int); +int systemtype(int); +int pathchar(void); +char* mygetwd(char*, int); +int myexec(char*, char*[]); +int mydup(int, int); +int myfork(void); +int mypipe(int*); +void* mysbrk(ulong); diff --git a/utils/8a/a.y b/utils/8a/a.y new file mode 100644 index 0000000..7c9487f --- /dev/null +++ b/utils/8a/a.y @@ -0,0 +1,577 @@ +%{ +#include "a.h" +%} +%union { + Sym *sym; + long lval; + struct { + long v1; + long v2; + } con2; + double dval; + char sval[8]; + Gen gen; + Gen2 gen2; +} +%left '|' +%left '^' +%left '&' +%left '<' '>' +%left '+' '-' +%left '*' '/' '%' +%token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4 +%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG +%token <lval> LCONST LFP LPC LSB +%token <lval> LBREG LLREG LSREG LFREG +%token <dval> LFCONST +%token <sval> LSCONST LSP +%token <sym> LNAME LLAB LVAR +%type <lval> con expr pointer offset +%type <con2> con2 +%type <gen> mem imm imm2 reg nam rel rem rim rom omem nmem +%type <gen2> nonnon nonrel nonrem rimnon rimrem remrim +%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 +%% +prog: +| prog line + +line: + LLAB ':' + { + if($1->value != pc) + yyerror("redeclaration of %s", $1->name); + $1->value = pc; + } + line +| LNAME ':' + { + $1->type = LLAB; + $1->value = pc; + } + line +| ';' +| inst ';' +| error ';' + +inst: + LNAME '=' expr + { + $1->type = LVAR; + $1->value = $3; + } +| LVAR '=' expr + { + if($1->value != $3) + yyerror("redeclaration of %s", $1->name); + $1->value = $3; + } +| LTYPE0 nonnon { outcode($1, &$2); } +| LTYPE1 nonrem { outcode($1, &$2); } +| LTYPE2 rimnon { outcode($1, &$2); } +| LTYPE3 rimrem { outcode($1, &$2); } +| LTYPE4 remrim { outcode($1, &$2); } +| LTYPER nonrel { outcode($1, &$2); } +| LTYPED spec1 { outcode($1, &$2); } +| LTYPET spec2 { outcode($1, &$2); } +| LTYPEC spec3 { outcode($1, &$2); } +| LTYPEN spec4 { outcode($1, &$2); } +| LTYPES spec5 { outcode($1, &$2); } +| LTYPEM spec6 { outcode($1, &$2); } +| LTYPEI spec7 { outcode($1, &$2); } +| LTYPEG spec8 { outcode($1, &$2); } + +nonnon: + { + $$.from = nullgen; + $$.to = nullgen; + } +| ',' + { + $$.from = nullgen; + $$.to = nullgen; + } + +rimrem: + rim ',' rem + { + $$.from = $1; + $$.to = $3; + } + +remrim: + rem ',' rim + { + $$.from = $1; + $$.to = $3; + } + +rimnon: + rim ',' + { + $$.from = $1; + $$.to = nullgen; + } +| rim + { + $$.from = $1; + $$.to = nullgen; + } + +nonrem: + ',' rem + { + $$.from = nullgen; + $$.to = $2; + } +| rem + { + $$.from = nullgen; + $$.to = $1; + } + +nonrel: + ',' rel + { + $$.from = nullgen; + $$.to = $2; + } +| rel + { + $$.from = nullgen; + $$.to = $1; + } + +spec1: /* DATA */ + nam '/' con ',' imm + { + $$.from = $1; + $$.from.scale = $3; + $$.to = $5; + } + +spec2: /* TEXT */ + mem ',' imm + { + $$.from = $1; + $$.to = $3; + } +| mem ',' con ',' imm + { + $$.from = $1; + $$.from.scale = $3; + $$.to = $5; + } + +spec3: /* JMP/CALL */ + ',' rom + { + $$.from = nullgen; + $$.to = $2; + } +| rom + { + $$.from = nullgen; + $$.to = $1; + } + +spec4: /* NOP */ + nonnon +| nonrem + +spec5: /* SHL/SHR */ + rim ',' rem + { + $$.from = $1; + $$.to = $3; + } +| rim ',' rem ':' LLREG + { + $$.from = $1; + $$.to = $3; + if($$.from.index != D_NONE) + yyerror("dp shift with lhs index"); + $$.from.index = $5; + } + +spec6: /* MOVW/MOVL */ + rim ',' rem + { + $$.from = $1; + $$.to = $3; + } +| rim ',' rem ':' LSREG + { + $$.from = $1; + $$.to = $3; + if($$.to.index != D_NONE) + yyerror("dp move with lhs index"); + $$.to.index = $5; + } + +spec7: + rim ',' + { + $$.from = $1; + $$.to = nullgen; + } +| rim + { + $$.from = $1; + $$.to = nullgen; + } +| rim ',' rem + { + $$.from = $1; + $$.to = $3; + } + +spec8: /* GLOBL */ + mem ',' imm + { + $$.from = $1; + $$.to = $3; + } +| mem ',' con ',' imm + { + $$.from = $1; + $$.from.scale = $3; + $$.to = $5; + } + +rem: + reg +| mem + +rom: + rel +| nmem +| '*' reg + { + $$ = $2; + } +| '*' omem + { + $$ = $2; + } +| reg +| omem +| imm + +rim: + rem +| imm + +rel: + con '(' LPC ')' + { + $$ = nullgen; + $$.type = D_BRANCH; + $$.offset = $1 + pc; + } +| LNAME offset + { + $$ = nullgen; + if(pass == 2) + yyerror("undefined label: %s", $1->name); + $$.type = D_BRANCH; + $$.sym = $1; + $$.offset = $2; + } +| LLAB offset + { + $$ = nullgen; + $$.type = D_BRANCH; + $$.sym = $1; + $$.offset = $1->value + $2; + } + +reg: + LBREG + { + $$ = nullgen; + $$.type = $1; + } +| LFREG + { + $$ = nullgen; + $$.type = $1; + } +| LLREG + { + $$ = nullgen; + $$.type = $1; + } +| LSP + { + $$ = nullgen; + $$.type = D_SP; + } +| LSREG + { + $$ = nullgen; + $$.type = $1; + } + +imm: + '$' con + { + $$ = nullgen; + $$.type = D_CONST; + $$.offset = $2; + } +| '$' nam + { + $$ = $2; + $$.index = $2.type; + $$.type = D_ADDR; + /* + if($2.type == D_AUTO || $2.type == D_PARAM) + yyerror("constant cannot be automatic: %s", + $2.sym->name); + */ + } +| '$' LSCONST + { + $$ = nullgen; + $$.type = D_SCONST; + memcpy($$.sval, $2, sizeof($$.sval)); + } +| '$' LFCONST + { + $$ = nullgen; + $$.type = D_FCONST; + $$.dval = $2; + } +| '$' '(' LFCONST ')' + { + $$ = nullgen; + $$.type = D_FCONST; + $$.dval = $3; + } +| '$' '-' LFCONST + { + $$ = nullgen; + $$.type = D_FCONST; + $$.dval = -$3; + } + +imm2: + '$' con2 + { + $$ = nullgen; + $$.type = D_CONST2; + $$.offset = $2.v1; + $$.offset2 = $2.v2; + } + +con2: + LCONST + { + $$.v1 = $1; + $$.v2 = 0; + } +| '-' LCONST + { + $$.v1 = -$2; + $$.v2 = 0; + } +| LCONST '-' LCONST + { + $$.v1 = $1; + $$.v2 = $3; + } +| '-' LCONST '-' LCONST + { + $$.v1 = -$2; + $$.v2 = $4; + } + +mem: + omem +| nmem + +omem: + con + { + $$ = nullgen; + $$.type = D_INDIR+D_NONE; + $$.offset = $1; + } +| con '(' LLREG ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + } +| con '(' LSP ')' + { + $$ = nullgen; + $$.type = D_INDIR+D_SP; + $$.offset = $1; + } +| con '(' LLREG '*' con ')' + { + $$ = nullgen; + $$.type = D_INDIR+D_NONE; + $$.offset = $1; + $$.index = $3; + $$.scale = $5; + checkscale($$.scale); + } +| con '(' LLREG ')' '(' LLREG '*' con ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + $$.index = $6; + $$.scale = $8; + checkscale($$.scale); + } +| '(' LLREG ')' + { + $$ = nullgen; + $$.type = D_INDIR+$2; + } +| '(' LSP ')' + { + $$ = nullgen; + $$.type = D_INDIR+D_SP; + } +| con '(' LSREG ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + } +| '(' LLREG '*' con ')' + { + $$ = nullgen; + $$.type = D_INDIR+D_NONE; + $$.index = $2; + $$.scale = $4; + checkscale($$.scale); + } +| '(' LLREG ')' '(' LLREG '*' con ')' + { + $$ = nullgen; + $$.type = D_INDIR+$2; + $$.index = $5; + $$.scale = $7; + checkscale($$.scale); + } + +nmem: + nam + { + $$ = $1; + } +| nam '(' LLREG '*' con ')' + { + $$ = $1; + $$.index = $3; + $$.scale = $5; + checkscale($$.scale); + } + +nam: + LNAME offset '(' pointer ')' + { + $$ = nullgen; + $$.type = $4; + $$.sym = $1; + $$.offset = $2; + } +| LNAME '<' '>' offset '(' LSB ')' + { + $$ = nullgen; + $$.type = D_STATIC; + $$.sym = $1; + $$.offset = $4; + } + +offset: + { + $$ = 0; + } +| '+' con + { + $$ = $2; + } +| '-' con + { + $$ = -$2; + } + +pointer: + LSB +| LSP + { + $$ = D_AUTO; + } +| LFP + +con: + LCONST +| LVAR + { + $$ = $1->value; + } +| '-' con + { + $$ = -$2; + } +| '+' con + { + $$ = $2; + } +| '~' con + { + $$ = ~$2; + } +| '(' expr ')' + { + $$ = $2; + } + +expr: + con +| expr '+' expr + { + $$ = $1 + $3; + } +| expr '-' expr + { + $$ = $1 - $3; + } +| expr '*' expr + { + $$ = $1 * $3; + } +| expr '/' expr + { + $$ = $1 / $3; + } +| expr '%' expr + { + $$ = $1 % $3; + } +| expr '<' '<' expr + { + $$ = $1 << $4; + } +| expr '>' '>' expr + { + $$ = $1 >> $4; + } +| expr '&' expr + { + $$ = $1 & $3; + } +| expr '^' expr + { + $$ = $1 ^ $3; + } +| expr '|' expr + { + $$ = $1 | $3; + } diff --git a/utils/8a/l.s b/utils/8a/l.s new file mode 100644 index 0000000..4bb92ef --- /dev/null +++ b/utils/8a/l.s @@ -0,0 +1,704 @@ +/* + * Memory and machine-specific definitions. Used in C and assembler. + */ + +/* + * Sizes + */ +#define BI2BY 8 /* bits per byte */ +#define BI2WD 32 /* bits per word */ +#define BY2WD 4 /* bytes per word */ +#define BY2PG 4096 /* bytes per page */ +#define WD2PG (BY2PG/BY2WD) /* words per page */ +#define PGSHIFT 12 /* log(BY2PG) */ +#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1)) + +#define MAXMACH 1 /* max # cpus system can run */ + +/* + * Time + */ +#define HZ (20) /* clock frequency */ +#define MS2HZ (1000/HZ) /* millisec per clock tick */ +#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ +#define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */ +#define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */ + +/* + * Fundamental addresses + */ + +/* + * Address spaces + * + * User is at 0-2GB + * Kernel is at 2GB-4GB + * + * To avoid an extra page map, both the user stack (USTKTOP) and + * the temporary user stack (TSTKTOP) should be in the the same + * 4 meg. + */ +#define UZERO 0 /* base of user address space */ +#define UTZERO (UZERO+BY2PG) /* first address in user text */ +#define KZERO 0x80000000 /* base of kernel address space */ +#define KTZERO KZERO /* first address in kernel text */ +#define USERADDR 0xC0000000 /* struct User */ +#define UREGADDR (USERADDR+BY2PG-4*19) +#define TSTKTOP USERADDR /* end of new stack in sysexec */ +#define TSTKSIZ 10 +#define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */ +#define USTKSIZE (16*1024*1024 - TSTKSIZ*BY2PG) /* size of user stack */ +#define ROMBIOS (KZERO|0xF0000) + +#define MACHSIZE 4096 + +#define isphys(x) (((ulong)x)&KZERO) + +/* + * known 80386 segments (in GDT) and their selectors + */ +#define NULLSEG 0 /* null segment */ +#define KDSEG 1 /* kernel data/stack */ +#define KESEG 2 /* kernel executable */ +#define UDSEG 3 /* user data/stack */ +#define UESEG 4 /* user executable */ +#define TSSSEG 5 /* task segment */ + +#define SELGDT (0<<3) /* selector is in gdt */ +#define SELLDT (1<<3) /* selector is in ldt */ + +#define SELECTOR(i, t, p) (((i)<<3) | (t) | (p)) + +#define NULLSEL SELECTOR(NULLSEG, SELGDT, 0) +#define KESEL SELECTOR(KESEG, SELGDT, 0) +#define KDSEL SELECTOR(KDSEG, SELGDT, 0) +#define UESEL SELECTOR(UESEG, SELGDT, 3) +#define UDSEL SELECTOR(UDSEG, SELGDT, 3) +#define TSSSEL SELECTOR(TSSSEG, SELGDT, 0) + +/* + * fields in segment descriptors + */ +#define SEGDATA (0x10<<8) /* data/stack segment */ +#define SEGEXEC (0x18<<8) /* executable segment */ +#define SEGTSS (0x9<<8) /* TSS segment */ +#define SEGCG (0x0C<<8) /* call gate */ +#define SEGIG (0x0E<<8) /* interrupt gate */ +#define SEGTG (0x0F<<8) /* task gate */ +#define SEGTYPE (0x1F<<8) + +#define SEGP (1<<15) /* segment present */ +#define SEGPL(x) ((x)<<13) /* priority level */ +#define SEGB (1<<22) /* granularity 1==4k (for expand-down) */ +#define SEGG (1<<23) /* granularity 1==4k (for other) */ +#define SEGE (1<<10) /* expand down */ +#define SEGW (1<<9) /* writable (for data/stack) */ +#define SEGR (1<<9) /* readable (for code) */ +#define SEGD (1<<22) /* default 1==32bit (for code) */ + +/* + * virtual MMU + */ +#define PTEMAPMEM (1024*1024) /* ??? */ +#define SEGMAPSIZE 16 /* ??? */ +#define PTEPERTAB (PTEMAPMEM/BY2PG) /* ??? */ +#define PPN(x) ((x)&~(BY2PG-1)) + +/* + * physical MMU + */ +#define PTEVALID (1<<0) +#define PTEUNCACHED 0 /* everything is uncached */ +#define PTEWRITE (1<<1) +#define PTERONLY (0<<1) +#define PTEKERNEL (0<<2) +#define PTEUSER (1<<2) + +/* + * flag register bits that we care about + */ +#define IFLAG 0x200 + +#define OP16 BYTE $0x66 + +/* + * about to walk all over ms/dos - turn off interrupts + */ +TEXT origin(SB),$0 + + CLI + +#ifdef BOOT +/* + * This part of l.s is used only in the boot kernel. + * It assumes that we are in real address mode, i.e., + * that we look like an 8086. + */ +/* + * relocate everything to a half meg and jump there + * - looks wierd because it is being assembled by a 32 bit + * assembler for a 16 bit world + */ + MOVL $0,BX + INCL BX + SHLL $15,BX + MOVL BX,CX + MOVW BX,ES + MOVL $0,SI + MOVL SI,DI + CLD; REP; MOVSL +/* JMPFAR 0X8000:$lowcore(SB) /**/ + BYTE $0xEA + WORD $lowcore(SB) + WORD $0X8000 + +TEXT lowcore(SB),$0 + +/* + * now that we're in low core, update the DS + */ + + MOVW BX,DS + +/* + * goto protected mode + */ +/* MOVL tgdtptr(SB),GDTR /**/ + BYTE $0x0f + BYTE $0x01 + BYTE $0x16 + WORD $tgdtptr(SB) + MOVL CR0,AX + ORL $1,AX + MOVL AX,CR0 + +/* + * clear prefetch queue (wierd code to avoid optimizations) + */ + CLC + JCC flush + MOVL AX,AX +flush: + +/* + * set all segs + */ +/* MOVW $SELECTOR(1, SELGDT, 0),AX /**/ + BYTE $0xc7 + BYTE $0xc0 + WORD $SELECTOR(1, SELGDT, 0) + MOVW AX,DS + MOVW AX,SS + MOVW AX,ES + MOVW AX,FS + MOVW AX,GS + +/* JMPFAR SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/ + BYTE $0x66 + BYTE $0xEA + LONG $mode32bit-KZERO(SB) + WORD $SELECTOR(2, SELGDT, 0) + +TEXT mode32bit(SB),$0 + +#endif BOOT + + /* + * Clear BSS + */ + LEAL edata-KZERO(SB),SI + MOVL SI,DI + ADDL $4,DI + MOVL $0,AX + MOVL AX,(SI) + LEAL end-KZERO(SB),CX + SUBL DI,CX + SHRL $2,CX + CLD; REP; MOVSL + + /* + * make a bottom level page table page that maps the first + * 16 meg of physical memory + */ + LEAL tpt-KZERO(SB),AX /* get phys addr of temporary page table */ + ADDL $(BY2PG-1),AX /* must be page aligned */ + ANDL $(~(BY2PG-1)),AX /* ... */ + MOVL $(4*1024),CX /* pte's per page */ + MOVL $((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX +setpte: + MOVL BX,-4(AX)(CX*4) + SUBL $(1<<PGSHIFT),BX + LOOP setpte + + /* + * make a top level page table page that maps the first + * 16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg + */ + MOVL AX,BX + ADDL $(4*BY2PG),AX + ADDL $(PTEVALID|PTEKERNEL|PTEWRITE),BX + MOVL BX,0(AX) + MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX) + ADDL $BY2PG,BX + MOVL BX,4(AX) + MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+4)(AX) + ADDL $BY2PG,BX + MOVL BX,8(AX) + MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+8)(AX) + ADDL $BY2PG,BX + MOVL BX,12(AX) + MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+12)(AX) + + /* + * point processor to top level page & turn on paging + */ + MOVL AX,CR3 + MOVL CR0,AX + ORL $0X80000000,AX + ANDL $~(0x8|0x2),AX /* TS=0, MP=0 */ + MOVL AX,CR0 + + /* + * use a jump to an absolute location to get the PC into + * KZERO. + */ + LEAL tokzero(SB),AX + JMP* AX + +TEXT tokzero(SB),$0 + + /* + * stack and mach + */ + MOVL $mach0(SB),SP + MOVL SP,m(SB) + MOVL $0,0(SP) + ADDL $(MACHSIZE-4),SP /* start stack under machine struct */ + MOVL $0, u(SB) + + /* + * clear flags + */ + MOVL $0,AX + PUSHL AX + POPFL + + CALL main(SB) + +loop: + JMP loop + +GLOBL mach0+0(SB), $MACHSIZE +GLOBL u(SB), $4 +GLOBL m(SB), $4 +GLOBL tpt(SB), $(BY2PG*6) + +/* + * gdt to get us to 32-bit/segmented/unpaged mode + */ +TEXT tgdt(SB),$0 + + /* null descriptor */ + LONG $0 + LONG $0 + + /* data segment descriptor for 4 gigabytes (PL 0) */ + LONG $(0xFFFF) + LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) + + /* exec segment descriptor for 4 gigabytes (PL 0) */ + LONG $(0xFFFF) + LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) + +/* + * pointer to initial gdt + */ +TEXT tgdtptr(SB),$0 + + WORD $(3*8) + LONG $tgdt-KZERO(SB) + +/* + * input a byte + */ +TEXT inb(SB),$0 + + MOVL p+0(FP),DX + XORL AX,AX + INB + RET + +/* + * output a byte + */ +TEXT outb(SB),$0 + + MOVL p+0(FP),DX + MOVL b+4(FP),AX + OUTB + RET + +/* + * input a string of shorts from a port + */ +TEXT inss(SB),$0 + MOVL p+0(FP),DX + MOVL a+4(FP),DI + MOVL c+8(FP),CX + CLD; REP; OP16; INSL + RET + +/* + * output a string of shorts to a port + */ +TEXT outss(SB),$0 + MOVL p+0(FP),DX + MOVL a+4(FP),SI + MOVL c+8(FP),CX + CLD; REP; OP16; OUTSL + RET + +/* + * test and set + */ +TEXT tas(SB),$0 + MOVL $0xdeadead,AX + MOVL l+0(FP),BX + XCHGL AX,(BX) + RET + +/* + * routines to load/read various system registers + */ +GLOBL idtptr(SB),$6 +TEXT putidt(SB),$0 /* interrupt descriptor table */ + MOVL t+0(FP),AX + MOVL AX,idtptr+2(SB) + MOVL l+4(FP),AX + MOVW AX,idtptr(SB) + MOVL idtptr(SB),IDTR + RET + +GLOBL gdtptr(SB),$6 +TEXT putgdt(SB),$0 /* global descriptor table */ + MOVL t+0(FP),AX + MOVL AX,gdtptr+2(SB) + MOVL l+4(FP),AX + MOVW AX,gdtptr(SB) + MOVL gdtptr(SB),GDTR + RET + +TEXT putcr3(SB),$0 /* top level page table pointer */ + MOVL t+0(FP),AX + MOVL AX,CR3 + RET + +TEXT puttr(SB),$0 /* task register */ + MOVL t+0(FP),AX + MOVW AX,TASK + RET + +TEXT getcr0(SB),$0 /* coprocessor bits */ + MOVL CR0,AX + RET + +TEXT getcr2(SB),$0 /* fault address */ + MOVL CR2,AX + RET + +#define FPOFF\ + WAIT;\ + MOVL CR0,AX;\ + ORL $0x4,AX /* EM=1 */;\ + MOVL AX,CR0 + +#define FPON\ + MOVL CR0,AX;\ + ANDL $~0x4,AX /* EM=0 */;\ + MOVL AX,CR0 + +TEXT fpoff(SB),$0 /* turn off floating point */ + FPOFF + RET + +TEXT fpinit(SB),$0 /* turn on & init the floating point */ + FPON + FINIT + WAIT + PUSHW $0x0330 + FLDCW 0(SP) /* ignore underflow/precision, signal others */ + POPW AX + WAIT + RET + +TEXT fpsave(SB),$0 /* save floating point state and turn off */ + MOVL p+0(FP),AX + WAIT + FSAVE 0(AX) + FPOFF + RET + +TEXT fprestore(SB),$0 /* turn on floating point and restore regs */ + FPON + MOVL p+0(FP),AX + FRSTOR 0(AX) + WAIT + RET + +TEXT fpstatus(SB),$0 /* get floating point status */ + FSTSW AX + RET + +/* + * special traps + */ +TEXT intr0(SB),$0 + PUSHL $0 + PUSHL $0 + JMP intrcommon +TEXT intr1(SB),$0 + PUSHL $0 + PUSHL $1 + JMP intrcommon +TEXT intr2(SB),$0 + PUSHL $0 + PUSHL $2 + JMP intrcommon +TEXT intr3(SB),$0 + PUSHL $0 + PUSHL $3 + JMP intrcommon +TEXT intr4(SB),$0 + PUSHL $0 + PUSHL $4 + JMP intrcommon +TEXT intr5(SB),$0 + PUSHL $0 + PUSHL $5 + JMP intrcommon +TEXT intr6(SB),$0 + PUSHL $0 + PUSHL $6 + JMP intrcommon +TEXT intr7(SB),$0 + PUSHL $0 + PUSHL $7 + JMP intrcommon +TEXT intr8(SB),$0 + PUSHL $8 + JMP intrscommon +TEXT intr9(SB),$0 + PUSHL $0 + PUSHL $9 + JMP intrcommon +TEXT intr10(SB),$0 + PUSHL $10 + JMP intrscommon +TEXT intr11(SB),$0 + PUSHL $11 + JMP intrscommon +TEXT intr12(SB),$0 + PUSHL $12 + JMP intrscommon +TEXT intr13(SB),$0 + PUSHL $13 + JMP intrscommon +TEXT intr14(SB),$0 + PUSHL $14 + JMP intrscommon +TEXT intr15(SB),$0 + PUSHL $0 + PUSHL $15 + JMP intrcommon +TEXT intr16(SB),$0 + PUSHL $0 + PUSHL $16 + JMP intrcommon +TEXT intr24(SB),$0 + PUSHL $0 + PUSHL $24 + JMP intrcommon +TEXT intr25(SB),$0 + PUSHL $0 + PUSHL $25 + JMP intrcommon +TEXT intr26(SB),$0 + PUSHL $0 + PUSHL $26 + JMP intrcommon +TEXT intr27(SB),$0 + PUSHL $0 + PUSHL $27 + JMP intrcommon +TEXT intr28(SB),$0 + PUSHL $0 + PUSHL $28 + JMP intrcommon +TEXT intr29(SB),$0 + PUSHL $0 + PUSHL $29 + JMP intrcommon +TEXT intr30(SB),$0 + PUSHL $0 + PUSHL $30 + JMP intrcommon +TEXT intr31(SB),$0 + PUSHL $0 + PUSHL $31 + JMP intrcommon +TEXT intr32(SB),$0 + PUSHL $0 + PUSHL $16 + JMP intrcommon +TEXT intr33(SB),$0 + PUSHL $0 + PUSHL $33 + JMP intrcommon +TEXT intr34(SB),$0 + PUSHL $0 + PUSHL $34 + JMP intrcommon +TEXT intr35(SB),$0 + PUSHL $0 + PUSHL $35 + JMP intrcommon +TEXT intr36(SB),$0 + PUSHL $0 + PUSHL $36 + JMP intrcommon +TEXT intr37(SB),$0 + PUSHL $0 + PUSHL $37 + JMP intrcommon +TEXT intr38(SB),$0 + PUSHL $0 + PUSHL $38 + JMP intrcommon +TEXT intr39(SB),$0 + PUSHL $0 + PUSHL $39 + JMP intrcommon +TEXT intr64(SB),$0 + PUSHL $0 + PUSHL $64 + JMP intrcommon +TEXT intrbad(SB),$0 + PUSHL $0 + PUSHL $0x1ff + JMP intrcommon + +intrcommon: + PUSHL DS + PUSHL ES + PUSHL FS + PUSHL GS + PUSHAL + MOVL $(KDSEL),AX + MOVW AX,DS + MOVW AX,ES + LEAL 0(SP),AX + PUSHL AX + CALL trap(SB) + POPL AX + POPAL + POPL GS + POPL FS + POPL ES + POPL DS + ADDL $8,SP /* error code and trap type */ + IRETL + +intrscommon: + PUSHL DS + PUSHL ES + PUSHL FS + PUSHL GS + PUSHAL + MOVL $(KDSEL),AX + MOVW AX,DS + MOVW AX,ES + LEAL 0(SP),AX + PUSHL AX + CALL trap(SB) + POPL AX + POPAL + POPL GS + POPL FS + POPL ES + POPL DS + ADDL $8,SP /* error code and trap type */ + IRETL + +/* + * interrupt level is interrupts on or off + */ +TEXT spllo(SB),$0 + PUSHFL + POPL AX + STI + RET + +TEXT splhi(SB),$0 + PUSHFL + POPL AX + CLI + RET + +TEXT splx(SB),$0 + MOVL s+0(FP),AX + PUSHL AX + POPFL + RET + +/* + * do nothing whatsoever till interrupt happens + */ +TEXT idle(SB),$0 + HLT + RET + +/* + * label consists of a stack pointer and a PC + */ +TEXT gotolabel(SB),$0 + MOVL l+0(FP),AX + MOVL 0(AX),SP /* restore sp */ + MOVL 4(AX),AX /* put return pc on the stack */ + MOVL AX,0(SP) + MOVL $1,AX /* return 1 */ + RET + +TEXT setlabel(SB),$0 + MOVL l+0(FP),AX + MOVL SP,0(AX) /* store sp */ + MOVL 0(SP),BX /* store return pc */ + MOVL BX,4(AX) + MOVL $0,AX /* return 0 */ + RET + +/* + * Used to get to the first process. + * Set up an interrupt return frame and IRET to user level. + */ +TEXT touser(SB),$0 + PUSHL $(UDSEL) /* old ss */ + PUSHL $(USTKTOP) /* old sp */ + PUSHFL /* old flags */ + PUSHL $(UESEL) /* old cs */ + PUSHL $(UTZERO+32) /* old pc */ + MOVL $(UDSEL),AX + MOVW AX,DS + MOVW AX,ES + MOVW AX,GS + MOVW AX,FS + IRETL + +/* + * set configuration register + */ +TEXT config(SB),$0 + MOVL l+0(FP),AX + MOVL $0x3F3,DX + OUTB + OUTB + RET diff --git a/utils/8a/lex.c b/utils/8a/lex.c new file mode 100644 index 0000000..3c7d085 --- /dev/null +++ b/utils/8a/lex.c @@ -0,0 +1,953 @@ +#include <ctype.h> +#define EXTERN +#include "a.h" +#include "y.tab.h" + +void +main(int argc, char *argv[]) +{ + char *p; + int nout, nproc, status, i, c; + + thechar = '8'; + thestring = "386"; + 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[100], incfile[20], *p; + int i, of; + + 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"; + } + p = getenv("INCLUDE"); + if(p) { + setinclude(p); + } else { + if(systemtype(Plan9)) { + sprint(incfile,"/%s/include", thestring); + setinclude(strdup(incfile)); + } + } + + 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; + 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, + "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", LTYPEI, AIMULB, + "IMULL", LTYPEI, AIMULL, + "IMULW", LTYPEI, 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, + "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(mygetwd(pathname, 99) == 0) { + pathname = allocn(pathname, 100, 900); + if(mygetwd(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) +{ + long 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, lineno); + Bputc(&obuf, lineno>>8); + Bputc(&obuf, lineno>>16); + Bputc(&obuf, lineno>>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" diff --git a/utils/8a/mkfile b/utils/8a/mkfile new file mode 100644 index 0000000..b021d34 --- /dev/null +++ b/utils/8a/mkfile @@ -0,0 +1,30 @@ +<../../mkconfig + +TARG=8a + +OFILES=\ + y.tab.$O\ + lex.$O\ + +HFILES=\ + ../8c/8.out.h\ + y.tab.h\ + a.h\ + +YFILES=a.y\ + +LIBS=cc bio 9 # order is important + +BIN=$ROOT/$OBJDIR/bin + +<$ROOT/mkfiles/mkone-$SHELLTYPE + +YFLAGS=-D1 -d +CFLAGS= $CFLAGS -I../include + +lex.$O: ../cc/macbody ../cc/lexbody + +$ROOT/$OBJDIR/lib/libcc.a: + cd ../cc + mk $MKFLAGS install + mk $MKFLAGS clean diff --git a/utils/8a/y.debug b/utils/8a/y.debug new file mode 100644 index 0000000..68fcafe --- /dev/null +++ b/utils/8a/y.debug @@ -0,0 +1,283 @@ +char* yytoknames[] = +{ + "$end", + "error", + "$unk", + " |", + " ^", + " &", + " <", + " >", + " +", + " -", + " *", + " /", + " %", + "LTYPE0", + "LTYPE1", + "LTYPE2", + "LTYPE3", + "LTYPE4", + "LTYPEC", + "LTYPED", + "LTYPEN", + "LTYPER", + "LTYPET", + "LTYPES", + "LTYPEM", + "LTYPEI", + "LTYPEG", + "LCONST", + "LFP", + "LPC", + "LSB", + "LBREG", + "LLREG", + "LSREG", + "LFREG", + "LFCONST", + "LSCONST", + "LSP", + "LNAME", + "LLAB", + "LVAR", + " :", + " ;", + " =", + " ,", + " (", + " )", + " $", + " ~", +}; +char* yystates[] = +{ + 0, /*0*/ + "$accept: prog.$end \nprog: prog.line \n", /*1*/ + 0, /*2*/ + "line: LLAB.: $$3 line \n", /*3*/ + "line: LNAME.: $$5 line \ninst: LNAME.= expr \n", /*4*/ + 0, /*5*/ + "line: inst.; \n", /*6*/ + "line: error.; \n", /*7*/ + "inst: LVAR.= expr \n", /*8*/ + 0, /*9*/ + "inst: LTYPE1.nonrem \n", /*10*/ + "inst: LTYPE2.rimnon \n", /*11*/ + "inst: LTYPE3.rimrem \n", /*12*/ + "inst: LTYPE4.remrim \n", /*13*/ + "inst: LTYPER.nonrel \n", /*14*/ + "inst: LTYPED.spec1 \n", /*15*/ + "inst: LTYPET.spec2 \n", /*16*/ + "inst: LTYPEC.spec3 \n", /*17*/ + 0, /*18*/ + "inst: LTYPES.spec5 \n", /*19*/ + "inst: LTYPEM.spec6 \n", /*20*/ + "inst: LTYPEI.spec7 \n", /*21*/ + "inst: LTYPEG.spec8 \n", /*22*/ + 0, /*23*/ + 0, /*24*/ + "inst: LNAME =.expr \n", /*25*/ + 0, /*26*/ + 0, /*27*/ + "inst: LVAR =.expr \n", /*28*/ + 0, /*29*/ + 0, /*30*/ + 0, /*31*/ + "nonrem: ,.rem \n", /*32*/ + 0, /*33*/ + 0, /*34*/ + 0, /*35*/ + 0, /*36*/ + 0, /*37*/ + 0, /*38*/ + 0, /*39*/ + 0, /*40*/ + 0, /*41*/ + 0, /*42*/ + 0, /*43*/ + "omem: (.LLREG ) \nomem: (.LSP ) \nomem: (.LLREG * con ) \nomem: (.LLREG ) ( LLREG * con ) \ncon: (.expr ) \n", /*44*/ + 0, /*45*/ + 0, /*46*/ + 0, /*47*/ + "con: -.con \n", /*48*/ + "con: +.con \n", /*49*/ + "con: ~.con \n", /*50*/ + 0, /*51*/ + 0, /*52*/ + 0, /*53*/ + 0, /*54*/ + 0, /*55*/ + "imm: $.con \nimm: $.nam \nimm: $.LSCONST \nimm: $.LFCONST \nimm: $.( LFCONST ) \nimm: $.- LFCONST \n", /*56*/ + 0, /*57*/ + "rimrem: rim., rem \n", /*58*/ + 0, /*59*/ + "remrim: rem., rim \n", /*60*/ + 0, /*61*/ + "nonrel: ,.rel \n", /*62*/ + 0, /*63*/ + "rel: con.( LPC ) \n", /*64*/ + 0, /*65*/ + 0, /*66*/ + "con: (.expr ) \n", /*67*/ + 0, /*68*/ + "spec1: nam./ con , imm \n", /*69*/ + 0, /*70*/ + "spec2: mem., imm \nspec2: mem., con , imm \n", /*71*/ + 0, /*72*/ + "spec3: ,.rom \n", /*73*/ + 0, /*74*/ + 0, /*75*/ + 0, /*76*/ + "rom: *.reg \nrom: *.omem \n", /*77*/ + 0, /*78*/ + 0, /*79*/ + 0, /*80*/ + 0, /*81*/ + 0, /*82*/ + 0, /*83*/ + 0, /*84*/ + 0, /*85*/ + 0, /*86*/ + 0, /*87*/ + "spec5: rim., rem \nspec5: rim., rem : LLREG \n", /*88*/ + 0, /*89*/ + "spec6: rim., rem \nspec6: rim., rem : LSREG \n", /*90*/ + 0, /*91*/ + 0, /*92*/ + 0, /*93*/ + "spec8: mem., imm \nspec8: mem., con , imm \n", /*94*/ + "line: LLAB : $$3.line \n", /*95*/ + "line: LNAME : $$5.line \n", /*96*/ + 0, /*97*/ + 0, /*98*/ + 0, /*99*/ + 0, /*100*/ + "omem: con (.LLREG ) \nomem: con (.LSP ) \nomem: con (.LLREG * con ) \nomem: con (.LLREG ) ( LLREG * con ) \nomem: con (.LSREG ) \n", /*101*/ + "omem: ( LLREG.) \nomem: ( LLREG.* con ) \nomem: ( LLREG.) ( LLREG * con ) \n", /*102*/ + "omem: ( LSP.) \n", /*103*/ + "con: ( expr.) \nexpr: expr.+ expr \nexpr: expr.- expr \nexpr: expr.* expr \nexpr: expr./ expr \nexpr: expr.% expr \nexpr: expr.< < expr \nexpr: expr.> > expr \nexpr: expr.& expr \nexpr: expr.^ expr \nexpr: expr.| expr \n", /*104*/ + "nmem: nam (.LLREG * con ) \n", /*105*/ + 0, /*106*/ + 0, /*107*/ + 0, /*108*/ + "nam: LNAME offset.( pointer ) \n", /*109*/ + "nam: LNAME <.> offset ( LSB ) \n", /*110*/ + "offset: +.con \n", /*111*/ + "offset: -.con \n", /*112*/ + 0, /*113*/ + 0, /*114*/ + 0, /*115*/ + 0, /*116*/ + 0, /*117*/ + "imm: $ (.LFCONST ) \ncon: (.expr ) \n", /*118*/ + "imm: $ -.LFCONST \ncon: -.con \n", /*119*/ + "rimrem: rim ,.rem \n", /*120*/ + "remrim: rem ,.rim \n", /*121*/ + 0, /*122*/ + "rel: con (.LPC ) \n", /*123*/ + 0, /*124*/ + 0, /*125*/ + "spec1: nam /.con , imm \n", /*126*/ + "spec2: mem ,.imm \nspec2: mem ,.con , imm \n", /*127*/ + 0, /*128*/ + 0, /*129*/ + 0, /*130*/ + "rel: con (.LPC ) \nomem: con (.LLREG ) \nomem: con (.LSP ) \nomem: con (.LLREG * con ) \nomem: con (.LLREG ) ( LLREG * con ) \nomem: con (.LSREG ) \n", /*131*/ + 0, /*132*/ + "spec5: rim ,.rem \nspec5: rim ,.rem : LLREG \n", /*133*/ + "spec6: rim ,.rem \nspec6: rim ,.rem : LSREG \n", /*134*/ + 0, /*135*/ + "spec8: mem ,.imm \nspec8: mem ,.con , imm \n", /*136*/ + 0, /*137*/ + 0, /*138*/ + "expr: expr +.expr \n", /*139*/ + "expr: expr -.expr \n", /*140*/ + "expr: expr *.expr \n", /*141*/ + "expr: expr /.expr \n", /*142*/ + "expr: expr %.expr \n", /*143*/ + "expr: expr <.< expr \n", /*144*/ + "expr: expr >.> expr \n", /*145*/ + "expr: expr &.expr \n", /*146*/ + "expr: expr ^.expr \n", /*147*/ + "expr: expr |.expr \n", /*148*/ + "omem: con ( LLREG.) \nomem: con ( LLREG.* con ) \nomem: con ( LLREG.) ( LLREG * con ) \n", /*149*/ + "omem: con ( LSP.) \n", /*150*/ + "omem: con ( LSREG.) \n", /*151*/ + 0, /*152*/ + "omem: ( LLREG *.con ) \n", /*153*/ + 0, /*154*/ + 0, /*155*/ + "nmem: nam ( LLREG.* con ) \n", /*156*/ + "nam: LNAME offset (.pointer ) \n", /*157*/ + 0, /*158*/ + 0, /*159*/ + 0, /*160*/ + "imm: $ ( LFCONST.) \n", /*161*/ + 0, /*162*/ + 0, /*163*/ + 0, /*164*/ + "rel: con ( LPC.) \n", /*165*/ + "spec1: nam / con., imm \n", /*166*/ + 0, /*167*/ + "spec2: mem , con., imm \n", /*168*/ + 0, /*169*/ + 0, /*170*/ + 0, /*171*/ + 0, /*172*/ + "spec8: mem , con., imm \n", /*173*/ + 0, /*174*/ + 0, /*175*/ + 0, /*176*/ + 0, /*177*/ + 0, /*178*/ + "expr: expr < <.expr \n", /*179*/ + "expr: expr > >.expr \n", /*180*/ + 0, /*181*/ + 0, /*182*/ + 0, /*183*/ + 0, /*184*/ + "omem: con ( LLREG *.con ) \n", /*185*/ + 0, /*186*/ + 0, /*187*/ + "omem: ( LLREG ) (.LLREG * con ) \n", /*188*/ + "omem: ( LLREG * con.) \n", /*189*/ + "nmem: nam ( LLREG *.con ) \n", /*190*/ + "nam: LNAME offset ( pointer.) \n", /*191*/ + 0, /*192*/ + 0, /*193*/ + 0, /*194*/ + "nam: LNAME < > offset.( LSB ) \n", /*195*/ + 0, /*196*/ + 0, /*197*/ + "spec1: nam / con ,.imm \n", /*198*/ + "spec2: mem , con ,.imm \n", /*199*/ + "spec5: rim , rem :.LLREG \n", /*200*/ + "spec6: rim , rem :.LSREG \n", /*201*/ + "spec8: mem , con ,.imm \n", /*202*/ + 0, /*203*/ + 0, /*204*/ + "omem: con ( LLREG ) (.LLREG * con ) \n", /*205*/ + "omem: con ( LLREG * con.) \n", /*206*/ + "omem: ( LLREG ) ( LLREG.* con ) \n", /*207*/ + 0, /*208*/ + "nmem: nam ( LLREG * con.) \n", /*209*/ + 0, /*210*/ + "nam: LNAME < > offset (.LSB ) \n", /*211*/ + 0, /*212*/ + 0, /*213*/ + 0, /*214*/ + 0, /*215*/ + 0, /*216*/ + "omem: con ( LLREG ) ( LLREG.* con ) \n", /*217*/ + 0, /*218*/ + "omem: ( LLREG ) ( LLREG *.con ) \n", /*219*/ + 0, /*220*/ + "nam: LNAME < > offset ( LSB.) \n", /*221*/ + "omem: con ( LLREG ) ( LLREG *.con ) \n", /*222*/ + "omem: ( LLREG ) ( LLREG * con.) \n", /*223*/ + 0, /*224*/ + "omem: con ( LLREG ) ( LLREG * con.) \n", /*225*/ + 0, /*226*/ + 0, /*227*/ +}; diff --git a/utils/8a/y.tab.c b/utils/8a/y.tab.c new file mode 100644 index 0000000..ce5d9c0 --- /dev/null +++ b/utils/8a/y.tab.c @@ -0,0 +1,1069 @@ + +#line 2 "a.y" +#include "a.h" + +#line 4 "a.y" +typedef union { + Sym *sym; + long lval; + struct { + long v1; + long v2; + } con2; + double dval; + char sval[8]; + Gen gen; + Gen2 gen2; +} YYSTYPE; +extern int yyerrflag; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif +YYSTYPE yylval; +YYSTYPE yyval; +#define LTYPE0 57346 +#define LTYPE1 57347 +#define LTYPE2 57348 +#define LTYPE3 57349 +#define LTYPE4 57350 +#define LTYPEC 57351 +#define LTYPED 57352 +#define LTYPEN 57353 +#define LTYPER 57354 +#define LTYPET 57355 +#define LTYPES 57356 +#define LTYPEM 57357 +#define LTYPEI 57358 +#define LTYPEG 57359 +#define LCONST 57360 +#define LFP 57361 +#define LPC 57362 +#define LSB 57363 +#define LBREG 57364 +#define LLREG 57365 +#define LSREG 57366 +#define LFREG 57367 +#define LFCONST 57368 +#define LSCONST 57369 +#define LSP 57370 +#define LNAME 57371 +#define LLAB 57372 +#define LVAR 57373 +#define YYEOFCODE 1 +#define YYERRCODE 2 +short yyexca[] = +{-1, 1, + 1, -1, + -2, 0, +}; +#define YYNPROD 121 +#define YYPRIVATE 57344 +#define yydebug 1 +#define YYLAST 529 +short yyact[] = +{ + 43, 55, 2, 109, 41, 74, 34, 56, 185, 42, + 53, 153, 227, 75, 226, 64, 224, 104, 81, 80, + 45, 220, 79, 58, 78, 218, 98, 76, 63, 98, + 88, 90, 92, 210, 208, 197, 69, 196, 187, 186, + 154, 211, 205, 97, 184, 98, 99, 152, 54, 106, + 107, 108, 188, 157, 131, 123, 105, 114, 101, 33, + 202, 199, 60, 64, 198, 136, 135, 33, 98, 124, + 125, 49, 48, 77, 81, 80, 122, 115, 79, 128, + 78, 100, 130, 76, 129, 134, 132, 133, 127, 121, + 46, 120, 113, 30, 36, 38, 40, 37, 137, 138, + 39, 82, 66, 47, 28, 215, 27, 73, 44, 26, + 56, 50, 159, 160, 24, 201, 25, 200, 23, 98, + 106, 51, 165, 217, 214, 149, 151, 166, 168, 167, + 150, 207, 164, 156, 221, 100, 165, 173, 172, 126, + 98, 98, 98, 98, 98, 149, 151, 98, 98, 98, + 150, 222, 31, 219, 189, 35, 29, 174, 175, 176, + 177, 178, 195, 190, 181, 182, 183, 180, 194, 163, + 192, 85, 71, 111, 112, 84, 158, 193, 94, 179, + 98, 98, 169, 170, 171, 6, 206, 49, 48, 77, + 96, 209, 139, 140, 141, 142, 143, 203, 204, 95, + 212, 213, 1, 93, 216, 91, 46, 141, 142, 143, + 36, 38, 40, 37, 49, 48, 39, 82, 66, 47, + 223, 89, 87, 225, 44, 83, 56, 50, 110, 72, + 111, 112, 70, 46, 68, 59, 57, 36, 38, 40, + 37, 52, 61, 39, 51, 7, 47, 191, 0, 0, + 0, 44, 0, 56, 50, 0, 0, 9, 10, 11, + 12, 13, 17, 15, 18, 14, 16, 19, 20, 21, + 22, 49, 48, 147, 146, 144, 145, 139, 140, 141, + 142, 143, 4, 3, 8, 0, 5, 0, 0, 0, + 46, 49, 48, 0, 36, 38, 40, 37, 0, 0, + 39, 51, 0, 47, 0, 0, 0, 86, 44, 0, + 46, 50, 0, 0, 36, 38, 40, 37, 49, 48, + 39, 51, 0, 47, 0, 0, 0, 32, 44, 0, + 0, 50, 0, 0, 0, 0, 0, 46, 49, 48, + 0, 36, 38, 40, 37, 0, 0, 39, 51, 0, + 47, 0, 0, 0, 0, 44, 0, 46, 50, 0, + 0, 36, 38, 40, 37, 0, 0, 39, 0, 0, + 47, 49, 119, 0, 0, 44, 0, 0, 50, 148, + 147, 146, 144, 145, 139, 140, 141, 142, 143, 0, + 46, 0, 0, 49, 48, 0, 0, 0, 117, 116, + 0, 51, 0, 47, 0, 0, 0, 0, 118, 49, + 48, 50, 46, 49, 48, 49, 48, 0, 0, 49, + 48, 0, 155, 65, 66, 47, 0, 0, 46, 62, + 67, 0, 46, 50, 46, 0, 0, 102, 46, 65, + 66, 47, 103, 49, 48, 47, 67, 47, 0, 50, + 67, 47, 67, 50, 56, 50, 67, 49, 48, 50, + 0, 0, 46, 49, 48, 0, 0, 0, 0, 0, + 162, 0, 0, 0, 0, 47, 46, 0, 0, 0, + 67, 0, 46, 50, 161, 0, 0, 0, 0, 47, + 0, 0, 0, 51, 67, 47, 0, 50, 0, 0, + 44, 0, 0, 50, 148, 147, 146, 144, 145, 139, + 140, 141, 142, 143, 146, 144, 145, 139, 140, 141, + 142, 143, 144, 145, 139, 140, 141, 142, 143 +}; +short yypact[] = +{ +-1000, 243,-1000, 76, 72,-1000, 66, 63, 60, 48, + 282, 205, 205, 309, 384, 82, 454, 62, 262, 205, + 205, 205, 454,-1000,-1000, 410,-1000,-1000, 410,-1000, +-1000,-1000, 309,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000, 12, 404, 10,-1000,-1000, 410, 410, + 410, 221,-1000, 47,-1000,-1000, 362,-1000, 46,-1000, + 44,-1000, 400,-1000, 9, 164, 164, 410,-1000, 127, +-1000, 43,-1000, 178,-1000,-1000,-1000, 329,-1000,-1000, +-1000, 8, 221,-1000,-1000,-1000, 309,-1000, 42,-1000, + 40,-1000, 21,-1000, 20, 243, 243, 500,-1000, 500, +-1000, 112, 0, -7, 375, 100,-1000,-1000,-1000, 7, + 168, 410, 410,-1000,-1000,-1000,-1000,-1000, 448, 434, + 309, 205,-1000, 106,-1000,-1000, 410, 406,-1000,-1000, +-1000, 92, 7, 309, 309, 309, 406,-1000,-1000, 410, + 410, 410, 410, 410, 172, 159, 410, 410, 410, -3, + -8, -9, 6, 410,-1000,-1000, 152, 139, 164,-1000, +-1000, -10,-1000,-1000,-1000, -12, 19,-1000, 16, 75, + 73,-1000,-1000, 15, 196, 196,-1000,-1000,-1000, 410, + 410, 515, 508, 268, -4, 410,-1000,-1000, 98, -13, + 410, -14,-1000,-1000,-1000, -5,-1000,-1000, -41, -41, + 91, 71, -41, 183, 183, 90, -22, 142,-1000, -26, +-1000, 103,-1000,-1000,-1000,-1000,-1000, 140,-1000, 410, +-1000, -31, 410, -33,-1000, -35,-1000,-1000 +}; +short yypgo[] = +{ + 0, 0, 17, 247, 3, 247, 155, 1, 247, 6, + 20, 13, 48, 10, 5, 4, 9, 156, 242, 152, + 241, 236, 235, 234, 232, 229, 225, 222, 221, 205, + 203, 202, 2, 199, 190, 185 +}; +short yyr1[] = +{ + 0, 31, 31, 33, 32, 34, 32, 32, 32, 32, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 17, 17, 21, 22, + 20, 20, 19, 19, 18, 18, 23, 24, 24, 25, + 25, 26, 26, 27, 27, 28, 28, 29, 29, 29, + 30, 30, 12, 12, 14, 14, 14, 14, 14, 14, + 14, 13, 13, 11, 11, 11, 9, 9, 9, 9, + 9, 7, 7, 7, 7, 7, 7, 8, 5, 5, + 5, 5, 6, 6, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 16, 16, 10, 10, 4, 4, + 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2 +}; +short yyr2[] = +{ + 0, 0, 2, 0, 4, 0, 4, 1, 2, 2, + 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 1, 3, 3, + 2, 1, 2, 1, 2, 1, 5, 3, 5, 2, + 1, 1, 1, 3, 5, 3, 5, 2, 1, 3, + 3, 5, 1, 1, 1, 1, 2, 2, 1, 1, + 1, 1, 1, 4, 2, 2, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 4, 3, 2, 1, 2, + 3, 4, 1, 1, 1, 4, 4, 6, 9, 3, + 3, 4, 5, 8, 1, 6, 5, 7, 0, 2, + 2, 1, 1, 1, 1, 1, 2, 2, 2, 3, + 1, 3, 3, 3, 3, 3, 4, 4, 3, 3, + 3 +}; +short yychk[] = +{ +-1000, -31, -32, 40, 39, 43, -35, 2, 41, 14, + 15, 16, 17, 18, 22, 20, 23, 19, 21, 24, + 25, 26, 27, 42, 42, 44, 43, 43, 44, -17, + 45, -19, 45, -12, -9, -6, 32, 35, 33, 38, + 34, -15, -16, -1, 46, -10, 28, 41, 10, 9, + 49, 39, -20, -13, -12, -7, 48, -21, -13, -22, + -12, -18, 45, -11, -1, 39, 40, 46, -23, -10, + -24, -6, -25, 45, -14, -11, -16, 11, -9, -15, + -7, -1, 39, -26, -17, -19, 45, -27, -13, -28, + -13, -29, -13, -30, -6, -33, -34, -2, -1, -2, + -12, 46, 33, 38, -2, 46, -1, -1, -1, -4, + 7, 9, 10, 45, -1, -10, 37, 36, 46, 10, + 45, 45, -11, 46, -4, -4, 12, 45, -14, -9, + -15, 46, -4, 45, 45, 45, 45, -32, -32, 9, + 10, 11, 12, 13, 7, 8, 6, 5, 4, 33, + 38, 34, 47, 11, 47, 47, 33, 46, 8, -1, + -1, 36, 36, -12, -13, 30, -1, -7, -1, -12, + -12, -12, -7, -1, -2, -2, -2, -2, -2, 7, + 8, -2, -2, -2, 47, 11, 47, 47, 46, -1, + 11, -3, 31, 38, 29, -4, 47, 47, 45, 45, + 42, 42, 45, -2, -2, 46, -1, 33, 47, -1, + 47, 46, -7, -7, 33, 34, -7, 33, 47, 11, + 47, 31, 11, -1, 47, -1, 47, 47 +}; +short yydef[] = +{ + 1, -2, 2, 0, 0, 7, 0, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 3, 5, 0, 8, 9, 0, 12, + 27, 13, 0, 33, 52, 53, 66, 67, 68, 69, + 70, 82, 83, 84, 0, 94, 104, 105, 0, 0, + 0, 98, 14, 31, 61, 62, 0, 15, 0, 16, + 0, 17, 0, 35, 0, 98, 98, 0, 18, 0, + 19, 0, 20, 0, 40, 54, 55, 0, 58, 59, + 60, 84, 98, 21, 41, 42, 27, 22, 0, 23, + 0, 24, 48, 25, 0, 0, 0, 10, 110, 11, + 32, 0, 0, 0, 0, 0, 106, 107, 108, 0, + 0, 0, 0, 30, 71, 72, 73, 74, 0, 0, + 0, 0, 34, 0, 64, 65, 0, 0, 39, 56, + 57, 0, 64, 0, 0, 47, 0, 4, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 89, 0, 90, 109, 0, 0, 98, 99, + 100, 0, 76, 28, 29, 0, 0, 37, 0, 43, + 45, 49, 50, 0, 111, 112, 113, 114, 115, 0, + 0, 118, 119, 120, 85, 0, 86, 91, 0, 0, + 0, 0, 101, 102, 103, 0, 75, 63, 0, 0, + 0, 0, 0, 116, 117, 0, 0, 0, 92, 0, + 96, 0, 36, 38, 44, 46, 51, 0, 87, 0, + 95, 0, 0, 0, 97, 0, 93, 88 +}; +short yytok1[] = +{ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 13, 6, 0, + 46, 47, 11, 9, 45, 10, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, + 7, 44, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 49 +}; +short yytok2[] = +{ + 2, 3, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41 +}; +long yytok3[] = +{ + 0 +}; +#define YYFLAG -1000 +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 + +#ifdef yydebug +#include "y.debug" +#else +#define yydebug 0 +char* yytoknames[1]; /* for debugging */ +char* yystates[1]; /* for debugging */ +#endif + +/* parser for yacc output */ + +int yynerrs = 0; /* number of errors */ +int yyerrflag = 0; /* error recovery flag */ + +extern int fprint(int, char*, ...); +extern int sprint(char*, char*, ...); + +char* +yytokname(int yyc) +{ + static char x[16]; + + if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) + if(yytoknames[yyc-1]) + return yytoknames[yyc-1]; + sprint(x, "<%d>", yyc); + return x; +} + +char* +yystatname(int yys) +{ + static char x[16]; + + if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) + if(yystates[yys]) + return yystates[yys]; + sprint(x, "<%d>\n", yys); + return x; +} + +long +yylex1(void) +{ + long yychar; + long *t3p; + int c; + + yychar = yylex(); + if(yychar <= 0) { + c = yytok1[0]; + goto out; + } + if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { + c = yytok1[yychar]; + goto out; + } + if(yychar >= YYPRIVATE) + if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { + c = yytok2[yychar-YYPRIVATE]; + goto out; + } + for(t3p=yytok3;; t3p+=2) { + c = t3p[0]; + if(c == yychar) { + c = t3p[1]; + goto out; + } + if(c == 0) + break; + } + c = 0; + +out: + if(c == 0) + c = yytok2[1]; /* unknown char */ + if(yydebug >= 3) + fprint(2, "lex %.4lux %s\n", yychar, yytokname(c)); + return c; +} + +int +yyparse(void) +{ + struct + { + YYSTYPE yyv; + int yys; + } yys[YYMAXDEPTH], *yyp, *yypt; + short *yyxi; + int yyj, yym, yystate, yyn, yyg; + long yychar; + YYSTYPE save1, save2; + int save3, save4; + + save1 = yylval; + save2 = yyval; + save3 = yynerrs; + save4 = yyerrflag; + + yystate = 0; + yychar = -1; + yynerrs = 0; + yyerrflag = 0; + yyp = &yys[-1]; + goto yystack; + +ret0: + yyn = 0; + goto ret; + +ret1: + yyn = 1; + goto ret; + +ret: + yylval = save1; + yyval = save2; + yynerrs = save3; + yyerrflag = save4; + return yyn; + +yystack: + /* put a state and value onto the stack */ + if(yydebug >= 4) + fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate)); + + yyp++; + if(yyp >= &yys[YYMAXDEPTH]) { + yyerror("yacc stack overflow"); + goto ret1; + } + yyp->yys = yystate; + yyp->yyv = yyval; + +yynewstate: + yyn = yypact[yystate]; + if(yyn <= YYFLAG) + goto yydefault; /* simple state */ + if(yychar < 0) + yychar = yylex1(); + yyn += yychar; + if(yyn < 0 || yyn >= YYLAST) + goto yydefault; + yyn = yyact[yyn]; + if(yychk[yyn] == yychar) { /* valid shift */ + yychar = -1; + yyval = yylval; + yystate = yyn; + if(yyerrflag > 0) + yyerrflag--; + goto yystack; + } + +yydefault: + /* default state action */ + yyn = yydef[yystate]; + if(yyn == -2) { + if(yychar < 0) + yychar = yylex1(); + + /* look through exception table */ + for(yyxi=yyexca;; yyxi+=2) + if(yyxi[0] == -1 && yyxi[1] == yystate) + break; + for(yyxi += 2;; yyxi += 2) { + yyn = yyxi[0]; + if(yyn < 0 || yyn == yychar) + break; + } + yyn = yyxi[1]; + if(yyn < 0) + goto ret0; + } + if(yyn == 0) { + /* error ... attempt to resume parsing */ + switch(yyerrflag) { + case 0: /* brand new error */ + yyerror("syntax error"); + yynerrs++; + if(yydebug >= 1) { + fprint(2, "%s", yystatname(yystate)); + fprint(2, "saw %s\n", yytokname(yychar)); + } + + case 1: + case 2: /* incompletely recovered error ... try again */ + yyerrflag = 3; + + /* find a state where "error" is a legal shift action */ + while(yyp >= yys) { + yyn = yypact[yyp->yys] + YYERRCODE; + if(yyn >= 0 && yyn < YYLAST) { + yystate = yyact[yyn]; /* simulate a shift of "error" */ + if(yychk[yystate] == YYERRCODE) + goto yystack; + } + + /* the current yyp has no shift onn "error", pop stack */ + if(yydebug >= 2) + fprint(2, "error recovery pops state %d, uncovers %d\n", + yyp->yys, (yyp-1)->yys ); + yyp--; + } + /* there is no state on the stack with an error shift ... abort */ + goto ret1; + + case 3: /* no shift yet; clobber input char */ + if(yydebug >= 2) + fprint(2, "error recovery discards %s\n", yytokname(yychar)); + if(yychar == YYEOFCODE) + goto ret1; + yychar = -1; + goto yynewstate; /* try again in the same state */ + } + } + + /* reduction by production yyn */ + if(yydebug >= 2) + fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate)); + + yypt = yyp; + yyp -= yyr2[yyn]; + yyval = (yyp+1)->yyv; + yym = yyn; + + /* consult goto table to find next state */ + yyn = yyr1[yyn]; + yyg = yypgo[yyn]; + yyj = yyg + yyp->yys + 1; + + if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) + yystate = yyact[yyg]; + switch(yym) { + +case 3: +#line 40 "a.y" +{ + if(yypt[-1].yyv.sym->value != pc) + yyerror("redeclaration of %s", yypt[-1].yyv.sym->name); + yypt[-1].yyv.sym->value = pc; + } break; +case 5: +#line 47 "a.y" +{ + yypt[-1].yyv.sym->type = LLAB; + yypt[-1].yyv.sym->value = pc; + } break; +case 10: +#line 58 "a.y" +{ + yypt[-2].yyv.sym->type = LVAR; + yypt[-2].yyv.sym->value = yypt[-0].yyv.lval; + } break; +case 11: +#line 63 "a.y" +{ + if(yypt[-2].yyv.sym->value != yypt[-0].yyv.lval) + yyerror("redeclaration of %s", yypt[-2].yyv.sym->name); + yypt[-2].yyv.sym->value = yypt[-0].yyv.lval; + } break; +case 12: +#line 68 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 13: +#line 69 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 14: +#line 70 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 15: +#line 71 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 16: +#line 72 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 17: +#line 73 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 18: +#line 74 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 19: +#line 75 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 20: +#line 76 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 21: +#line 77 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 22: +#line 78 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 23: +#line 79 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 24: +#line 80 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 25: +#line 81 "a.y" +{ outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; +case 26: +#line 84 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = nullgen; + } break; +case 27: +#line 89 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = nullgen; + } break; +case 28: +#line 96 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 29: +#line 103 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 30: +#line 110 "a.y" +{ + yyval.gen2.from = yypt[-1].yyv.gen; + yyval.gen2.to = nullgen; + } break; +case 31: +#line 115 "a.y" +{ + yyval.gen2.from = yypt[-0].yyv.gen; + yyval.gen2.to = nullgen; + } break; +case 32: +#line 122 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 33: +#line 127 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 34: +#line 134 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 35: +#line 139 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 36: +#line 146 "a.y" +{ + yyval.gen2.from = yypt[-4].yyv.gen; + yyval.gen2.from.scale = yypt[-2].yyv.lval; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 37: +#line 154 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 38: +#line 159 "a.y" +{ + yyval.gen2.from = yypt[-4].yyv.gen; + yyval.gen2.from.scale = yypt[-2].yyv.lval; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 39: +#line 167 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 40: +#line 172 "a.y" +{ + yyval.gen2.from = nullgen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 43: +#line 183 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 44: +#line 188 "a.y" +{ + yyval.gen2.from = yypt[-4].yyv.gen; + yyval.gen2.to = yypt[-2].yyv.gen; + if(yyval.gen2.from.index != D_NONE) + yyerror("dp shift with lhs index"); + yyval.gen2.from.index = yypt[-0].yyv.lval; + } break; +case 45: +#line 198 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 46: +#line 203 "a.y" +{ + yyval.gen2.from = yypt[-4].yyv.gen; + yyval.gen2.to = yypt[-2].yyv.gen; + if(yyval.gen2.to.index != D_NONE) + yyerror("dp move with lhs index"); + yyval.gen2.to.index = yypt[-0].yyv.lval; + } break; +case 47: +#line 213 "a.y" +{ + yyval.gen2.from = yypt[-1].yyv.gen; + yyval.gen2.to = nullgen; + } break; +case 48: +#line 218 "a.y" +{ + yyval.gen2.from = yypt[-0].yyv.gen; + yyval.gen2.to = nullgen; + } break; +case 49: +#line 223 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 50: +#line 230 "a.y" +{ + yyval.gen2.from = yypt[-2].yyv.gen; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 51: +#line 235 "a.y" +{ + yyval.gen2.from = yypt[-4].yyv.gen; + yyval.gen2.from.scale = yypt[-2].yyv.lval; + yyval.gen2.to = yypt[-0].yyv.gen; + } break; +case 56: +#line 249 "a.y" +{ + yyval.gen = yypt[-0].yyv.gen; + } break; +case 57: +#line 253 "a.y" +{ + yyval.gen = yypt[-0].yyv.gen; + } break; +case 63: +#line 266 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_BRANCH; + yyval.gen.offset = yypt[-3].yyv.lval + pc; + } break; +case 64: +#line 272 "a.y" +{ + yyval.gen = nullgen; + if(pass == 2) + yyerror("undefined label: %s", yypt[-1].yyv.sym->name); + yyval.gen.type = D_BRANCH; + yyval.gen.sym = yypt[-1].yyv.sym; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 65: +#line 281 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_BRANCH; + yyval.gen.sym = yypt[-1].yyv.sym; + yyval.gen.offset = yypt[-1].yyv.sym->value + yypt[-0].yyv.lval; + } break; +case 66: +#line 290 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-0].yyv.lval; + } break; +case 67: +#line 295 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-0].yyv.lval; + } break; +case 68: +#line 300 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-0].yyv.lval; + } break; +case 69: +#line 305 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SP; + } break; +case 70: +#line 310 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-0].yyv.lval; + } break; +case 71: +#line 317 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CONST; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 72: +#line 323 "a.y" +{ + yyval.gen = yypt[-0].yyv.gen; + yyval.gen.index = yypt[-0].yyv.gen.type; + yyval.gen.type = D_ADDR; + /* + if($2.type == D_AUTO || $2.type == D_PARAM) + yyerror("constant cannot be automatic: %s", + $2.sym->name); + */ + } break; +case 73: +#line 334 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SCONST; + memcpy(yyval.gen.sval, yypt[-0].yyv.sval, sizeof(yyval.gen.sval)); + } break; +case 74: +#line 340 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FCONST; + yyval.gen.dval = yypt[-0].yyv.dval; + } break; +case 75: +#line 346 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FCONST; + yyval.gen.dval = yypt[-1].yyv.dval; + } break; +case 76: +#line 352 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FCONST; + yyval.gen.dval = -yypt[-0].yyv.dval; + } break; +case 77: +#line 360 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CONST2; + yyval.gen.offset = yypt[-0].yyv.con2.v1; + yyval.gen.offset2 = yypt[-0].yyv.con2.v2; + } break; +case 78: +#line 369 "a.y" +{ + yyval.con2.v1 = yypt[-0].yyv.lval; + yyval.con2.v2 = 0; + } break; +case 79: +#line 374 "a.y" +{ + yyval.con2.v1 = -yypt[-0].yyv.lval; + yyval.con2.v2 = 0; + } break; +case 80: +#line 379 "a.y" +{ + yyval.con2.v1 = yypt[-2].yyv.lval; + yyval.con2.v2 = yypt[-0].yyv.lval; + } break; +case 81: +#line 384 "a.y" +{ + yyval.con2.v1 = -yypt[-2].yyv.lval; + yyval.con2.v2 = yypt[-0].yyv.lval; + } break; +case 84: +#line 395 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+D_NONE; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 85: +#line 401 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 86: +#line 407 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+D_SP; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 87: +#line 413 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+D_NONE; + yyval.gen.offset = yypt[-5].yyv.lval; + yyval.gen.index = yypt[-3].yyv.lval; + yyval.gen.scale = yypt[-1].yyv.lval; + checkscale(yyval.gen.scale); + } break; +case 88: +#line 422 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+yypt[-6].yyv.lval; + yyval.gen.offset = yypt[-8].yyv.lval; + yyval.gen.index = yypt[-3].yyv.lval; + yyval.gen.scale = yypt[-1].yyv.lval; + checkscale(yyval.gen.scale); + } break; +case 89: +#line 431 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; + } break; +case 90: +#line 436 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+D_SP; + } break; +case 91: +#line 441 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 92: +#line 447 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+D_NONE; + yyval.gen.index = yypt[-3].yyv.lval; + yyval.gen.scale = yypt[-1].yyv.lval; + checkscale(yyval.gen.scale); + } break; +case 93: +#line 455 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_INDIR+yypt[-6].yyv.lval; + yyval.gen.index = yypt[-3].yyv.lval; + yyval.gen.scale = yypt[-1].yyv.lval; + checkscale(yyval.gen.scale); + } break; +case 94: +#line 465 "a.y" +{ + yyval.gen = yypt[-0].yyv.gen; + } break; +case 95: +#line 469 "a.y" +{ + yyval.gen = yypt[-5].yyv.gen; + yyval.gen.index = yypt[-3].yyv.lval; + yyval.gen.scale = yypt[-1].yyv.lval; + checkscale(yyval.gen.scale); + } break; +case 96: +#line 478 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-1].yyv.lval; + yyval.gen.sym = yypt[-4].yyv.sym; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 97: +#line 485 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_STATIC; + yyval.gen.sym = yypt[-6].yyv.sym; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 98: +#line 493 "a.y" +{ + yyval.lval = 0; + } break; +case 99: +#line 497 "a.y" +{ + yyval.lval = yypt[-0].yyv.lval; + } break; +case 100: +#line 501 "a.y" +{ + yyval.lval = -yypt[-0].yyv.lval; + } break; +case 102: +#line 508 "a.y" +{ + yyval.lval = D_AUTO; + } break; +case 105: +#line 516 "a.y" +{ + yyval.lval = yypt[-0].yyv.sym->value; + } break; +case 106: +#line 520 "a.y" +{ + yyval.lval = -yypt[-0].yyv.lval; + } break; +case 107: +#line 524 "a.y" +{ + yyval.lval = yypt[-0].yyv.lval; + } break; +case 108: +#line 528 "a.y" +{ + yyval.lval = ~yypt[-0].yyv.lval; + } break; +case 109: +#line 532 "a.y" +{ + yyval.lval = yypt[-1].yyv.lval; + } break; +case 111: +#line 539 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval + yypt[-0].yyv.lval; + } break; +case 112: +#line 543 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval - yypt[-0].yyv.lval; + } break; +case 113: +#line 547 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval * yypt[-0].yyv.lval; + } break; +case 114: +#line 551 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval / yypt[-0].yyv.lval; + } break; +case 115: +#line 555 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval % yypt[-0].yyv.lval; + } break; +case 116: +#line 559 "a.y" +{ + yyval.lval = yypt[-3].yyv.lval << yypt[-0].yyv.lval; + } break; +case 117: +#line 563 "a.y" +{ + yyval.lval = yypt[-3].yyv.lval >> yypt[-0].yyv.lval; + } break; +case 118: +#line 567 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval & yypt[-0].yyv.lval; + } break; +case 119: +#line 571 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval ^ yypt[-0].yyv.lval; + } break; +case 120: +#line 575 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval | yypt[-0].yyv.lval; + } break; + } + goto yystack; /* stack new state and value */ +} diff --git a/utils/8a/y.tab.h b/utils/8a/y.tab.h new file mode 100644 index 0000000..0e910a1 --- /dev/null +++ b/utils/8a/y.tab.h @@ -0,0 +1,42 @@ + +typedef union { + Sym *sym; + long lval; + struct { + long v1; + long v2; + } con2; + double dval; + char sval[8]; + Gen gen; + Gen2 gen2; +} YYSTYPE; +extern YYSTYPE yylval; +#define LTYPE0 57346 +#define LTYPE1 57347 +#define LTYPE2 57348 +#define LTYPE3 57349 +#define LTYPE4 57350 +#define LTYPEC 57351 +#define LTYPED 57352 +#define LTYPEN 57353 +#define LTYPER 57354 +#define LTYPET 57355 +#define LTYPES 57356 +#define LTYPEM 57357 +#define LTYPEI 57358 +#define LTYPEG 57359 +#define LCONST 57360 +#define LFP 57361 +#define LPC 57362 +#define LSB 57363 +#define LBREG 57364 +#define LLREG 57365 +#define LSREG 57366 +#define LFREG 57367 +#define LFCONST 57368 +#define LSCONST 57369 +#define LSP 57370 +#define LNAME 57371 +#define LLAB 57372 +#define LVAR 57373 |
