aboutsummaryrefslogtreecommitdiff
path: root/utils/qa
diff options
context:
space:
mode:
authorbhgv <bhgv.empire@gmail.com>2018-03-01 16:54:45 +0200
committerbhgv <bhgv.empire@gmail.com>2018-03-01 16:54:45 +0200
commitb786f20bbab5a59046aa78a2c6c2a11536497202 (patch)
tree0851ecdec889eb9b7ba3751cc04d4f0b474e4a9e /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.h199
-rw-r--r--utils/qa/a.y998
-rw-r--r--utils/qa/lex.c940
-rw-r--r--utils/qa/mkfile29
-rw-r--r--utils/qa/y.debug561
-rw-r--r--utils/qa/y.tab.c1644
-rw-r--r--utils/qa/y.tab.h70
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