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/qa | |
inferno-os tree was separated from the inferno-os-android (separated from the Android driver)
Diffstat (limited to 'utils/qa')
| -rw-r--r-- | utils/qa/a.h | 199 | ||||
| -rw-r--r-- | utils/qa/a.y | 998 | ||||
| -rw-r--r-- | utils/qa/lex.c | 940 | ||||
| -rw-r--r-- | utils/qa/mkfile | 29 | ||||
| -rw-r--r-- | utils/qa/y.debug | 561 | ||||
| -rw-r--r-- | utils/qa/y.tab.c | 1644 | ||||
| -rw-r--r-- | utils/qa/y.tab.h | 70 |
7 files changed, 4441 insertions, 0 deletions
diff --git a/utils/qa/a.h b/utils/qa/a.h new file mode 100644 index 0000000..f7fce23 --- /dev/null +++ b/utils/qa/a.h @@ -0,0 +1,199 @@ +#include <lib9.h> +#include <bio.h> +#include "../qc/q.out.h" + +#ifndef EXTERN +#define EXTERN extern +#endif + +typedef struct Sym Sym; +typedef struct Gen Gen; +typedef struct Io Io; +typedef struct Hist Hist; + +#define MAXALIGN 7 +#define FPCHIP 1 +#define NSYMB 8192 +#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 + +#define ALLOC(lhs, type)\ + while(nhunk < sizeof(type))\ + gethunk();\ + lhs = (type*)hunk;\ + nhunk -= sizeof(type);\ + hunk += sizeof(type); + +#define ALLOCN(lhs, len, n)\ + if(lhs+len != hunk || nhunk < n) {\ + while(nhunk <= len)\ + gethunk();\ + memmove(hunk, lhs, len);\ + lhs = hunk;\ + hunk += len;\ + nhunk -= len;\ + }\ + hunk += n;\ + nhunk -= n; + +struct Sym +{ + Sym* link; + char* macro; + long value; + ushort type; + char *name; + char sym; +}; +#define S ((Sym*)0) + +struct +{ + char* p; + int c; +} fi; + +struct Io +{ + Io* link; + char b[BUFSIZ]; + char* p; + short c; + short f; +}; +#define I ((Io*)0) + +struct +{ + Sym* sym; + short type; +} h[NSYM]; + +struct Gen +{ + Sym* sym; + long offset; + short type; + short reg; + short xreg; + short name; + ushort mask; + double dval; + char sval[8]; +}; + +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 nosched; +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 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 pinit(char*); +void cclean(void); +void outcode(int, Gen*, int, Gen*); +void outgcode(int, Gen*, int, Gen*, Gen*); +void zname(char*, int, int); +void zaddr(Gen*, 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 outhist(void); +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/qa/a.y b/utils/qa/a.y new file mode 100644 index 0000000..ee42594 --- /dev/null +++ b/utils/qa/a.y @@ -0,0 +1,998 @@ +%{ +#include "a.h" +%} +%union +{ + Sym *sym; + long lval; + double dval; + char sval[8]; + Gen gen; +} +%left '|' +%left '^' +%left '&' +%left '<' '>' +%left '+' '-' +%left '*' '/' '%' +%token <lval> LMOVW LMOVB LABS LLOGW LSHW LADDW LCMP LCROP +%token <lval> LBRA LFMOV LFCONV LFCMP LFADD LFMA LTRAP LXORW +%token <lval> LNOP LEND LRETT LWORD LTEXT LDATA LRETRN +%token <lval> LCONST LSP LSB LFP LPC LCREG LFLUSH +%token <lval> LREG LFREG LR LCR LF LFPSCR +%token <lval> LLR LCTR LSPR LSPREG LSEG LMSR LDCR +%token <lval> LSCHED LXLD LXST LXOP LXMV +%token <lval> LRLWM LMOVMW LMOVEM LMOVFL LMTFSB LMA LFMOVX +%token <dval> LFCONST +%token <sval> LSCONST +%token <sym> LNAME LLAB LVAR +%type <lval> con expr pointer offset sreg +%type <gen> addr rreg regaddr name creg freg xlreg lr ctr +%type <gen> imm ximm fimm rel psr lcr cbit fpscr fpscrf seg msr mask +%% +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 +| LNAME '=' expr ';' + { + $1->type = LVAR; + $1->value = $3; + } +| LVAR '=' expr ';' + { + if($1->value != $3) + yyerror("redeclaration of %s", $1->name); + $1->value = $3; + } +| LSCHED ';' + { + nosched = $1; + } +| ';' +| inst ';' +| error ';' + +inst: +/* + * load ints and bytes + */ + LMOVW rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW addr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW regaddr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVB rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVB addr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVB regaddr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +/* + * load and store floats + */ +| LFMOV addr ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFMOV regaddr ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFMOV fimm ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFMOV freg ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFMOV freg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +| LFMOV freg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +/* + * load and store floats, indexed only + */ +| LFMOVX regaddr ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFMOVX freg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +/* + * store ints and bytes + */ +| LMOVW rreg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW rreg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVB rreg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVB rreg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +/* + * store floats + */ +| LMOVW freg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW freg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +/* + * floating point status + */ +| LMOVW fpscr ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW freg ',' fpscr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW freg ',' imm ',' fpscr + { + outgcode($1, &$2, NREG, &$4, &$6); + } +| LMOVW fpscr ',' creg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW imm ',' fpscrf + { + outcode($1, &$2, NREG, &$4); + } +| LMTFSB imm ',' con + { + outcode($1, &$2, $4, &nullgen); + } +/* + * field moves (mtcrf) + */ +| LMOVW rreg ',' imm ',' lcr + { + outgcode($1, &$2, NREG, &$4, &$6); + } +| LMOVW rreg ',' creg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW rreg ',' lcr + { + outcode($1, &$2, NREG, &$4); + } +/* + * integer operations + * logical instructions + * shift instructions + * unary instructions + */ +| LADDW rreg ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +| LADDW imm ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +| LADDW rreg ',' imm ',' rreg + { + outgcode($1, &$2, NREG, &$4, &$6); + } +| LADDW rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LADDW imm ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LLOGW rreg ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +| LLOGW rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LSHW rreg ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +| LSHW rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LSHW imm ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +| LSHW imm ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LABS rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LABS rreg + { + outcode($1, &$2, NREG, &$2); + } +/* + * multiply-accumulate + */ +| LMA rreg ',' sreg ',' rreg + { + outcode($1, &$2, $4, &$6); + } +/* + * move immediate: macro for cau+or, addi, addis, and other combinations + */ +| LMOVW imm ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW ximm ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +/* + * condition register operations + */ +| LCROP cbit ',' cbit + { + outcode($1, &$2, $4.reg, &$4); + } +| LCROP cbit ',' con ',' cbit + { + outcode($1, &$2, $4, &$6); + } +/* + * condition register moves + * move from machine state register + */ +| LMOVW creg ',' creg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW psr ',' creg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW lcr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW psr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW seg ',' rreg + { + int r; + r = $2.offset; + $2.offset = 0; + outcode($1, &$2, r, &$4); + } +| LMOVW rreg ',' seg + { + int r; + r = $4.offset; + $4.offset = 0; + outcode($1, &$2, r, &$4); + } +| LMOVW xlreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW rreg ',' xlreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW creg ',' psr + { + outcode($1, &$2, NREG, &$4); + } +| LMOVW rreg ',' psr + { + outcode($1, &$2, NREG, &$4); + } +/* + * branch, branch conditional + * branch conditional register + * branch conditional to count register + */ +| LBRA rel + { + outcode($1, &nullgen, NREG, &$2); + } +| LBRA addr + { + outcode($1, &nullgen, NREG, &$2); + } +| LBRA '(' xlreg ')' + { + outcode($1, &nullgen, NREG, &$3); + } +| LBRA ',' rel + { + outcode($1, &nullgen, NREG, &$3); + } +| LBRA ',' addr + { + outcode($1, &nullgen, NREG, &$3); + } +| LBRA ',' '(' xlreg ')' + { + outcode($1, &nullgen, NREG, &$4); + } +| LBRA creg ',' rel + { + outcode($1, &$2, NREG, &$4); + } +| LBRA creg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +| LBRA creg ',' '(' xlreg ')' + { + outcode($1, &$2, NREG, &$5); + } +| LBRA con ',' rel + { + outcode($1, &nullgen, $2, &$4); + } +| LBRA con ',' addr + { + outcode($1, &nullgen, $2, &$4); + } +| LBRA con ',' '(' xlreg ')' + { + outcode($1, &nullgen, $2, &$5); + } +| LBRA con ',' con ',' rel + { + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = $2; + outcode($1, &g, $4, &$6); + } +| LBRA con ',' con ',' addr + { + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = $2; + outcode($1, &g, $4, &$6); + } +| LBRA con ',' con ',' '(' xlreg ')' + { + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = $2; + outcode($1, &g, $4, &$7); + } +/* + * conditional trap + */ +| LTRAP rreg ',' sreg + { + outcode($1, &$2, $4, &nullgen); + } +| LTRAP imm ',' sreg + { + outcode($1, &$2, $4, &nullgen); + } +| LTRAP rreg comma + { + outcode($1, &$2, NREG, &nullgen); + } +| LTRAP comma + { + outcode($1, &nullgen, NREG, &nullgen); + } +/* + * floating point operate + */ +| LFCONV freg ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFADD freg ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFADD freg ',' freg ',' freg + { + outcode($1, &$2, $4.reg, &$6); + } +| LFMA freg ',' freg ',' freg ',' freg + { + outgcode($1, &$2, $4.reg, &$6, &$8); + } +| LFCMP freg ',' freg + { + outcode($1, &$2, NREG, &$4); + } +| LFCMP freg ',' freg ',' creg + { + outcode($1, &$2, $6.reg, &$4); + } +/* + * CMP + */ +| LCMP rreg ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LCMP rreg ',' imm + { + outcode($1, &$2, NREG, &$4); + } +| LCMP rreg ',' rreg ',' creg + { + outcode($1, &$2, $6.reg, &$4); + } +| LCMP rreg ',' imm ',' creg + { + outcode($1, &$2, $6.reg, &$4); + } +/* + * rotate and mask + */ +| LRLWM imm ',' rreg ',' imm ',' rreg + { + outgcode($1, &$2, $4.reg, &$6, &$8); + } +| LRLWM imm ',' rreg ',' mask ',' rreg + { + outgcode($1, &$2, $4.reg, &$6, &$8); + } +| LRLWM rreg ',' rreg ',' imm ',' rreg + { + outgcode($1, &$2, $4.reg, &$6, &$8); + } +| LRLWM rreg ',' rreg ',' mask ',' rreg + { + outgcode($1, &$2, $4.reg, &$6, &$8); + } +/* + * load/store multiple + */ +| LMOVMW addr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LMOVMW rreg ',' addr + { + outcode($1, &$2, NREG, &$4); + } +/* + * various indexed load/store + * indexed unary (eg, cache clear) + */ +| LXLD regaddr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LXLD regaddr ',' imm ',' rreg + { + outgcode($1, &$2, NREG, &$4, &$6); + } +| LXST rreg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +| LXST rreg ',' imm ',' regaddr + { + outgcode($1, &$2, NREG, &$4, &$6); + } +| LXMV regaddr ',' rreg + { + outcode($1, &$2, NREG, &$4); + } +| LXMV rreg ',' regaddr + { + outcode($1, &$2, NREG, &$4); + } +| LXOP regaddr + { + outcode($1, &$2, NREG, &nullgen); + } +/* + * NOP + */ +| LNOP comma + { + outcode($1, &nullgen, NREG, &nullgen); + } +| LNOP rreg comma + { + outcode($1, &$2, NREG, &nullgen); + } +| LNOP freg comma + { + outcode($1, &$2, NREG, &nullgen); + } +| LNOP ',' rreg + { + outcode($1, &nullgen, NREG, &$3); + } +| LNOP ',' freg + { + outcode($1, &nullgen, NREG, &$3); + } +/* + * word + */ +| LWORD imm comma + { + outcode($1, &$2, NREG, &nullgen); + } +| LWORD ximm comma + { + outcode($1, &$2, NREG, &nullgen); + } +/* + * END + */ +| LEND comma + { + outcode($1, &nullgen, NREG, &nullgen); + } +/* + * TEXT/GLOBL + */ +| LTEXT name ',' imm + { + outcode($1, &$2, NREG, &$4); + } +| LTEXT name ',' con ',' imm + { + outcode($1, &$2, $4, &$6); + } +| LTEXT name ',' imm ':' imm + { + outgcode($1, &$2, NREG, &$6, &$4); + } +| LTEXT name ',' con ',' imm ':' imm + { + outgcode($1, &$2, $4, &$8, &$6); + } +/* + * DATA + */ +| LDATA name '/' con ',' imm + { + outcode($1, &$2, $4, &$6); + } +| LDATA name '/' con ',' ximm + { + outcode($1, &$2, $4, &$6); + } +| LDATA name '/' con ',' fimm + { + outcode($1, &$2, $4, &$6); + } +/* + * RETURN + */ +| LRETRN comma + { + outcode($1, &nullgen, NREG, &nullgen); + } + +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; + } + +rreg: + sreg + { + $$ = nullgen; + $$.type = D_REG; + $$.reg = $1; + } + +xlreg: + lr +| ctr + +lr: + LLR + { + $$ = nullgen; + $$.type = D_SPR; + $$.offset = $1; + } + +lcr: + LCR + { + $$ = nullgen; + $$.type = D_CREG; + $$.reg = NREG; /* whole register */ + } + +ctr: + LCTR + { + $$ = nullgen; + $$.type = D_SPR; + $$.offset = $1; + } + +msr: + LMSR + { + $$ = nullgen; + $$.type = D_MSR; + } + +psr: + LSPREG + { + $$ = nullgen; + $$.type = D_SPR; + $$.offset = $1; + } +| LSPR '(' con ')' + { + $$ = nullgen; + $$.type = $1; + $$.offset = $3; + } +| LDCR '(' con ')' + { + $$ = nullgen; + $$.type = $1; + $$.offset = $3; + } +| LDCR '(' sreg ')' + { + $$ = nullgen; + $$.type = $1; + $$.reg = $3; + $$.offset = 0; + } +| msr + +seg: + LSEG '(' con ')' + { + if($3 < 0 || $3 > 15) + yyerror("segment register number out of range"); + $$ = nullgen; + $$.type = D_SREG; + $$.reg = $3; + $$.offset = NREG; + } +| LSEG '(' sreg ')' + { + $$ = nullgen; + $$.type = D_SREG; + $$.reg = NREG; + $$.offset = $3; + } + +fpscr: + LFPSCR + { + $$ = nullgen; + $$.type = D_FPSCR; + $$.reg = NREG; + } + +fpscrf: + LFPSCR '(' con ')' + { + $$ = nullgen; + $$.type = D_FPSCR; + $$.reg = $3; + } + +freg: + LFREG + { + $$ = nullgen; + $$.type = D_FREG; + $$.reg = $1; + } +| LF '(' con ')' + { + $$ = nullgen; + $$.type = D_FREG; + $$.reg = $3; + } + +creg: + LCREG + { + $$ = nullgen; + $$.type = D_CREG; + $$.reg = $1; + } +| LCR '(' con ')' + { + $$ = nullgen; + $$.type = D_CREG; + $$.reg = $3; + } + + +cbit: con + { + $$ = nullgen; + $$.type = D_REG; + $$.reg = $1; + } + +mask: + con ',' con + { + int mb, me; + ulong v; + + $$ = nullgen; + $$.type = D_CONST; + mb = $1; + me = $3; + if(mb < 0 || mb > 31 || me < 0 || me > 31){ + yyerror("illegal mask start/end value(s)"); + mb = me = 0; + } + if(mb <= me) + v = ((ulong)~0L>>mb) & (~0L<<(31-me)); + else + v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1)))); + $$.offset = v; + } + +ximm: + '$' addr + { + $$ = $2; + $$.type = D_CONST; + } +| '$' LSCONST + { + $$ = nullgen; + $$.type = D_SCONST; + memcpy($$.sval, $2, sizeof($$.sval)); + } + +fimm: + '$' LFCONST + { + $$ = nullgen; + $$.type = D_FCONST; + $$.dval = $2; + } +| '$' '-' LFCONST + { + $$ = nullgen; + $$.type = D_FCONST; + $$.dval = -$3; + } + +imm: '$' con + { + $$ = nullgen; + $$.type = D_CONST; + $$.offset = $2; + } + +sreg: + LREG +| LR '(' con ')' + { + if($$ < 0 || $$ >= NREG) + print("register value out of range\n"); + $$ = $3; + } + +regaddr: + '(' sreg ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.reg = $2; + $$.offset = 0; + } +| '(' sreg '+' sreg ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.reg = $2; + $$.xreg = $4; + $$.offset = 0; + } + +addr: + name +| con '(' sreg ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.reg = $3; + $$.offset = $1; + } + +name: + con '(' pointer ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.name = $3; + $$.sym = S; + $$.offset = $1; + } +| LNAME offset '(' pointer ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.name = $4; + $$.sym = $1; + $$.offset = $2; + } +| LNAME '<' '>' offset '(' LSB ')' + { + $$ = nullgen; + $$.type = D_OREG; + $$.name = D_STATIC; + $$.sym = $1; + $$.offset = $4; + } + +comma: +| ',' + +offset: + { + $$ = 0; + } +| '+' con + { + $$ = $2; + } +| '-' con + { + $$ = -$2; + } + +pointer: + LSB +| LSP +| 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/qa/lex.c b/utils/qa/lex.c new file mode 100644 index 0000000..afa3a70 --- /dev/null +++ b/utils/qa/lex.c @@ -0,0 +1,940 @@ +#define EXTERN +#include "a.h" +#include "y.tab.h" +#include <ctype.h> + +void +main(int argc, char *argv[]) +{ + char *p; + int nout, nproc, status, i, c; + + thechar = 'q'; + thestring = "power"; + 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) { + 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); + if(p = strrchr(ofile, pathchar())) { + include[0] = ofile; + *p++ = 0; + } else + p = ofile; + if(outfile == 0) { + outfile = p; + if(p = strrchr(outfile, '.')) + if(p[1] == 's' && p[2] == 0) + p[0] = 0; + p = strrchr(outfile, 0); + p[0] = '.'; + p[1] = thechar; + p[2] = 0; + } + 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; + nosched = 0; + pinit(file); + for(i=0; i<nDlist; i++) + dodefine(Dlist[i]); + yyparse(); + if(nerrors) { + cclean(); + return nerrors; + } + + pass = 2; + nosched = 0; + 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, + + "LR", LLR, D_LR, + "CTR", LCTR, D_CTR, + + "XER", LSPREG, D_XER, + "MSR", LMSR, D_MSR, + "FPSCR", LFPSCR, D_FPSCR, + "SPR", LSPR, D_SPR, + "DCR", LDCR, D_DCR, + + "SEG", LSEG, D_SREG, + + "CR", LCR, 0, + "CR0", LCREG, 0, + "CR1", LCREG, 1, + "CR2", LCREG, 2, + "CR3", LCREG, 3, + "CR4", LCREG, 4, + "CR5", LCREG, 5, + "CR6", LCREG, 6, + "CR7", LCREG, 7, + + "R", LR, 0, + "R0", LREG, 0, + "R1", LREG, 1, + "R2", LREG, 2, + "R3", LREG, 3, + "R4", LREG, 4, + "R5", LREG, 5, + "R6", LREG, 6, + "R7", LREG, 7, + "R8", LREG, 8, + "R9", LREG, 9, + "R10", LREG, 10, + "R11", LREG, 11, + "R12", LREG, 12, + "R13", LREG, 13, + "R14", LREG, 14, + "R15", LREG, 15, + "R16", LREG, 16, + "R17", LREG, 17, + "R18", LREG, 18, + "R19", LREG, 19, + "R20", LREG, 20, + "R21", LREG, 21, + "R22", LREG, 22, + "R23", LREG, 23, + "R24", LREG, 24, + "R25", LREG, 25, + "R26", LREG, 26, + "R27", LREG, 27, + "R28", LREG, 28, + "R29", LREG, 29, + "R30", LREG, 30, + "R31", LREG, 31, + + "F", LF, 0, + "F0", LFREG, 0, + "F1", LFREG, 1, + "F2", LFREG, 2, + "F3", LFREG, 3, + "F4", LFREG, 4, + "F5", LFREG, 5, + "F6", LFREG, 6, + "F7", LFREG, 7, + "F8", LFREG, 8, + "F9", LFREG, 9, + "F10", LFREG, 10, + "F11", LFREG, 11, + "F12", LFREG, 12, + "F13", LFREG, 13, + "F14", LFREG, 14, + "F15", LFREG, 15, + "F16", LFREG, 16, + "F17", LFREG, 17, + "F18", LFREG, 18, + "F19", LFREG, 19, + "F20", LFREG, 20, + "F21", LFREG, 21, + "F22", LFREG, 22, + "F23", LFREG, 23, + "F24", LFREG, 24, + "F25", LFREG, 25, + "F26", LFREG, 26, + "F27", LFREG, 27, + "F28", LFREG, 28, + "F29", LFREG, 29, + "F30", LFREG, 30, + "F31", LFREG, 31, + + "CREQV", LCROP, ACREQV, + "CRXOR", LCROP, ACRXOR, + "CRAND", LCROP, ACRAND, + "CROR", LCROP, ACROR, + "CRANDN", LCROP, ACRANDN, + "CRORN", LCROP, ACRORN, + "CRNAND", LCROP, ACRNAND, + "CRNOR", LCROP, ACRNOR, + + "ADD", LADDW, AADD, + "ADDV", LADDW, AADDV, + "ADDCC", LADDW, AADDCC, + "ADDVCC", LADDW, AADDVCC, + "ADDC", LADDW, AADDC, + "ADDCV", LADDW, AADDCV, + "ADDCCC", LADDW, AADDCCC, + "ADDCVCC", LADDW, AADDCVCC, + "ADDE", LLOGW, AADDE, + "ADDEV", LLOGW, AADDEV, + "ADDECC", LLOGW, AADDECC, + "ADDEVCC", LLOGW, AADDEVCC, + + "ADDME", LABS, AADDME, + "ADDMEV", LABS, AADDMEV, + "ADDMECC", LABS, AADDMECC, + "ADDMEVCC", LABS, AADDMEVCC, + "ADDZE", LABS, AADDZE, + "ADDZEV", LABS, AADDZEV, + "ADDZECC", LABS, AADDZECC, + "ADDZEVCC", LABS, AADDZEVCC, + + "SUB", LADDW, ASUB, + "SUBV", LADDW, ASUBV, + "SUBCC", LADDW, ASUBCC, + "SUBVCC", LADDW, ASUBVCC, + "SUBE", LLOGW, ASUBE, + "SUBECC", LLOGW, ASUBECC, + "SUBEV", LLOGW, ASUBEV, + "SUBEVCC", LLOGW, ASUBEVCC, + "SUBC", LADDW, ASUBC, + "SUBCCC", LADDW, ASUBCCC, + "SUBCV", LADDW, ASUBCV, + "SUBCVCC", LADDW, ASUBCVCC, + + "SUBME", LABS, ASUBME, + "SUBMEV", LABS, ASUBMEV, + "SUBMECC", LABS, ASUBMECC, + "SUBMEVCC", LABS, ASUBMEVCC, + "SUBZE", LABS, ASUBZE, + "SUBZEV", LABS, ASUBZEV, + "SUBZECC", LABS, ASUBZECC, + "SUBZEVCC", LABS, ASUBZEVCC, + + "AND", LADDW, AAND, + "ANDCC", LADDW, AANDCC, /* includes andil & andiu */ + "ANDN", LLOGW, AANDN, + "ANDNCC", LLOGW, AANDNCC, + "EQV", LLOGW, AEQV, + "EQVCC", LLOGW, AEQVCC, + "NAND", LLOGW, ANAND, + "NANDCC", LLOGW, ANANDCC, + "NOR", LLOGW, ANOR, + "NORCC", LLOGW, ANORCC, + "OR", LADDW, AOR, /* includes oril & oriu */ + "ORCC", LADDW, AORCC, + "ORN", LLOGW, AORN, + "ORNCC", LLOGW, AORNCC, + "XOR", LADDW, AXOR, /* includes xoril & xoriu */ + "XORCC", LLOGW, AXORCC, + + "EXTSB", LABS, AEXTSB, + "EXTSBCC", LABS, AEXTSBCC, + "EXTSH", LABS, AEXTSH, + "EXTSHCC", LABS, AEXTSHCC, + + "CNTLZW", LABS, ACNTLZW, + "CNTLZWCC", LABS, ACNTLZWCC, + + "RLWMI", LRLWM, ARLWMI, + "RLWMICC", LRLWM, ARLWMICC, + "RLWNM", LRLWM, ARLWNM, + "RLWNMCC", LRLWM, ARLWNMCC, + + "SLW", LSHW, ASLW, + "SLWCC", LSHW, ASLWCC, + "SRW", LSHW, ASRW, + "SRWCC", LSHW, ASRWCC, + "SRAW", LSHW, ASRAW, + "SRAWCC", LSHW, ASRAWCC, + + "BR", LBRA, ABR, + "BC", LBRA, ABC, + "BCL", LBRA, ABC, + "BL", LBRA, ABL, + "BEQ", LBRA, ABEQ, + "BNE", LBRA, ABNE, + "BGT", LBRA, ABGT, + "BGE", LBRA, ABGE, + "BLT", LBRA, ABLT, + "BLE", LBRA, ABLE, + "BVC", LBRA, ABVC, + "BVS", LBRA, ABVS, + + "CMP", LCMP, ACMP, + "CMPU", LCMP, ACMPU, + + "DIVW", LLOGW, ADIVW, + "DIVWV", LLOGW, ADIVWV, + "DIVWCC", LLOGW, ADIVWCC, + "DIVWVCC", LLOGW, ADIVWVCC, + "DIVWU", LLOGW, ADIVWU, + "DIVWUV", LLOGW, ADIVWUV, + "DIVWUCC", LLOGW, ADIVWUCC, + "DIVWUVCC", LLOGW, ADIVWUVCC, + + "FABS", LFCONV, AFABS, + "FABSCC", LFCONV, AFABSCC, + "FNEG", LFCONV, AFNEG, + "FNEGCC", LFCONV, AFNEGCC, + "FNABS", LFCONV, AFNABS, + "FNABSCC", LFCONV, AFNABSCC, + + "FADD", LFADD, AFADD, + "FADDCC", LFADD, AFADDCC, + "FSUB", LFADD, AFSUB, + "FSUBCC", LFADD, AFSUBCC, + "FMUL", LFADD, AFMUL, + "FMULCC", LFADD, AFMULCC, + "FDIV", LFADD, AFDIV, + "FDIVCC", LFADD, AFDIVCC, + "FRSP", LFCONV, AFRSP, + "FRSPCC", LFCONV, AFRSPCC, + + "FMADD", LFMA, AFMADD, + "FMADDCC", LFMA, AFMADDCC, + "FMSUB", LFMA, AFMSUB, + "FMSUBCC", LFMA, AFMSUBCC, + "FNMADD", LFMA, AFNMADD, + "FNMADDCC", LFMA, AFNMADDCC, + "FNMSUB", LFMA, AFNMSUB, + "FNMSUBCC", LFMA, AFNMSUBCC, + "FMADDS", LFMA, AFMADDS, + "FMADDSCC", LFMA, AFMADDSCC, + "FMSUBS", LFMA, AFMSUBS, + "FMSUBSCC", LFMA, AFMSUBSCC, + "FNMADDS", LFMA, AFNMADDS, + "FNMADDSCC", LFMA, AFNMADDSCC, + "FNMSUBS", LFMA, AFNMSUBS, + "FNMSUBSCC", LFMA, AFNMSUBSCC, + + "FCMPU", LFCMP, AFCMPU, + "FCMPO", LFCMP, AFCMPO, + "MTFSB0", LMTFSB, AMTFSB0, + "MTFSB1", LMTFSB, AMTFSB1, + + "FMOVD", LFMOV, AFMOVD, + "FMOVS", LFMOV, AFMOVS, + "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */ + + "GLOBL", LTEXT, AGLOBL, + + "MOVB", LMOVB, AMOVB, + "MOVBZ", LMOVB, AMOVBZ, + "MOVBU", LMOVB, AMOVBU, + "MOVBZU", LMOVB, AMOVBZU, + "MOVH", LMOVB, AMOVH, + "MOVHZ", LMOVB, AMOVHZ, + "MOVHU", LMOVB, AMOVHU, + "MOVHZU", LMOVB, AMOVHZU, + "MOVHBR", LXMV, AMOVHBR, + "MOVWBR", LXMV, AMOVWBR, + "MOVW", LMOVW, AMOVW, + "MOVWU", LMOVW, AMOVWU, + "MOVMW", LMOVMW, AMOVMW, + "MOVFL", LMOVW, AMOVFL, + + "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */ + "MULLWV", LLOGW, AMULLWV, + "MULLWCC", LLOGW, AMULLWCC, + "MULLWVCC", LLOGW, AMULLWVCC, + + "MULHW", LLOGW, AMULHW, + "MULHWCC", LLOGW, AMULHWCC, + "MULHWU", LLOGW, AMULHWU, + "MULHWUCC", LLOGW, AMULHWUCC, + + "NEG", LABS, ANEG, + "NEGV", LABS, ANEGV, + "NEGCC", LABS, ANEGCC, + "NEGVCC", LABS, ANEGVCC, + + "NOP", LNOP, ANOP, /* ori 0,0,0 */ + "SYSCALL", LNOP, ASYSCALL, + + "RETURN", LRETRN, ARETURN, + "RFI", LRETRN, ARFI, + "RFCI", LRETRN, ARFCI, + + "DATA", LDATA, ADATA, + "END", LEND, AEND, + "TEXT", LTEXT, ATEXT, + + /* IBM powerpc embedded */ + "MACCHW", LMA, AMACCHW, + "MACCHWCC", LMA, AMACCHWCC, + "MACCHWS", LMA, AMACCHWS, + "MACCHWSCC", LMA, AMACCHWSCC, + "MACCHWSU", LMA, AMACCHWSU, + "MACCHWSUCC", LMA, AMACCHWSUCC, + "MACCHWSUV", LMA, AMACCHWSUV, + "MACCHWSUVCC", LMA, AMACCHWSUVCC, + "MACCHWSV", LMA, AMACCHWSV, + "MACCHWSVCC", LMA, AMACCHWSVCC, + "MACCHWU", LMA, AMACCHWU, + "MACCHWUCC", LMA, AMACCHWUCC, + "MACCHWUV", LMA, AMACCHWUV, + "MACCHWUVCC", LMA, AMACCHWUVCC, + "MACCHWV", LMA, AMACCHWV, + "MACCHWVCC", LMA, AMACCHWVCC, + "MACHHW", LMA, AMACHHW, + "MACHHWCC", LMA, AMACHHWCC, + "MACHHWS", LMA, AMACHHWS, + "MACHHWSCC", LMA, AMACHHWSCC, + "MACHHWSU", LMA, AMACHHWSU, + "MACHHWSUCC", LMA, AMACHHWSUCC, + "MACHHWSUV", LMA, AMACHHWSUV, + "MACHHWSUVCC", LMA, AMACHHWSUVCC, + "MACHHWSV", LMA, AMACHHWSV, + "MACHHWSVCC", LMA, AMACHHWSVCC, + "MACHHWU", LMA, AMACHHWU, + "MACHHWUCC", LMA, AMACHHWUCC, + "MACHHWUV", LMA, AMACHHWUV, + "MACHHWUVCC", LMA, AMACHHWUVCC, + "MACHHWV", LMA, AMACHHWV, + "MACHHWVCC", LMA, AMACHHWVCC, + "MACLHW", LMA, AMACLHW, + "MACLHWCC", LMA, AMACLHWCC, + "MACLHWS", LMA, AMACLHWS, + "MACLHWSCC", LMA, AMACLHWSCC, + "MACLHWSU", LMA, AMACLHWSU, + "MACLHWSUCC", LMA, AMACLHWSUCC, + "MACLHWSUV", LMA, AMACLHWSUV, + "MACLHWSUVCC", LMA, AMACLHWSUVCC, + "MACLHWSV", LMA, AMACLHWSV, + "MACLHWSVCC", LMA, AMACLHWSVCC, + "MACLHWU", LMA, AMACLHWU, + "MACLHWUCC", LMA, AMACLHWUCC, + "MACLHWUV", LMA, AMACLHWUV, + "MACLHWUVCC", LMA, AMACLHWUVCC, + "MACLHWV", LMA, AMACLHWV, + "MACLHWVCC", LMA, AMACLHWVCC, + "MULCHW", LLOGW, AMULCHW, + "MULCHWCC", LLOGW, AMULCHWCC, + "MULCHWU", LLOGW, AMULCHWU, + "MULCHWUCC", LLOGW, AMULCHWUCC, + "MULHHW", LLOGW, AMULHHW, + "MULHHWCC", LLOGW, AMULHHWCC, + "MULHHWU", LLOGW, AMULHHWU, + "MULHHWUCC", LLOGW, AMULHHWUCC, + "MULLHW", LLOGW, AMULLHW, + "MULLHWCC", LLOGW, AMULLHWCC, + "MULLHWU", LLOGW, AMULLHWU, + "MULLHWUCC", LLOGW, AMULLHWUCC, + "NMACCHW", LMA, ANMACCHW, + "NMACCHWCC", LMA, ANMACCHWCC, + "NMACCHWS", LMA, ANMACCHWS, + "NMACCHWSCC", LMA, ANMACCHWSCC, + "NMACCHWSV", LMA, ANMACCHWSV, + "NMACCHWSVCC", LMA, ANMACCHWSVCC, + "NMACCHWV", LMA, ANMACCHWV, + "NMACCHWVCC", LMA, ANMACCHWVCC, + "NMACHHW", LMA, ANMACHHW, + "NMACHHWCC", LMA, ANMACHHWCC, + "NMACHHWS", LMA, ANMACHHWS, + "NMACHHWSCC", LMA, ANMACHHWSCC, + "NMACHHWSV", LMA, ANMACHHWSV, + "NMACHHWSVCC", LMA, ANMACHHWSVCC, + "NMACHHWV", LMA, ANMACHHWV, + "NMACHHWVCC", LMA, ANMACHHWVCC, + "NMACLHW", LMA, ANMACLHW, + "NMACLHWCC", LMA, ANMACLHWCC, + "NMACLHWS", LMA, ANMACLHWS, + "NMACLHWSCC", LMA, ANMACLHWSCC, + "NMACLHWSV", LMA, ANMACLHWSV, + "NMACLHWSVCC", LMA, ANMACLHWSVCC, + "NMACLHWV", LMA, ANMACLHWV, + "NMACLHWVCC", LMA, ANMACLHWVCC, + + /* optional on 32-bit */ + "FRES", LFCONV, AFRES, + "FRESCC", LFCONV, AFRESCC, + "FRSQRTE", LFCONV, AFRSQRTE, + "FRSQRTECC", LFCONV, AFRSQRTECC, + "FSEL", LFMA, AFSEL, + "FSELCC", LFMA, AFSELCC, + "FSQRT", LFCONV, AFSQRT, + "FSQRTCC", LFCONV, AFSQRTCC, + "FSQRTS", LFCONV, AFSQRTS, + "FSQRTSCC", LFCONV, AFSQRTSCC, + + /* parallel, cross, and secondary (fp2) */ + "FPSEL", LFMA, AFPSEL, + "FPMUL", LFADD, AFPMUL, + "FXMUL", LFADD, AFXMUL, + "FXPMUL", LFADD, AFXPMUL, + "FXSMUL", LFADD, AFXSMUL, + "FPADD", LFADD, AFPADD, + "FPSUB", LFADD, AFPSUB, + "FPRE", LFCONV, AFPRE, + "FPRSQRTE", LFCONV, AFPRSQRTE, + "FPMADD", LFMA, AFPMADD, + "FXMADD", LFMA, AFXMADD, + "FXCPMADD", LFMA, AFXCPMADD, + "FXCSMADD", LFMA, AFXCSMADD, + "FPNMADD", LFMA, AFPNMADD, + "FXNMADD", LFMA, AFXNMADD, + "FXCPNMADD", LFMA, AFXCPNMADD, + "FXCSNMADD", LFMA, AFXCSNMADD, + "FPMSUB", LFMA, AFPMSUB, + "FXMSUB", LFMA, AFXMSUB, + "FXCPMSUB", LFMA, AFXCPMSUB, + "FXCSMSUB", LFMA, AFXCSMSUB, + "FPNMSUB", LFMA, AFPNMSUB, + "FXNMSUB", LFMA, AFXNMSUB, + "FXCPNMSUB", LFMA, AFXCPNMSUB, + "FXCSNMSUB", LFMA, AFXCSNMSUB, + "FPABS", LFCONV, AFPABS, + "FPNEG", LFCONV, AFPNEG, + "FPRSP", LFCONV, AFPRSP, + "FPNABS", LFCONV, AFPNABS, + "FSMOVD", LFMOV, AFSMOVD, + "FSCMP", LFCMP, AFSCMP, + "FSABS", LFCONV, AFSABS, + "FSNEG", LFCONV, AFSNEG, + "FSNABS", LFCONV, AFSNABS, + "FPCTIW", LFCONV, AFPCTIW, + "FPCTIWZ", LFCONV, AFPCTIWZ, + "FMOVSPD", LFCONV, AFMOVSPD, + "FMOVPSD", LFCONV, AFMOVPSD, + "FXCPNPMA", LFMA, AFXCPNPMA, + "FXCSNPMA", LFMA, AFXCSNPMA, + "FXCPNSMA", LFMA, AFXCPNSMA, + "FXCSNSMA", LFMA, AFXCSNSMA, + "FXCXNPMA", LFMA, AFXCXNPMA, + "FXCXNSMA", LFMA, AFXCXNSMA, + "FXCXMA", LFMA, AFXCXMA, + "FXCXNMS", LFMA, AFXCXNMS, + + /* parallel, cross, and secondary load and store (fp2) */ + "FSMOVS", LFMOVX, AFSMOVS, + "FSMOVSU", LFMOVX, AFSMOVSU, + "FSMOVD", LFMOVX, AFSMOVD, + "FSMOVDU", LFMOVX, AFSMOVDU, + "FXMOVS", LFMOVX, AFXMOVS, + "FXMOVSU", LFMOVX, AFXMOVSU, + "FXMOVD", LFMOVX, AFXMOVD, + "FXMOVDU", LFMOVX, AFXMOVDU, + "FPMOVS", LFMOVX, AFPMOVS, + "FPMOVSU", LFMOVX, AFPMOVSU, + "FPMOVD", LFMOVX, AFPMOVD, + "FPMOVDU", LFMOVX, AFPMOVDU, + "FPMOVIW", LFMOVX, AFPMOVIW, + + "AFMOVSPD", LFMOV, AFMOVSPD, + "AFMOVPSD", LFMOV, AFMOVPSD, + + /* special instructions */ + "DCBF", LXOP, ADCBF, + "DCBI", LXOP, ADCBI, + "DCBST", LXOP, ADCBST, + "DCBT", LXOP, ADCBT, + "DCBTST", LXOP, ADCBTST, + "DCBZ", LXOP, ADCBZ, + "ICBI", LXOP, AICBI, + + "ECIWX", LXLD, AECIWX, + "ECOWX", LXST, AECOWX, + "LWAR", LXLD, ALWAR, + "STWCCC", LXST, ASTWCCC, + "EIEIO", LRETRN, AEIEIO, + "TLBIE", LNOP, ATLBIE, + "LSW", LXLD, ALSW, + "STSW", LXST, ASTSW, + + "ISYNC", LRETRN, AISYNC, + "SYNC", LRETRN, ASYNC, +/* "TW", LADDW, ATW,*/ + + "WORD", LWORD, AWORD, + "SCHED", LSCHED, 0, + "NOSCHED", LSCHED, 0x80, + + 0 +}; + +void +cinit(void) +{ + Sym *s; + int i; + + nullgen.sym = S; + nullgen.offset = 0; + nullgen.type = D_NONE; + nullgen.name = D_NONE; + nullgen.reg = NREG; + nullgen.xreg = NREG; + if(FPCHIP) + nullgen.dval = 0; + for(i=0; i<sizeof(nullgen.sval); i++) + nullgen.sval[i] = 0; + + nerrors = 0; + iostack = I; + iofree = I; + peekc = IGN; + nhunk = 0; + for(i=0; i<NHASH; i++) + hash[i] = S; + for(i=0; itab[i].name; i++) { + s = slookup(itab[i].name); + s->type = itab[i].type; + s->value = itab[i].value; + } + ALLOCN(pathname, 0, 100); + if(mygetwd(pathname, 99) == 0) { + ALLOCN(pathname, 100, 900); + if(mygetwd(pathname, 999) == 0) + strcpy(pathname, "/?"); + } +} + +void +syminit(Sym *s) +{ + + s->type = LNAME; + s->value = 0; +} + +void +cclean(void) +{ + + outcode(AEND, &nullgen, NREG, &nullgen); + Bflush(&obuf); +} + +void +zname(char *n, int t, int s) +{ + + Bputc(&obuf, ANAME); + Bputc(&obuf, ANAME>>8); + Bputc(&obuf, t); /* type */ + Bputc(&obuf, s); /* sym */ + while(*n) { + Bputc(&obuf, *n); + n++; + } + Bputc(&obuf, 0); +} + +void +zaddr(Gen *a, int s) +{ + long l; + int i; + char *n; + Ieee e; + + Bputc(&obuf, a->type); + Bputc(&obuf, a->reg); + Bputc(&obuf, s); + Bputc(&obuf, a->name); + switch(a->type) { + default: + print("unknown type %d\n", a->type); + exits("arg"); + + case D_NONE: + case D_REG: + case D_FREG: + case D_CREG: + case D_FPSCR: + case D_MSR: + case D_SREG: + case D_OPT: + break; + + case D_DCR: + case D_SPR: + case D_OREG: + case D_CONST: + case D_BRANCH: + l = a->offset; + Bputc(&obuf, l); + Bputc(&obuf, l>>8); + Bputc(&obuf, l>>16); + Bputc(&obuf, l>>24); + break; + + case D_SCONST: + n = a->sval; + for(i=0; i<NSNAME; i++) { + Bputc(&obuf, *n); + n++; + } + break; + + case D_FCONST: + ieeedtod(&e, a->dval); + Bputc(&obuf, e.l); + Bputc(&obuf, e.l>>8); + Bputc(&obuf, e.l>>16); + Bputc(&obuf, e.l>>24); + Bputc(&obuf, e.h); + Bputc(&obuf, e.h>>8); + Bputc(&obuf, e.h>>16); + Bputc(&obuf, e.h>>24); + break; + } +} + +int +outsim(Gen *g) +{ + Sym *s; + int sno, t; + + s = g->sym; + if(s == S) + return 0; + sno = s->sym; + if(sno < 0 || sno >= NSYM) + sno = 0; + t = g->name; + if(h[sno].type == t && h[sno].sym == s) + return sno; + zname(s->name, t, sym); + s->sym = sym; + h[sym].sym = s; + h[sym].type = t; + sno = sym; + sym++; + if(sym >= NSYM) + sym = 1; + return sno; +} + +void +outcode(int a, Gen *g1, int reg, Gen *g2) +{ + int sf, st; + + if(a != AGLOBL && a != ADATA) + pc++; + if(pass == 1) + return; + if(g1->xreg != NREG) { + if(reg != NREG || g2->xreg != NREG) + yyerror("bad addressing modes"); + reg = g1->xreg; + } else + if(g2->xreg != NREG) { + if(reg != NREG) + yyerror("bad addressing modes"); + reg = g2->xreg; + } + do { + sf = outsim(g1); + st = outsim(g2); + } while(sf != 0 && st == sf); + Bputc(&obuf, a); + Bputc(&obuf, a>>8); + Bputc(&obuf, reg|nosched); + Bputc(&obuf, lineno); + Bputc(&obuf, lineno>>8); + Bputc(&obuf, lineno>>16); + Bputc(&obuf, lineno>>24); + zaddr(g1, sf); + zaddr(g2, st); +} + +void +outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3) +{ + int s1, s2, s3, flag; + + if(a != AGLOBL && a != ADATA) + pc++; + if(pass == 1) + return; + do { + s1 = outsim(g1); + s2 = outsim(g2); + s3 = outsim(g3); + } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3)); + flag = 0; + if(g2->type != D_NONE) + flag = 0x40; /* flags extra operand */ + Bputc(&obuf, a); + Bputc(&obuf, a>>8); + Bputc(&obuf, reg | nosched | flag); + Bputc(&obuf, lineno); + Bputc(&obuf, lineno>>8); + Bputc(&obuf, lineno>>16); + Bputc(&obuf, lineno>>24); + zaddr(g1, s1); + if(flag) + zaddr(g2, s2); + zaddr(g3, s3); +} + +void +outhist(void) +{ + Gen g; + Hist *h; + char *p, *q, *op, c; + int n; + + g = nullgen; + c = pathchar(); + for(h = hist; h != H; h = h->link) { + p = h->name; + op = 0; + /* on windows skip drive specifier in pathname */ + if(systemtype(Windows) && p && p[1] == ':'){ + p += 2; + c = *p; + } + if(p && p[0] != c && h->offset == 0 && pathname){ + /* on windows skip drive specifier in pathname */ + if(systemtype(Windows) && pathname[1] == ':') { + op = p; + p = pathname+2; + c = *p; + } else if(pathname[0] == c){ + op = p; + p = pathname; + } + } + while(p) { + q = strchr(p, c); + if(q) { + n = q-p; + if(n == 0){ + n = 1; /* leading "/" */ + *p = '/'; /* don't emit "\" on windows */ + } + q++; + } else { + n = strlen(p); + q = 0; + } + if(n) { + Bputc(&obuf, ANAME); + Bputc(&obuf, ANAME>>8); + Bputc(&obuf, D_FILE); /* type */ + Bputc(&obuf, 1); /* sym */ + Bputc(&obuf, '<'); + Bwrite(&obuf, p, n); + Bputc(&obuf, 0); + } + p = q; + if(p == 0 && op) { + p = op; + op = 0; + } + } + g.offset = h->offset; + + Bputc(&obuf, AHISTORY); + Bputc(&obuf, AHISTORY>>8); + Bputc(&obuf, 0); + Bputc(&obuf, h->line); + Bputc(&obuf, h->line>>8); + Bputc(&obuf, h->line>>16); + Bputc(&obuf, h->line>>24); + zaddr(&nullgen, 0); + zaddr(&g, 0); + } +} + +#include "../cc/lexbody" +#include "../cc/macbody" diff --git a/utils/qa/mkfile b/utils/qa/mkfile new file mode 100644 index 0000000..255701f --- /dev/null +++ b/utils/qa/mkfile @@ -0,0 +1,29 @@ +<../../mkconfig + +TARG=qa +OFILES=\ + y.tab.$O\ + lex.$O\ + +HFILES=\ + ../qc/q.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/qa/y.debug b/utils/qa/y.debug new file mode 100644 index 0000000..dc156e0 --- /dev/null +++ b/utils/qa/y.debug @@ -0,0 +1,561 @@ +char* yytoknames[] = +{ + "$end", + "error", + "$unk", + " |", + " ^", + " &", + " <", + " >", + " +", + " -", + " *", + " /", + " %", + "LMOVW", + "LMOVB", + "LABS", + "LLOGW", + "LSHW", + "LADDW", + "LCMP", + "LCROP", + "LBRA", + "LFMOV", + "LFCONV", + "LFCMP", + "LFADD", + "LFMA", + "LTRAP", + "LXORW", + "LNOP", + "LEND", + "LRETT", + "LWORD", + "LTEXT", + "LDATA", + "LRETRN", + "LCONST", + "LSP", + "LSB", + "LFP", + "LPC", + "LCREG", + "LFLUSH", + "LREG", + "LFREG", + "LR", + "LCR", + "LF", + "LFPSCR", + "LLR", + "LCTR", + "LSPR", + "LSPREG", + "LSEG", + "LMSR", + "LDCR", + "LSCHED", + "LXLD", + "LXST", + "LXOP", + "LXMV", + "LRLWM", + "LMOVMW", + "LMOVEM", + "LMOVFL", + "LMTFSB", + "LMA", + "LFMOVX", + "LFCONST", + "LSCONST", + "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 \nline: LNAME.= expr ; \n", /*4*/ + "line: LVAR.= expr ; \n", /*5*/ + "line: LSCHED.; \n", /*6*/ + 0, /*7*/ + "line: inst.; \n", /*8*/ + "line: error.; \n", /*9*/ + "inst: LMOVW.rreg , rreg \ninst: LMOVW.addr , rreg \ninst: LMOVW.regaddr , rreg \ninst: LMOVW.rreg , addr \ninst: LMOVW.rreg , regaddr \ninst: LMOVW.freg , addr \ninst: LMOVW.freg , regaddr \ninst: LMOVW.fpscr , freg \ninst: LMOVW.freg , fpscr \ninst: LMOVW.freg , imm , fpscr \ninst: LMOVW.fpscr , creg \ninst: LMOVW.imm , fpscrf \ninst: LMOVW.rreg , imm , lcr \ninst: LMOVW.rreg , creg \ninst: LMOVW.rreg , lcr \ninst: LMOVW.imm , rreg \ninst: LMOVW.ximm , rreg \ninst: LMOVW.creg , creg \ninst: LMOVW.psr , creg \ninst: LMOVW.lcr , rreg \ninst: LMOVW.psr , rreg \ninst: LMOVW.seg , rreg \ninst: LMOVW.rreg , seg \ninst: LMOVW.xlreg , rreg \ninst: LMOVW.rreg , xlreg \ninst: LMOVW.creg , psr \ninst: LMOVW.rreg , psr \n", /*10*/ + "inst: LMOVB.rreg , rreg \ninst: LMOVB.addr , rreg \ninst: LMOVB.regaddr , rreg \ninst: LMOVB.rreg , addr \ninst: LMOVB.rreg , regaddr \n", /*11*/ + "inst: LFMOV.addr , freg \ninst: LFMOV.regaddr , freg \ninst: LFMOV.fimm , freg \ninst: LFMOV.freg , freg \ninst: LFMOV.freg , addr \ninst: LFMOV.freg , regaddr \n", /*12*/ + "inst: LFMOVX.regaddr , freg \ninst: LFMOVX.freg , regaddr \n", /*13*/ + "inst: LMTFSB.imm , con \n", /*14*/ + "inst: LADDW.rreg , sreg , rreg \ninst: LADDW.imm , sreg , rreg \ninst: LADDW.rreg , imm , rreg \ninst: LADDW.rreg , rreg \ninst: LADDW.imm , rreg \n", /*15*/ + "inst: LLOGW.rreg , sreg , rreg \ninst: LLOGW.rreg , rreg \n", /*16*/ + "inst: LSHW.rreg , sreg , rreg \ninst: LSHW.rreg , rreg \ninst: LSHW.imm , sreg , rreg \ninst: LSHW.imm , rreg \n", /*17*/ + "inst: LABS.rreg , rreg \ninst: LABS.rreg \n", /*18*/ + "inst: LMA.rreg , sreg , rreg \n", /*19*/ + "inst: LCROP.cbit , cbit \ninst: LCROP.cbit , con , cbit \n", /*20*/ + "inst: LBRA.rel \ninst: LBRA.addr \ninst: LBRA.( xlreg ) \ninst: LBRA., rel \ninst: LBRA., addr \ninst: LBRA., ( xlreg ) \ninst: LBRA.creg , rel \ninst: LBRA.creg , addr \ninst: LBRA.creg , ( xlreg ) \ninst: LBRA.con , rel \ninst: LBRA.con , addr \ninst: LBRA.con , ( xlreg ) \ninst: LBRA.con , con , rel \ninst: LBRA.con , con , addr \ninst: LBRA.con , con , ( xlreg ) \n", /*21*/ + 0, /*22*/ + "inst: LFCONV.freg , freg \n", /*23*/ + "inst: LFADD.freg , freg \ninst: LFADD.freg , freg , freg \n", /*24*/ + "inst: LFMA.freg , freg , freg , freg \n", /*25*/ + "inst: LFCMP.freg , freg \ninst: LFCMP.freg , freg , creg \n", /*26*/ + "inst: LCMP.rreg , rreg \ninst: LCMP.rreg , imm \ninst: LCMP.rreg , rreg , creg \ninst: LCMP.rreg , imm , creg \n", /*27*/ + "inst: LRLWM.imm , rreg , imm , rreg \ninst: LRLWM.imm , rreg , mask , rreg \ninst: LRLWM.rreg , rreg , imm , rreg \ninst: LRLWM.rreg , rreg , mask , rreg \n", /*28*/ + "inst: LMOVMW.addr , rreg \ninst: LMOVMW.rreg , addr \n", /*29*/ + "inst: LXLD.regaddr , rreg \ninst: LXLD.regaddr , imm , rreg \n", /*30*/ + "inst: LXST.rreg , regaddr \ninst: LXST.rreg , imm , regaddr \n", /*31*/ + "inst: LXMV.regaddr , rreg \ninst: LXMV.rreg , regaddr \n", /*32*/ + "inst: LXOP.regaddr \n", /*33*/ + 0, /*34*/ + "inst: LWORD.imm comma \ninst: LWORD.ximm comma \n", /*35*/ + 0, /*36*/ + "inst: LTEXT.name , imm \ninst: LTEXT.name , con , imm \ninst: LTEXT.name , imm : imm \ninst: LTEXT.name , con , imm : imm \n", /*37*/ + "inst: LDATA.name / con , imm \ninst: LDATA.name / con , ximm \ninst: LDATA.name / con , fimm \n", /*38*/ + 0, /*39*/ + 0, /*40*/ + 0, /*41*/ + "line: LNAME =.expr ; \n", /*42*/ + "line: LVAR =.expr ; \n", /*43*/ + 0, /*44*/ + 0, /*45*/ + 0, /*46*/ + "inst: LMOVW rreg., rreg \ninst: LMOVW rreg., addr \ninst: LMOVW rreg., regaddr \ninst: LMOVW rreg., imm , lcr \ninst: LMOVW rreg., creg \ninst: LMOVW rreg., lcr \ninst: LMOVW rreg., seg \ninst: LMOVW rreg., xlreg \ninst: LMOVW rreg., psr \n", /*47*/ + "inst: LMOVW addr., rreg \n", /*48*/ + "inst: LMOVW regaddr., rreg \n", /*49*/ + "inst: LMOVW freg., addr \ninst: LMOVW freg., regaddr \ninst: LMOVW freg., fpscr \ninst: LMOVW freg., imm , fpscr \n", /*50*/ + "inst: LMOVW fpscr., freg \ninst: LMOVW fpscr., creg \n", /*51*/ + "inst: LMOVW imm., fpscrf \ninst: LMOVW imm., rreg \n", /*52*/ + "inst: LMOVW ximm., rreg \n", /*53*/ + "inst: LMOVW creg., creg \ninst: LMOVW creg., psr \n", /*54*/ + "inst: LMOVW psr., creg \ninst: LMOVW psr., rreg \n", /*55*/ + "inst: LMOVW lcr., rreg \n", /*56*/ + "inst: LMOVW seg., rreg \n", /*57*/ + "inst: LMOVW xlreg., rreg \n", /*58*/ + 0, /*59*/ + 0, /*60*/ + "addr: con.( sreg ) \nname: con.( pointer ) \n", /*61*/ + "regaddr: (.sreg ) \nregaddr: (.sreg + sreg ) \ncon: (.expr ) \n", /*62*/ + 0, /*63*/ + "freg: LF.( con ) \n", /*64*/ + 0, /*65*/ + "ximm: $.addr \nximm: $.LSCONST \nimm: $.con \n", /*66*/ + 0, /*67*/ + 0, /*68*/ + 0, /*69*/ + "psr: LSPR.( con ) \n", /*70*/ + "psr: LDCR.( con ) \npsr: LDCR.( sreg ) \n", /*71*/ + 0, /*72*/ + "seg: LSEG.( con ) \nseg: LSEG.( sreg ) \n", /*73*/ + 0, /*74*/ + 0, /*75*/ + 0, /*76*/ + "sreg: LR.( con ) \n", /*77*/ + 0, /*78*/ + 0, /*79*/ + 0, /*80*/ + "con: -.con \n", /*81*/ + "con: +.con \n", /*82*/ + "con: ~.con \n", /*83*/ + 0, /*84*/ + 0, /*85*/ + 0, /*86*/ + "inst: LMOVB rreg., rreg \ninst: LMOVB rreg., addr \ninst: LMOVB rreg., regaddr \n", /*87*/ + "inst: LMOVB addr., rreg \n", /*88*/ + "inst: LMOVB regaddr., rreg \n", /*89*/ + "inst: LFMOV addr., freg \n", /*90*/ + "inst: LFMOV regaddr., freg \n", /*91*/ + "inst: LFMOV fimm., freg \n", /*92*/ + "inst: LFMOV freg., freg \ninst: LFMOV freg., addr \ninst: LFMOV freg., regaddr \n", /*93*/ + "fimm: $.LFCONST \nfimm: $.- LFCONST \n", /*94*/ + "inst: LFMOVX regaddr., freg \n", /*95*/ + "inst: LFMOVX freg., regaddr \n", /*96*/ + "regaddr: (.sreg ) \nregaddr: (.sreg + sreg ) \n", /*97*/ + "inst: LMTFSB imm., con \n", /*98*/ + "imm: $.con \n", /*99*/ + "inst: LADDW rreg., sreg , rreg \ninst: LADDW rreg., imm , rreg \ninst: LADDW rreg., rreg \n", /*100*/ + "inst: LADDW imm., sreg , rreg \ninst: LADDW imm., rreg \n", /*101*/ + "inst: LLOGW rreg., sreg , rreg \ninst: LLOGW rreg., rreg \n", /*102*/ + "inst: LSHW rreg., sreg , rreg \ninst: LSHW rreg., rreg \n", /*103*/ + "inst: LSHW imm., sreg , rreg \ninst: LSHW imm., rreg \n", /*104*/ + 0, /*105*/ + "inst: LMA rreg., sreg , rreg \n", /*106*/ + "inst: LCROP cbit., cbit \ninst: LCROP cbit., con , cbit \n", /*107*/ + 0, /*108*/ + "con: (.expr ) \n", /*109*/ + 0, /*110*/ + 0, /*111*/ + "inst: LBRA (.xlreg ) \ncon: (.expr ) \n", /*112*/ + "inst: LBRA ,.rel \ninst: LBRA ,.addr \ninst: LBRA ,.( xlreg ) \n", /*113*/ + "inst: LBRA creg., rel \ninst: LBRA creg., addr \ninst: LBRA creg., ( xlreg ) \n", /*114*/ + "inst: LBRA con., rel \ninst: LBRA con., addr \ninst: LBRA con., ( xlreg ) \ninst: LBRA con., con , rel \ninst: LBRA con., con , addr \ninst: LBRA con., con , ( xlreg ) \nrel: con.( LPC ) \naddr: con.( sreg ) \nname: con.( pointer ) \n", /*115*/ + 0, /*116*/ + 0, /*117*/ + "creg: LCR.( con ) \n", /*118*/ + 0, /*119*/ + "inst: LTRAP imm., sreg \n", /*120*/ + 0, /*121*/ + 0, /*122*/ + "inst: LFCONV freg., freg \n", /*123*/ + "inst: LFADD freg., freg \ninst: LFADD freg., freg , freg \n", /*124*/ + "inst: LFMA freg., freg , freg , freg \n", /*125*/ + "inst: LFCMP freg., freg \ninst: LFCMP freg., freg , creg \n", /*126*/ + "inst: LCMP rreg., rreg \ninst: LCMP rreg., imm \ninst: LCMP rreg., rreg , creg \ninst: LCMP rreg., imm , creg \n", /*127*/ + "inst: LRLWM imm., rreg , imm , rreg \ninst: LRLWM imm., rreg , mask , rreg \n", /*128*/ + "inst: LRLWM rreg., rreg , imm , rreg \ninst: LRLWM rreg., rreg , mask , rreg \n", /*129*/ + "inst: LMOVMW addr., rreg \n", /*130*/ + "inst: LMOVMW rreg., addr \n", /*131*/ + "inst: LXLD regaddr., rreg \ninst: LXLD regaddr., imm , rreg \n", /*132*/ + "inst: LXST rreg., regaddr \ninst: LXST rreg., imm , regaddr \n", /*133*/ + "inst: LXMV regaddr., rreg \n", /*134*/ + "inst: LXMV rreg., regaddr \n", /*135*/ + 0, /*136*/ + 0, /*137*/ + 0, /*138*/ + 0, /*139*/ + 0, /*140*/ + 0, /*141*/ + 0, /*142*/ + 0, /*143*/ + "inst: LTEXT name., imm \ninst: LTEXT name., con , imm \ninst: LTEXT name., imm : imm \ninst: LTEXT name., con , imm : imm \n", /*144*/ + "name: con.( pointer ) \n", /*145*/ + "inst: LDATA name./ con , imm \ninst: LDATA name./ con , ximm \ninst: LDATA name./ con , fimm \n", /*146*/ + 0, /*147*/ + "line: LLAB : $$3.line \n", /*148*/ + "line: LNAME : $$5.line \n", /*149*/ + "line: LNAME = 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", /*150*/ + 0, /*151*/ + "line: LVAR = 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", /*152*/ + "inst: LMOVW rreg ,.rreg \ninst: LMOVW rreg ,.addr \ninst: LMOVW rreg ,.regaddr \ninst: LMOVW rreg ,.imm , lcr \ninst: LMOVW rreg ,.creg \ninst: LMOVW rreg ,.lcr \ninst: LMOVW rreg ,.seg \ninst: LMOVW rreg ,.xlreg \ninst: LMOVW rreg ,.psr \n", /*153*/ + "inst: LMOVW addr ,.rreg \n", /*154*/ + "inst: LMOVW regaddr ,.rreg \n", /*155*/ + "inst: LMOVW freg ,.addr \ninst: LMOVW freg ,.regaddr \ninst: LMOVW freg ,.fpscr \ninst: LMOVW freg ,.imm , fpscr \n", /*156*/ + "inst: LMOVW fpscr ,.freg \ninst: LMOVW fpscr ,.creg \n", /*157*/ + "inst: LMOVW imm ,.fpscrf \ninst: LMOVW imm ,.rreg \n", /*158*/ + "inst: LMOVW ximm ,.rreg \n", /*159*/ + "inst: LMOVW creg ,.creg \ninst: LMOVW creg ,.psr \n", /*160*/ + "inst: LMOVW psr ,.creg \ninst: LMOVW psr ,.rreg \n", /*161*/ + "inst: LMOVW lcr ,.rreg \n", /*162*/ + "inst: LMOVW seg ,.rreg \n", /*163*/ + "inst: LMOVW xlreg ,.rreg \n", /*164*/ + "addr: con (.sreg ) \nname: con (.pointer ) \n", /*165*/ + "regaddr: ( sreg.) \nregaddr: ( sreg.+ sreg ) \n", /*166*/ + "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", /*167*/ + "freg: LF (.con ) \n", /*168*/ + 0, /*169*/ + 0, /*170*/ + 0, /*171*/ + "creg: LCR (.con ) \n", /*172*/ + "psr: LSPR (.con ) \n", /*173*/ + "psr: LDCR (.con ) \npsr: LDCR (.sreg ) \n", /*174*/ + "seg: LSEG (.con ) \nseg: LSEG (.sreg ) \n", /*175*/ + "sreg: LR (.con ) \n", /*176*/ + "name: LNAME offset.( pointer ) \n", /*177*/ + "name: LNAME <.> offset ( LSB ) \n", /*178*/ + "offset: +.con \n", /*179*/ + "offset: -.con \n", /*180*/ + 0, /*181*/ + 0, /*182*/ + 0, /*183*/ + "inst: LMOVB rreg ,.rreg \ninst: LMOVB rreg ,.addr \ninst: LMOVB rreg ,.regaddr \n", /*184*/ + "inst: LMOVB addr ,.rreg \n", /*185*/ + "inst: LMOVB regaddr ,.rreg \n", /*186*/ + "inst: LFMOV addr ,.freg \n", /*187*/ + "inst: LFMOV regaddr ,.freg \n", /*188*/ + "inst: LFMOV fimm ,.freg \n", /*189*/ + "inst: LFMOV freg ,.freg \ninst: LFMOV freg ,.addr \ninst: LFMOV freg ,.regaddr \n", /*190*/ + 0, /*191*/ + "fimm: $ -.LFCONST \n", /*192*/ + "inst: LFMOVX regaddr ,.freg \n", /*193*/ + "inst: LFMOVX freg ,.regaddr \n", /*194*/ + "inst: LMTFSB imm ,.con \n", /*195*/ + 0, /*196*/ + "inst: LADDW rreg ,.sreg , rreg \ninst: LADDW rreg ,.imm , rreg \ninst: LADDW rreg ,.rreg \n", /*197*/ + "inst: LADDW imm ,.sreg , rreg \ninst: LADDW imm ,.rreg \n", /*198*/ + "inst: LLOGW rreg ,.sreg , rreg \ninst: LLOGW rreg ,.rreg \n", /*199*/ + "inst: LSHW rreg ,.sreg , rreg \ninst: LSHW rreg ,.rreg \n", /*200*/ + "inst: LSHW imm ,.sreg , rreg \ninst: LSHW imm ,.rreg \n", /*201*/ + "inst: LABS rreg ,.rreg \n", /*202*/ + "inst: LMA rreg ,.sreg , rreg \n", /*203*/ + "inst: LCROP cbit ,.cbit \ninst: LCROP cbit ,.con , cbit \n", /*204*/ + "inst: LBRA ( xlreg.) \n", /*205*/ + 0, /*206*/ + 0, /*207*/ + "inst: LBRA , (.xlreg ) \ncon: (.expr ) \n", /*208*/ + "rel: con.( LPC ) \naddr: con.( sreg ) \nname: con.( pointer ) \n", /*209*/ + "inst: LBRA creg ,.rel \ninst: LBRA creg ,.addr \ninst: LBRA creg ,.( xlreg ) \n", /*210*/ + "inst: LBRA con ,.rel \ninst: LBRA con ,.addr \ninst: LBRA con ,.( xlreg ) \ninst: LBRA con ,.con , rel \ninst: LBRA con ,.con , addr \ninst: LBRA con ,.con , ( xlreg ) \n", /*211*/ + "rel: con (.LPC ) \naddr: con (.sreg ) \nname: con (.pointer ) \n", /*212*/ + 0, /*213*/ + 0, /*214*/ + 0, /*215*/ + 0, /*216*/ + "inst: LTRAP imm ,.sreg \n", /*217*/ + "inst: LFCONV freg ,.freg \n", /*218*/ + "inst: LFADD freg ,.freg \ninst: LFADD freg ,.freg , freg \n", /*219*/ + "inst: LFMA freg ,.freg , freg , freg \n", /*220*/ + "inst: LFCMP freg ,.freg \ninst: LFCMP freg ,.freg , creg \n", /*221*/ + "inst: LCMP rreg ,.rreg \ninst: LCMP rreg ,.imm \ninst: LCMP rreg ,.rreg , creg \ninst: LCMP rreg ,.imm , creg \n", /*222*/ + "inst: LRLWM imm ,.rreg , imm , rreg \ninst: LRLWM imm ,.rreg , mask , rreg \n", /*223*/ + "inst: LRLWM rreg ,.rreg , imm , rreg \ninst: LRLWM rreg ,.rreg , mask , rreg \n", /*224*/ + "inst: LMOVMW addr ,.rreg \n", /*225*/ + "inst: LMOVMW rreg ,.addr \n", /*226*/ + "inst: LXLD regaddr ,.rreg \ninst: LXLD regaddr ,.imm , rreg \n", /*227*/ + "inst: LXST rreg ,.regaddr \ninst: LXST rreg ,.imm , regaddr \n", /*228*/ + "inst: LXMV regaddr ,.rreg \n", /*229*/ + "inst: LXMV rreg ,.regaddr \n", /*230*/ + 0, /*231*/ + 0, /*232*/ + 0, /*233*/ + 0, /*234*/ + 0, /*235*/ + 0, /*236*/ + "inst: LTEXT name ,.imm \ninst: LTEXT name ,.con , imm \ninst: LTEXT name ,.imm : imm \ninst: LTEXT name ,.con , imm : imm \n", /*237*/ + "name: con (.pointer ) \n", /*238*/ + "inst: LDATA name /.con , imm \ninst: LDATA name /.con , ximm \ninst: LDATA name /.con , fimm \n", /*239*/ + 0, /*240*/ + 0, /*241*/ + 0, /*242*/ + "expr: expr +.expr \n", /*243*/ + "expr: expr -.expr \n", /*244*/ + "expr: expr *.expr \n", /*245*/ + "expr: expr /.expr \n", /*246*/ + "expr: expr %.expr \n", /*247*/ + "expr: expr <.< expr \n", /*248*/ + "expr: expr >.> expr \n", /*249*/ + "expr: expr &.expr \n", /*250*/ + "expr: expr ^.expr \n", /*251*/ + "expr: expr |.expr \n", /*252*/ + 0, /*253*/ + 0, /*254*/ + 0, /*255*/ + 0, /*256*/ + "inst: LMOVW rreg , imm., lcr \n", /*257*/ + 0, /*258*/ + 0, /*259*/ + 0, /*260*/ + 0, /*261*/ + 0, /*262*/ + 0, /*263*/ + 0, /*264*/ + 0, /*265*/ + 0, /*266*/ + 0, /*267*/ + "inst: LMOVW freg , imm., fpscr \n", /*268*/ + 0, /*269*/ + 0, /*270*/ + 0, /*271*/ + 0, /*272*/ + "fpscrf: LFPSCR.( con ) \n", /*273*/ + 0, /*274*/ + 0, /*275*/ + 0, /*276*/ + 0, /*277*/ + 0, /*278*/ + 0, /*279*/ + 0, /*280*/ + 0, /*281*/ + "addr: con ( sreg.) \n", /*282*/ + "name: con ( pointer.) \n", /*283*/ + 0, /*284*/ + 0, /*285*/ + 0, /*286*/ + 0, /*287*/ + "regaddr: ( sreg +.sreg ) \n", /*288*/ + 0, /*289*/ + "freg: LF ( con.) \n", /*290*/ + "creg: LCR ( con.) \n", /*291*/ + "psr: LSPR ( con.) \n", /*292*/ + "psr: LDCR ( con.) \n", /*293*/ + "psr: LDCR ( sreg.) \n", /*294*/ + "seg: LSEG ( con.) \n", /*295*/ + "seg: LSEG ( sreg.) \n", /*296*/ + "sreg: LR ( con.) \n", /*297*/ + "name: LNAME offset (.pointer ) \n", /*298*/ + 0, /*299*/ + 0, /*300*/ + 0, /*301*/ + 0, /*302*/ + 0, /*303*/ + 0, /*304*/ + 0, /*305*/ + 0, /*306*/ + 0, /*307*/ + 0, /*308*/ + 0, /*309*/ + 0, /*310*/ + 0, /*311*/ + 0, /*312*/ + 0, /*313*/ + 0, /*314*/ + 0, /*315*/ + 0, /*316*/ + 0, /*317*/ + "inst: LADDW rreg , imm., rreg \n", /*318*/ + 0, /*319*/ + 0, /*320*/ + 0, /*321*/ + 0, /*322*/ + 0, /*323*/ + 0, /*324*/ + 0, /*325*/ + 0, /*326*/ + 0, /*327*/ + 0, /*328*/ + "inst: LMA rreg , sreg., rreg \n", /*329*/ + 0, /*330*/ + 0, /*331*/ + 0, /*332*/ + "inst: LBRA , ( xlreg.) \n", /*333*/ + 0, /*334*/ + 0, /*335*/ + "inst: LBRA creg , (.xlreg ) \ncon: (.expr ) \n", /*336*/ + 0, /*337*/ + 0, /*338*/ + "inst: LBRA con , (.xlreg ) \ncon: (.expr ) \n", /*339*/ + "inst: LBRA con , con., rel \ninst: LBRA con , con., addr \ninst: LBRA con , con., ( xlreg ) \nrel: con.( LPC ) \naddr: con.( sreg ) \nname: con.( pointer ) \n", /*340*/ + "rel: con ( LPC.) \n", /*341*/ + 0, /*342*/ + 0, /*343*/ + 0, /*344*/ + 0, /*345*/ + "inst: LFMA freg , freg., freg , freg \n", /*346*/ + 0, /*347*/ + 0, /*348*/ + 0, /*349*/ + "inst: LRLWM imm , rreg., imm , rreg \ninst: LRLWM imm , rreg., mask , rreg \n", /*350*/ + "inst: LRLWM rreg , rreg., imm , rreg \ninst: LRLWM rreg , rreg., mask , rreg \n", /*351*/ + 0, /*352*/ + 0, /*353*/ + 0, /*354*/ + "inst: LXLD regaddr , imm., rreg \n", /*355*/ + 0, /*356*/ + "inst: LXST rreg , imm., regaddr \n", /*357*/ + 0, /*358*/ + 0, /*359*/ + 0, /*360*/ + "inst: LTEXT name , con., imm \ninst: LTEXT name , con., imm : imm \n", /*361*/ + "inst: LDATA name / con., imm \ninst: LDATA name / con., ximm \ninst: LDATA name / con., fimm \n", /*362*/ + 0, /*363*/ + 0, /*364*/ + 0, /*365*/ + 0, /*366*/ + 0, /*367*/ + "expr: expr < <.expr \n", /*368*/ + "expr: expr > >.expr \n", /*369*/ + 0, /*370*/ + 0, /*371*/ + 0, /*372*/ + "inst: LMOVW rreg , imm ,.lcr \n", /*373*/ + "inst: LMOVW freg , imm ,.fpscr \n", /*374*/ + "fpscrf: LFPSCR (.con ) \n", /*375*/ + 0, /*376*/ + 0, /*377*/ + "regaddr: ( sreg + sreg.) \n", /*378*/ + 0, /*379*/ + 0, /*380*/ + 0, /*381*/ + 0, /*382*/ + 0, /*383*/ + 0, /*384*/ + 0, /*385*/ + 0, /*386*/ + "name: LNAME offset ( pointer.) \n", /*387*/ + "name: LNAME < > offset.( LSB ) \n", /*388*/ + "inst: LADDW rreg , sreg ,.rreg \n", /*389*/ + "inst: LADDW rreg , imm ,.rreg \n", /*390*/ + "inst: LADDW imm , sreg ,.rreg \n", /*391*/ + "inst: LLOGW rreg , sreg ,.rreg \n", /*392*/ + "inst: LSHW rreg , sreg ,.rreg \n", /*393*/ + "inst: LSHW imm , sreg ,.rreg \n", /*394*/ + "inst: LMA rreg , sreg ,.rreg \n", /*395*/ + "inst: LCROP cbit , con ,.cbit \n", /*396*/ + 0, /*397*/ + "inst: LBRA creg , ( xlreg.) \n", /*398*/ + "inst: LBRA con , ( xlreg.) \n", /*399*/ + "inst: LBRA con , con ,.rel \ninst: LBRA con , con ,.addr \ninst: LBRA con , con ,.( xlreg ) \n", /*400*/ + 0, /*401*/ + "inst: LFADD freg , freg ,.freg \n", /*402*/ + "inst: LFMA freg , freg ,.freg , freg \n", /*403*/ + "inst: LFCMP freg , freg ,.creg \n", /*404*/ + "inst: LCMP rreg , rreg ,.creg \n", /*405*/ + "inst: LCMP rreg , imm ,.creg \n", /*406*/ + "inst: LRLWM imm , rreg ,.imm , rreg \ninst: LRLWM imm , rreg ,.mask , rreg \n", /*407*/ + "inst: LRLWM rreg , rreg ,.imm , rreg \ninst: LRLWM rreg , rreg ,.mask , rreg \n", /*408*/ + "inst: LXLD regaddr , imm ,.rreg \n", /*409*/ + "inst: LXST rreg , imm ,.regaddr \n", /*410*/ + "inst: LTEXT name , imm :.imm \n", /*411*/ + "inst: LTEXT name , con ,.imm \ninst: LTEXT name , con ,.imm : imm \n", /*412*/ + "inst: LDATA name / con ,.imm \ninst: LDATA name / con ,.ximm \ninst: LDATA name / con ,.fimm \n", /*413*/ + 0, /*414*/ + 0, /*415*/ + 0, /*416*/ + 0, /*417*/ + 0, /*418*/ + "fpscrf: LFPSCR ( con.) \n", /*419*/ + 0, /*420*/ + 0, /*421*/ + "name: LNAME < > offset (.LSB ) \n", /*422*/ + 0, /*423*/ + 0, /*424*/ + 0, /*425*/ + 0, /*426*/ + 0, /*427*/ + 0, /*428*/ + 0, /*429*/ + 0, /*430*/ + 0, /*431*/ + 0, /*432*/ + 0, /*433*/ + 0, /*434*/ + "inst: LBRA con , con , (.xlreg ) \ncon: (.expr ) \n", /*435*/ + 0, /*436*/ + "inst: LFMA freg , freg , freg., freg \n", /*437*/ + 0, /*438*/ + 0, /*439*/ + 0, /*440*/ + "inst: LRLWM imm , rreg , imm., rreg \n", /*441*/ + "inst: LRLWM imm , rreg , mask., rreg \n", /*442*/ + "mask: con., con \n", /*443*/ + "inst: LRLWM rreg , rreg , imm., rreg \n", /*444*/ + "inst: LRLWM rreg , rreg , mask., rreg \n", /*445*/ + 0, /*446*/ + 0, /*447*/ + 0, /*448*/ + 0, /*449*/ + 0, /*450*/ + 0, /*451*/ + 0, /*452*/ + "ximm: $.addr \nximm: $.LSCONST \nfimm: $.LFCONST \nfimm: $.- LFCONST \nimm: $.con \n", /*453*/ + 0, /*454*/ + "name: LNAME < > offset ( LSB.) \n", /*455*/ + "inst: LBRA con , con , ( xlreg.) \n", /*456*/ + "inst: LFMA freg , freg , freg ,.freg \n", /*457*/ + "inst: LRLWM imm , rreg , imm ,.rreg \n", /*458*/ + "inst: LRLWM imm , rreg , mask ,.rreg \n", /*459*/ + "mask: con ,.con \n", /*460*/ + "inst: LRLWM rreg , rreg , imm ,.rreg \n", /*461*/ + "inst: LRLWM rreg , rreg , mask ,.rreg \n", /*462*/ + "inst: LTEXT name , con , imm :.imm \n", /*463*/ + "fimm: $ -.LFCONST \ncon: -.con \n", /*464*/ + 0, /*465*/ + 0, /*466*/ + 0, /*467*/ + 0, /*468*/ + 0, /*469*/ + 0, /*470*/ + 0, /*471*/ + 0, /*472*/ + 0, /*473*/ +}; diff --git a/utils/qa/y.tab.c b/utils/qa/y.tab.c new file mode 100644 index 0000000..18c2c78 --- /dev/null +++ b/utils/qa/y.tab.c @@ -0,0 +1,1644 @@ + +#line 2 "a.y" +#include "a.h" + +#line 4 "a.y" +typedef union +{ + Sym *sym; + long lval; + double dval; + char sval[8]; + Gen gen; +} YYSTYPE; +extern int yyerrflag; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif +YYSTYPE yylval; +YYSTYPE yyval; +#define LMOVW 57346 +#define LMOVB 57347 +#define LABS 57348 +#define LLOGW 57349 +#define LSHW 57350 +#define LADDW 57351 +#define LCMP 57352 +#define LCROP 57353 +#define LBRA 57354 +#define LFMOV 57355 +#define LFCONV 57356 +#define LFCMP 57357 +#define LFADD 57358 +#define LFMA 57359 +#define LTRAP 57360 +#define LXORW 57361 +#define LNOP 57362 +#define LEND 57363 +#define LRETT 57364 +#define LWORD 57365 +#define LTEXT 57366 +#define LDATA 57367 +#define LRETRN 57368 +#define LCONST 57369 +#define LSP 57370 +#define LSB 57371 +#define LFP 57372 +#define LPC 57373 +#define LCREG 57374 +#define LFLUSH 57375 +#define LREG 57376 +#define LFREG 57377 +#define LR 57378 +#define LCR 57379 +#define LF 57380 +#define LFPSCR 57381 +#define LLR 57382 +#define LCTR 57383 +#define LSPR 57384 +#define LSPREG 57385 +#define LSEG 57386 +#define LMSR 57387 +#define LDCR 57388 +#define LSCHED 57389 +#define LXLD 57390 +#define LXST 57391 +#define LXOP 57392 +#define LXMV 57393 +#define LRLWM 57394 +#define LMOVMW 57395 +#define LMOVEM 57396 +#define LMOVFL 57397 +#define LMTFSB 57398 +#define LMA 57399 +#define LFMOVX 57400 +#define LFCONST 57401 +#define LSCONST 57402 +#define LNAME 57403 +#define LLAB 57404 +#define LVAR 57405 +#define YYEOFCODE 1 +#define YYERRCODE 2 +short yyexca[] = +{-1, 1, + 1, -1, + -2, 0, +}; +#define YYNPROD 192 +#define YYPRIVATE 57344 +#define yydebug 1 +#define YYLAST 920 +short yyact[] = +{ + 47, 53, 92, 107, 442, 283, 177, 56, 110, 51, + 99, 453, 87, 55, 57, 288, 100, 102, 103, 105, + 106, 54, 58, 119, 76, 97, 77, 99, 127, 129, + 131, 2, 133, 135, 66, 138, 151, 142, 76, 63, + 77, 466, 64, 114, 76, 465, 77, 61, 61, 61, + 63, 454, 121, 64, 432, 431, 421, 108, 115, 97, + 99, 52, 420, 401, 397, 76, 61, 77, 400, 212, + 422, 140, 386, 375, 145, 145, 98, 101, 97, 104, + 385, 50, 384, 97, 120, 287, 383, 137, 382, 143, + 128, 381, 147, 380, 93, 96, 167, 141, 122, 379, + 49, 99, 377, 171, 376, 123, 124, 125, 126, 332, + 211, 212, 89, 91, 95, 298, 139, 212, 181, 182, + 183, 165, 206, 213, 214, 238, 172, 176, 175, 174, + 173, 132, 168, 134, 136, 205, 196, 462, 461, 150, + 152, 233, 460, 459, 458, 457, 413, 412, 410, 409, + 209, 408, 407, 406, 254, 263, 264, 405, 404, 272, + 274, 259, 278, 279, 280, 281, 267, 262, 260, 403, + 402, 396, 216, 395, 276, 258, 261, 394, 393, 270, + 240, 241, 275, 277, 392, 302, 305, 306, 391, 390, + 61, 231, 232, 61, 235, 236, 389, 374, 319, 321, + 323, 325, 327, 328, 373, 290, 237, 122, 330, 291, + 292, 293, 295, 297, 230, 257, 300, 301, 268, 334, + 337, 61, 234, 348, 350, 351, 352, 61, 354, 229, + 358, 333, 316, 228, 227, 226, 225, 224, 223, 269, + 222, 331, 221, 220, 219, 218, 217, 209, 340, 215, + 210, 204, 82, 464, 256, 203, 202, 266, 201, 318, + 200, 199, 198, 61, 197, 195, 169, 194, 193, 307, + 308, 309, 310, 190, 361, 314, 362, 48, 88, 90, + 79, 82, 81, 189, 349, 304, 188, 187, 111, 355, + 357, 312, 82, 81, 186, 315, 130, 185, 184, 360, + 344, 345, 346, 347, 387, 59, 388, 164, 163, 79, + 162, 161, 191, 170, 78, 160, 80, 159, 158, 157, + 79, 109, 85, 86, 83, 67, 156, 155, 154, 356, + 118, 359, 153, 46, 45, 82, 81, 44, 41, 42, + 363, 364, 365, 366, 367, 80, 43, 370, 371, 372, + 109, 463, 411, 83, 116, 117, 80, 313, 40, 398, + 113, 112, 399, 79, 83, 192, 65, 76, 166, 77, + 67, 63, 273, 63, 64, 118, 64, 82, 81, 63, + 207, 416, 64, 417, 418, 76, 63, 77, 455, 64, + 423, 424, 425, 426, 427, 428, 429, 78, 239, 80, + 430, 369, 299, 166, 62, 79, 94, 83, 368, 433, + 446, 8, 419, 445, 67, 451, 452, 65, 149, 118, + 255, 179, 180, 265, 191, 148, 438, 439, 440, 60, + 285, 284, 286, 108, 1, 72, 76, 209, 77, 78, + 76, 80, 77, 271, 443, 443, 62, 75, 99, 83, + 74, 303, 285, 284, 286, 82, 81, 311, 456, 468, + 469, 0, 471, 472, 0, 414, 415, 144, 146, 441, + 444, 282, 0, 448, 449, 450, 0, 335, 338, 0, + 294, 296, 0, 79, 436, 437, 245, 246, 247, 0, + 171, 63, 0, 353, 64, 0, 178, 470, 179, 180, + 0, 181, 0, 317, 320, 322, 324, 326, 67, 329, + 76, 447, 77, 118, 0, 0, 0, 78, 282, 80, + 0, 342, 0, 343, 62, 473, 0, 83, 0, 0, + 0, 9, 285, 284, 286, 341, 0, 0, 76, 467, + 77, 0, 0, 10, 11, 18, 16, 17, 15, 27, + 20, 21, 12, 23, 26, 24, 25, 22, 0, 34, + 36, 0, 35, 37, 38, 39, 243, 244, 245, 246, + 247, 82, 81, 252, 251, 250, 248, 249, 243, 244, + 245, 246, 247, 0, 0, 0, 6, 30, 31, 33, + 32, 28, 29, 0, 378, 14, 19, 13, 0, 79, + 4, 3, 5, 0, 67, 7, 76, 63, 77, 68, + 64, 65, 85, 86, 70, 69, 73, 84, 71, 82, + 81, 251, 250, 248, 249, 243, 244, 245, 246, 247, + 82, 81, 0, 78, 0, 80, 0, 0, 0, 0, + 62, 0, 66, 83, 0, 82, 81, 79, 289, 82, + 81, 0, 67, 0, 76, 0, 77, 68, 79, 0, + 85, 86, 70, 69, 73, 84, 71, 434, 82, 81, + 0, 0, 0, 79, 0, 82, 81, 79, 0, 0, + 76, 78, 77, 80, 76, 0, 77, 0, 62, 0, + 99, 83, 116, 117, 80, 0, 79, 82, 81, 435, + 0, 0, 83, 79, 0, 0, 0, 78, 0, 80, + 76, 78, 77, 80, 62, 82, 81, 83, 109, 0, + 0, 83, 0, 0, 0, 79, 0, 82, 81, 0, + 116, 117, 80, 0, 82, 81, 0, 339, 0, 80, + 83, 0, 0, 79, 109, 82, 81, 83, 248, 249, + 243, 244, 245, 246, 247, 79, 0, 82, 81, 116, + 117, 80, 79, 0, 82, 81, 336, 0, 0, 83, + 0, 0, 0, 79, 0, 0, 0, 116, 117, 80, + 0, 0, 0, 0, 208, 79, 0, 83, 170, 78, + 0, 80, 79, 0, 313, 0, 109, 0, 80, 83, + 0, 0, 0, 109, 0, 0, 83, 0, 0, 80, + 0, 0, 0, 0, 109, 0, 99, 83, 0, 78, + 0, 80, 0, 0, 0, 0, 109, 0, 80, 83, + 0, 0, 0, 109, 0, 0, 83, 252, 251, 250, + 248, 249, 243, 244, 245, 246, 247, 252, 251, 250, + 248, 249, 243, 244, 245, 246, 247, 67, 0, 0, + 0, 0, 118, 0, 0, 0, 0, 70, 69, 0, + 84, 71, 250, 248, 249, 243, 244, 245, 246, 247, + 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, 253, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 242 +}; +short yypact[] = +{ +-1000, 529,-1000, 284, 264, 271, 261,-1000, 258, 257, + 562, 636, 326, 5, -70, -20, 396, -20, 396, 396, + 755, 283, 21, 334, 334, 334, 334, 396, -20, 640, + -19, 396, 0, -19, -6, -46, 130, 748, 748, 130, +-1000,-1000, 755, 755,-1000,-1000,-1000, 255, 251, 250, + 249, 242, 241, 240, 238, 234, 233, 231, 230,-1000, +-1000, 43, 666,-1000, 54,-1000, 718,-1000, 48,-1000, + 52, 51,-1000, 50,-1000,-1000,-1000, 49, 489,-1000, +-1000, 755, 755, 755,-1000,-1000,-1000, 221, 220, 217, + 210, 209, 206, 196, 355, 191, 190, 396, 188, 755, + 187, 185, 184, 183, 181, 179, 178, 174,-1000, 755, +-1000,-1000, 272, 706, 173, 33, 489, 412, 48, 172, + 169,-1000,-1000, 168, 167, 166, 165, 163, 161, 160, + 159, 158, 157, 156, 152, 137,-1000,-1000, 130, 130, + 341, 130, 130,-1000, 129, 47, 386,-1000, 529, 529, + 843,-1000, 833, 610, 396, 396, 368, 328, 323, 396, + 815, 466, 396, 396, 396, 392, 6, 569, 755,-1000, +-1000, 43, 755, 755, 666, 666, 755, 37, 394, 755, + 755,-1000,-1000,-1000, 636, 396, 396, 334, 334, 334, + 446,-1000, 288, 334, -19, 755,-1000, -20, 396, 396, + 396, 396, 396, 396, 755, 30,-1000,-1000, 272, 39, + 688, 659, 494, 37,-1000, 396,-1000, 396, 334, 334, + 334, 334, -20, 396, 396, 396, 748, -20, -53, 396, + -19,-1000,-1000,-1000,-1000,-1000,-1000, 736, 414, 755, +-1000,-1000,-1000, 755, 755, 755, 755, 755, 401, 393, + 755, 755, 755,-1000,-1000,-1000,-1000, 127,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 120,-1000, +-1000,-1000,-1000, -5,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, 25, 23,-1000,-1000,-1000,-1000, 396,-1000, + 20, 14, 12, 9, 7, 3, 1, -7, 414, 412, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000, 119, 112,-1000, + 111,-1000, 107,-1000, 101,-1000, 100,-1000,-1000, 96, +-1000, 94,-1000, -15,-1000,-1000, 272,-1000,-1000, 272, + -9, -16,-1000,-1000,-1000, 93, 92, 81, 80, 76, + 75, 74,-1000,-1000,-1000, 72,-1000, 71,-1000,-1000, + 278, 70, 69, 475, 475,-1000,-1000,-1000, 755, 755, + 741, 866, 616, 336, 317, 755,-1000,-1000, -17,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000, -23, -8, 396, + 396, 396, 396, 396, 396, 396, 755,-1000, -24, -25, + 621,-1000, 334, 334, 372, 372, 372, 736, 736, 396, + -19, -70, -70, -69, 557, 557,-1000,-1000,-1000, -28, +-1000,-1000, 349,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000, 272,-1000, 68,-1000,-1000, +-1000, 67, 66, 65, 61, 60,-1000,-1000,-1000, 277, +-1000,-1000,-1000, 243,-1000, -34, -38, 334, 396, 396, + 755, 396, 396, -70, 725,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000 +}; +short yypgo[] = +{ + 0, 36, 96, 5, 6, 305, 266, 0, 100, 429, + 21, 81, 22, 450, 447, 61, 1, 2, 8, 13, + 7, 3, 9, 443, 14, 435, 4, 434, 31, 425, + 418, 411, 52 +}; +short yyr1[] = +{ + 0, 27, 27, 29, 28, 30, 28, 28, 28, 28, + 28, 28, 28, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 18, 18, + 18, 7, 12, 12, 13, 20, 14, 25, 19, 19, + 19, 19, 19, 24, 24, 22, 23, 11, 11, 10, + 10, 21, 26, 16, 16, 17, 17, 15, 5, 5, + 8, 8, 6, 6, 9, 9, 9, 32, 32, 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, 4, 4, 2, + 1, 2, 2, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 6, 4, 4, 4, 6, + 4, 4, 6, 6, 6, 4, 4, 6, 4, 6, + 4, 6, 4, 4, 2, 6, 4, 4, 4, 6, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 4, 3, 3, 5, 4, 4, 6, 4, + 4, 6, 6, 6, 8, 4, 4, 3, 2, 4, + 4, 6, 8, 4, 6, 4, 4, 6, 6, 8, + 8, 8, 8, 4, 4, 4, 6, 4, 6, 4, + 4, 2, 2, 3, 3, 3, 3, 3, 3, 2, + 4, 6, 6, 8, 6, 6, 6, 2, 4, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 1, 4, 4, 1, 4, 1, 4, 1, + 4, 1, 3, 2, 2, 2, 3, 2, 1, 4, + 3, 5, 1, 4, 4, 5, 7, 0, 1, 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, -27, -28, 72, 71, 73, 57, 76, -31, 2, + 14, 15, 23, 68, 66, 19, 17, 18, 16, 67, + 21, 22, 28, 24, 26, 27, 25, 20, 62, 63, + 58, 59, 61, 60, 30, 33, 31, 34, 35, 36, + 74, 74, 75, 75, 76, 76, 76, -7, -6, -8, + -11, -22, -15, -16, -10, -19, -20, -24, -12, -5, + -9, -1, 78, 45, 48, 49, 80, 42, 47, 53, + 52, 56, -25, 54, -13, -14, 44, 46, 71, 37, + 73, 10, 9, 81, 55, 50, 51, -7, -6, -8, + -6, -8, -17, -11, 80, -8, -11, 78, -15, 80, + -7, -15, -7, -7, -15, -7, -7, -21, -1, 78, + -18, -6, 78, 77, -10, -1, 71, 72, 47, -7, + -15, -32, 77, -11, -11, -11, -11, -7, -15, -7, + -6, -7, -8, -7, -8, -7, -8, -32, -7, -11, + 77, -15, -16, -32, -9, -1, -9, -32, -29, -30, + -2, -1, -2, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 78, -5, -2, 78, -6, + 70, -1, 78, 78, 78, 78, 78, -4, 7, 9, + 10, -1, -1, -1, 77, 77, 77, 77, 77, 77, + 77, 69, 10, 77, 77, 77, -1, 77, 77, 77, + 77, 77, 77, 77, 77, -12, -18, -6, 78, -1, + 77, 77, 78, -4, -4, 77, -32, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, -32, -32, -7, -11, -32, -32, 77, 78, 12, + -28, -28, 76, 9, 10, 11, 12, 13, 7, 8, + 6, 5, 4, 76, -7, -6, -8, -15, -10, -20, + -24, -12, -19, -7, -7, -6, -8, -22, -15, -11, + -10, -23, -7, 49, -7, -10, -19, -10, -7, -7, + -7, -7, -5, -3, 39, 38, 40, 79, 9, 79, + -1, -1, -1, -1, -5, -1, -5, -1, 78, 8, + -1, -1, -7, -6, -8, -7, -7, -11, -11, -11, + -11, -6, -8, 69, -11, -8, -1, -5, -15, -7, + -5, -7, -5, -7, -5, -7, -5, -7, -7, -5, + -21, -1, 79, -12, -18, -6, 78, -18, -6, 78, + -1, 41, -5, -5, -11, -11, -11, -11, -7, -15, + -7, -7, -7, -6, -7, -15, -8, -15, -7, -8, + -15, -1, -1, -2, -2, -2, -2, -2, 7, 8, + -2, -2, -2, 77, 77, 78, 79, 79, -5, 79, + 79, 79, 79, 79, 79, 79, 79, -3, -4, 77, + 77, 77, 77, 77, 77, 77, 77, 79, -12, -12, + 77, 79, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 74, 77, 77, -2, -2, -20, 47, -22, -1, + 79, 79, 78, -7, -7, -7, -7, -7, -7, -7, + -21, 79, 79, -18, -6, 78, -11, -11, -10, -10, + -10, -15, -26, -1, -15, -26, -7, -8, -15, -15, + -15, -16, -17, 80, 79, 39, -12, 77, 77, 77, + 77, 77, 77, 74, 10, 79, 79, -11, -7, -7, + -1, -7, -7, -15 +}; +short yydef[] = +{ + 1, -2, 2, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 167, 0, 167, 0, 0, 167, + 3, 5, 0, 0, 9, 11, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, + 162, 0, 0, 147, 0, 145, 0, 149, 135, 138, + 0, 0, 142, 0, 132, 133, 158, 0, 169, 175, + 176, 0, 0, 0, 137, 134, 136, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 0, 0, 151, 0, + 70, 71, 0, 0, 0, 0, 169, 169, 0, 167, + 0, 88, 168, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 111, 112, 167, 167, + 168, 167, 167, 119, 0, 0, 0, 127, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, + 154, 157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, + 0, 155, 0, 0, 0, 0, 157, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, + 0, 0, 0, 129, 130, 168, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 113, 114, 115, 116, 117, 118, 0, 0, 0, + 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 13, 27, 28, 0, 40, 41, + 65, 67, 69, 14, 15, 31, 32, 34, 0, 33, + 36, 37, 56, 0, 57, 60, 68, 61, 63, 62, + 64, 66, 0, 0, 172, 173, 174, 160, 0, 180, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, + 170, 171, 16, 29, 30, 17, 18, 19, 20, 21, + 22, 23, 24, 156, 25, 26, 38, 131, 0, 45, + 131, 46, 131, 48, 131, 50, 131, 52, 53, 0, + 58, 151, 72, 0, 76, 77, 0, 79, 80, 0, + 0, 0, 85, 86, 89, 90, 0, 93, 95, 96, + 0, 0, 103, 104, 105, 0, 107, 0, 109, 110, + 120, 0, 0, 182, 183, 184, 185, 186, 0, 0, + 189, 190, 191, 0, 0, 0, 163, 164, 0, 148, + 150, 139, 140, 141, 143, 144, 159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 187, 188, 39, 135, 35, 0, + 161, 165, 0, 42, 44, 43, 47, 49, 51, 55, + 59, 78, 81, 82, 83, 0, 91, 0, 94, 97, + 98, 0, 0, 0, 0, 0, 106, 108, 122, 121, + 124, 125, 126, 0, 146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166, 84, 92, 99, 100, + 152, 101, 102, 123 +}; +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, 80, 13, 6, 0, + 78, 79, 11, 9, 77, 10, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 76, + 7, 75, 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, 81 +}; +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, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73 +}; +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 38 "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 45 "a.y" +{ + yypt[-1].yyv.sym->type = LLAB; + yypt[-1].yyv.sym->value = pc; + } break; +case 7: +#line 51 "a.y" +{ + yypt[-3].yyv.sym->type = LVAR; + yypt[-3].yyv.sym->value = yypt[-1].yyv.lval; + } break; +case 8: +#line 56 "a.y" +{ + if(yypt[-3].yyv.sym->value != yypt[-1].yyv.lval) + yyerror("redeclaration of %s", yypt[-3].yyv.sym->name); + yypt[-3].yyv.sym->value = yypt[-1].yyv.lval; + } break; +case 9: +#line 62 "a.y" +{ + nosched = yypt[-1].yyv.lval; + } break; +case 13: +#line 74 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 14: +#line 78 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 15: +#line 82 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 16: +#line 86 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 17: +#line 90 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 18: +#line 94 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 19: +#line 101 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 20: +#line 105 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 21: +#line 109 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 22: +#line 113 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 23: +#line 117 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 24: +#line 121 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 25: +#line 128 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 26: +#line 132 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 27: +#line 139 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 28: +#line 143 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 29: +#line 147 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 30: +#line 151 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 31: +#line 158 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 32: +#line 162 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 33: +#line 169 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 34: +#line 173 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 35: +#line 177 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 36: +#line 181 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 37: +#line 185 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 38: +#line 189 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, yypt[-0].yyv.lval, &nullgen); + } break; +case 39: +#line 196 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 40: +#line 200 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 41: +#line 204 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 42: +#line 214 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 43: +#line 218 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 44: +#line 222 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 45: +#line 226 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 46: +#line 230 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 47: +#line 234 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 48: +#line 238 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 49: +#line 242 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 50: +#line 246 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 51: +#line 250 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 52: +#line 254 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 53: +#line 258 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 54: +#line 262 "a.y" +{ + outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 55: +#line 269 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 56: +#line 276 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 57: +#line 280 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 58: +#line 287 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, yypt[-0].yyv.gen.reg, &yypt[-0].yyv.gen); + } break; +case 59: +#line 291 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 60: +#line 299 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 61: +#line 303 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 62: +#line 307 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 63: +#line 311 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 64: +#line 315 "a.y" +{ + int r; + r = yypt[-2].yyv.gen.offset; + yypt[-2].yyv.gen.offset = 0; + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, r, &yypt[-0].yyv.gen); + } break; +case 65: +#line 322 "a.y" +{ + int r; + r = yypt[-0].yyv.gen.offset; + yypt[-0].yyv.gen.offset = 0; + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, r, &yypt[-0].yyv.gen); + } break; +case 66: +#line 329 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 67: +#line 333 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 68: +#line 337 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 69: +#line 341 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 70: +#line 350 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 71: +#line 354 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 72: +#line 358 "a.y" +{ + outcode(yypt[-3].yyv.lval, &nullgen, NREG, &yypt[-1].yyv.gen); + } break; +case 73: +#line 362 "a.y" +{ + outcode(yypt[-2].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 74: +#line 366 "a.y" +{ + outcode(yypt[-2].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 75: +#line 370 "a.y" +{ + outcode(yypt[-4].yyv.lval, &nullgen, NREG, &yypt[-1].yyv.gen); + } break; +case 76: +#line 374 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 77: +#line 378 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 78: +#line 382 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-1].yyv.gen); + } break; +case 79: +#line 386 "a.y" +{ + outcode(yypt[-3].yyv.lval, &nullgen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 80: +#line 390 "a.y" +{ + outcode(yypt[-3].yyv.lval, &nullgen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 81: +#line 394 "a.y" +{ + outcode(yypt[-5].yyv.lval, &nullgen, yypt[-4].yyv.lval, &yypt[-1].yyv.gen); + } break; +case 82: +#line 398 "a.y" +{ + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = yypt[-4].yyv.lval; + outcode(yypt[-5].yyv.lval, &g, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 83: +#line 406 "a.y" +{ + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = yypt[-4].yyv.lval; + outcode(yypt[-5].yyv.lval, &g, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 84: +#line 414 "a.y" +{ + Gen g; + g = nullgen; + g.type = D_CONST; + g.offset = yypt[-6].yyv.lval; + outcode(yypt[-7].yyv.lval, &g, yypt[-4].yyv.lval, &yypt[-1].yyv.gen); + } break; +case 85: +#line 425 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, yypt[-0].yyv.lval, &nullgen); + } break; +case 86: +#line 429 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, yypt[-0].yyv.lval, &nullgen); + } break; +case 87: +#line 433 "a.y" +{ + outcode(yypt[-2].yyv.lval, &yypt[-1].yyv.gen, NREG, &nullgen); + } break; +case 88: +#line 437 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &nullgen); + } break; +case 89: +#line 444 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 90: +#line 448 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 91: +#line 452 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.gen.reg, &yypt[-0].yyv.gen); + } break; +case 92: +#line 456 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.gen.reg, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 93: +#line 460 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 94: +#line 464 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-0].yyv.gen.reg, &yypt[-2].yyv.gen); + } break; +case 95: +#line 471 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 96: +#line 475 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 97: +#line 479 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-0].yyv.gen.reg, &yypt[-2].yyv.gen); + } break; +case 98: +#line 483 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-0].yyv.gen.reg, &yypt[-2].yyv.gen); + } break; +case 99: +#line 490 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.gen.reg, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 100: +#line 494 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.gen.reg, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 101: +#line 498 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.gen.reg, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 102: +#line 502 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.gen.reg, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 103: +#line 509 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 104: +#line 513 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 105: +#line 521 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 106: +#line 525 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 107: +#line 529 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 108: +#line 533 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-2].yyv.gen, &yypt[-0].yyv.gen); + } break; +case 109: +#line 537 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 110: +#line 541 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 111: +#line 545 "a.y" +{ + outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen, NREG, &nullgen); + } break; +case 112: +#line 552 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &nullgen); + } break; +case 113: +#line 556 "a.y" +{ + outcode(yypt[-2].yyv.lval, &yypt[-1].yyv.gen, NREG, &nullgen); + } break; +case 114: +#line 560 "a.y" +{ + outcode(yypt[-2].yyv.lval, &yypt[-1].yyv.gen, NREG, &nullgen); + } break; +case 115: +#line 564 "a.y" +{ + outcode(yypt[-2].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 116: +#line 568 "a.y" +{ + outcode(yypt[-2].yyv.lval, &nullgen, NREG, &yypt[-0].yyv.gen); + } break; +case 117: +#line 575 "a.y" +{ + outcode(yypt[-2].yyv.lval, &yypt[-1].yyv.gen, NREG, &nullgen); + } break; +case 118: +#line 579 "a.y" +{ + outcode(yypt[-2].yyv.lval, &yypt[-1].yyv.gen, NREG, &nullgen); + } break; +case 119: +#line 586 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &nullgen); + } break; +case 120: +#line 593 "a.y" +{ + outcode(yypt[-3].yyv.lval, &yypt[-2].yyv.gen, NREG, &yypt[-0].yyv.gen); + } break; +case 121: +#line 597 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 122: +#line 601 "a.y" +{ + outgcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, NREG, &yypt[-0].yyv.gen, &yypt[-2].yyv.gen); + } break; +case 123: +#line 605 "a.y" +{ + outgcode(yypt[-7].yyv.lval, &yypt[-6].yyv.gen, yypt[-4].yyv.lval, &yypt[-0].yyv.gen, &yypt[-2].yyv.gen); + } break; +case 124: +#line 612 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 125: +#line 616 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 126: +#line 620 "a.y" +{ + outcode(yypt[-5].yyv.lval, &yypt[-4].yyv.gen, yypt[-2].yyv.lval, &yypt[-0].yyv.gen); + } break; +case 127: +#line 627 "a.y" +{ + outcode(yypt[-1].yyv.lval, &nullgen, NREG, &nullgen); + } break; +case 128: +#line 633 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_BRANCH; + yyval.gen.offset = yypt[-3].yyv.lval + pc; + } break; +case 129: +#line 639 "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 130: +#line 648 "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 131: +#line 657 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_REG; + yyval.gen.reg = yypt[-0].yyv.lval; + } break; +case 134: +#line 669 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SPR; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 135: +#line 677 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CREG; + yyval.gen.reg = NREG; /* whole register */ + } break; +case 136: +#line 685 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SPR; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 137: +#line 693 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_MSR; + } break; +case 138: +#line 700 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SPR; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 139: +#line 706 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-3].yyv.lval; + yyval.gen.offset = yypt[-1].yyv.lval; + } break; +case 140: +#line 712 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-3].yyv.lval; + yyval.gen.offset = yypt[-1].yyv.lval; + } break; +case 141: +#line 718 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = yypt[-3].yyv.lval; + yyval.gen.reg = yypt[-1].yyv.lval; + yyval.gen.offset = 0; + } break; +case 143: +#line 728 "a.y" +{ + if(yypt[-1].yyv.lval < 0 || yypt[-1].yyv.lval > 15) + yyerror("segment register number out of range"); + yyval.gen = nullgen; + yyval.gen.type = D_SREG; + yyval.gen.reg = yypt[-1].yyv.lval; + yyval.gen.offset = NREG; + } break; +case 144: +#line 737 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SREG; + yyval.gen.reg = NREG; + yyval.gen.offset = yypt[-1].yyv.lval; + } break; +case 145: +#line 746 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FPSCR; + yyval.gen.reg = NREG; + } break; +case 146: +#line 754 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FPSCR; + yyval.gen.reg = yypt[-1].yyv.lval; + } break; +case 147: +#line 762 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FREG; + yyval.gen.reg = yypt[-0].yyv.lval; + } break; +case 148: +#line 768 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FREG; + yyval.gen.reg = yypt[-1].yyv.lval; + } break; +case 149: +#line 776 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CREG; + yyval.gen.reg = yypt[-0].yyv.lval; + } break; +case 150: +#line 782 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CREG; + yyval.gen.reg = yypt[-1].yyv.lval; + } break; +case 151: +#line 790 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_REG; + yyval.gen.reg = yypt[-0].yyv.lval; + } break; +case 152: +#line 798 "a.y" +{ + int mb, me; + ulong v; + + yyval.gen = nullgen; + yyval.gen.type = D_CONST; + mb = yypt[-2].yyv.lval; + me = yypt[-0].yyv.lval; + if(mb < 0 || mb > 31 || me < 0 || me > 31){ + yyerror("illegal mask start/end value(s)"); + mb = me = 0; + } + if(mb <= me) + v = ((ulong)~0L>>mb) & (~0L<<(31-me)); + else + v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1)))); + yyval.gen.offset = v; + } break; +case 153: +#line 819 "a.y" +{ + yyval.gen = yypt[-0].yyv.gen; + yyval.gen.type = D_CONST; + } break; +case 154: +#line 824 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_SCONST; + memcpy(yyval.gen.sval, yypt[-0].yyv.sval, sizeof(yyval.gen.sval)); + } break; +case 155: +#line 832 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FCONST; + yyval.gen.dval = yypt[-0].yyv.dval; + } break; +case 156: +#line 838 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_FCONST; + yyval.gen.dval = -yypt[-0].yyv.dval; + } break; +case 157: +#line 845 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_CONST; + yyval.gen.offset = yypt[-0].yyv.lval; + } break; +case 159: +#line 854 "a.y" +{ + if(yyval.lval < 0 || yyval.lval >= NREG) + print("register value out of range\n"); + yyval.lval = yypt[-1].yyv.lval; + } break; +case 160: +#line 862 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.reg = yypt[-1].yyv.lval; + yyval.gen.offset = 0; + } break; +case 161: +#line 869 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.reg = yypt[-3].yyv.lval; + yyval.gen.xreg = yypt[-1].yyv.lval; + yyval.gen.offset = 0; + } break; +case 163: +#line 880 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.reg = yypt[-1].yyv.lval; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 164: +#line 889 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.name = yypt[-1].yyv.lval; + yyval.gen.sym = S; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 165: +#line 897 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.name = yypt[-1].yyv.lval; + yyval.gen.sym = yypt[-4].yyv.sym; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 166: +#line 905 "a.y" +{ + yyval.gen = nullgen; + yyval.gen.type = D_OREG; + yyval.gen.name = D_STATIC; + yyval.gen.sym = yypt[-6].yyv.sym; + yyval.gen.offset = yypt[-3].yyv.lval; + } break; +case 169: +#line 917 "a.y" +{ + yyval.lval = 0; + } break; +case 170: +#line 921 "a.y" +{ + yyval.lval = yypt[-0].yyv.lval; + } break; +case 171: +#line 925 "a.y" +{ + yyval.lval = -yypt[-0].yyv.lval; + } break; +case 176: +#line 937 "a.y" +{ + yyval.lval = yypt[-0].yyv.sym->value; + } break; +case 177: +#line 941 "a.y" +{ + yyval.lval = -yypt[-0].yyv.lval; + } break; +case 178: +#line 945 "a.y" +{ + yyval.lval = yypt[-0].yyv.lval; + } break; +case 179: +#line 949 "a.y" +{ + yyval.lval = ~yypt[-0].yyv.lval; + } break; +case 180: +#line 953 "a.y" +{ + yyval.lval = yypt[-1].yyv.lval; + } break; +case 182: +#line 960 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval + yypt[-0].yyv.lval; + } break; +case 183: +#line 964 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval - yypt[-0].yyv.lval; + } break; +case 184: +#line 968 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval * yypt[-0].yyv.lval; + } break; +case 185: +#line 972 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval / yypt[-0].yyv.lval; + } break; +case 186: +#line 976 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval % yypt[-0].yyv.lval; + } break; +case 187: +#line 980 "a.y" +{ + yyval.lval = yypt[-3].yyv.lval << yypt[-0].yyv.lval; + } break; +case 188: +#line 984 "a.y" +{ + yyval.lval = yypt[-3].yyv.lval >> yypt[-0].yyv.lval; + } break; +case 189: +#line 988 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval & yypt[-0].yyv.lval; + } break; +case 190: +#line 992 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval ^ yypt[-0].yyv.lval; + } break; +case 191: +#line 996 "a.y" +{ + yyval.lval = yypt[-2].yyv.lval | yypt[-0].yyv.lval; + } break; + } + goto yystack; /* stack new state and value */ +} diff --git a/utils/qa/y.tab.h b/utils/qa/y.tab.h new file mode 100644 index 0000000..23e60ef --- /dev/null +++ b/utils/qa/y.tab.h @@ -0,0 +1,70 @@ + +typedef union +{ + Sym *sym; + long lval; + double dval; + char sval[8]; + Gen gen; +} YYSTYPE; +extern YYSTYPE yylval; +#define LMOVW 57346 +#define LMOVB 57347 +#define LABS 57348 +#define LLOGW 57349 +#define LSHW 57350 +#define LADDW 57351 +#define LCMP 57352 +#define LCROP 57353 +#define LBRA 57354 +#define LFMOV 57355 +#define LFCONV 57356 +#define LFCMP 57357 +#define LFADD 57358 +#define LFMA 57359 +#define LTRAP 57360 +#define LXORW 57361 +#define LNOP 57362 +#define LEND 57363 +#define LRETT 57364 +#define LWORD 57365 +#define LTEXT 57366 +#define LDATA 57367 +#define LRETRN 57368 +#define LCONST 57369 +#define LSP 57370 +#define LSB 57371 +#define LFP 57372 +#define LPC 57373 +#define LCREG 57374 +#define LFLUSH 57375 +#define LREG 57376 +#define LFREG 57377 +#define LR 57378 +#define LCR 57379 +#define LF 57380 +#define LFPSCR 57381 +#define LLR 57382 +#define LCTR 57383 +#define LSPR 57384 +#define LSPREG 57385 +#define LSEG 57386 +#define LMSR 57387 +#define LDCR 57388 +#define LSCHED 57389 +#define LXLD 57390 +#define LXST 57391 +#define LXOP 57392 +#define LXMV 57393 +#define LRLWM 57394 +#define LMOVMW 57395 +#define LMOVEM 57396 +#define LMOVFL 57397 +#define LMTFSB 57398 +#define LMA 57399 +#define LFMOVX 57400 +#define LFCONST 57401 +#define LSCONST 57402 +#define LNAME 57403 +#define LLAB 57404 +#define LVAR 57405 |
