00001 typedef struct {
00002 unsigned char max_unaligned_load;
00003 Symbol (*rmap)(int);
00004
00005 void (*blkfetch)(int size, int off, int reg, int tmp);
00006 void (*blkstore)(int size, int off, int reg, int tmp);
00007 void (*blkloop)(int dreg, int doff,
00008 int sreg, int soff,
00009 int size, int tmps[]);
00010 void (*_label)(Node);
00011 int (*_rule)(void*, int);
00012 short **_nts;
00013 void (*_kids)(Node, int, Node*);
00014 char **_string;
00015 char **_templates;
00016 char *_isinstruction;
00017 char **_ntname;
00018 void (*emit2)(Node);
00019 void (*doarg)(Node);
00020 void (*target)(Node);
00021 void (*clobber)(Node);
00022 } Xinterface;
00023 extern int askregvar(Symbol, Symbol);
00024 extern void blkcopy(int, int, int, int, int, int[]);
00025 extern int getregnum(Node);
00026 extern int mayrecalc(Node);
00027 extern int mkactual(int, int);
00028 extern void mkauto(Symbol);
00029 extern Symbol mkreg(char *, int, int, int);
00030 extern Symbol mkwildcard(Symbol *);
00031 extern int move(Node);
00032 extern int notarget(Node);
00033 extern void parseflags(int, char **);
00034 extern int range(Node, int, int);
00035 extern unsigned regloc(Symbol);
00036 extern void rtarget(Node, int, Symbol);
00037 extern void setreg(Node, Symbol);
00038 extern void spill(unsigned, int, Node);
00039 extern int widens(Node);
00040
00041 extern int argoffset, maxargoffset;
00042 extern int bflag, dflag;
00043 extern int dalign, salign;
00044 extern int framesize;
00045 extern unsigned freemask[], usedmask[];
00046 extern int offset, maxoffset;
00047 extern int swap;
00048 extern unsigned tmask[], vmask[];
00049 typedef struct {
00050 unsigned listed:1;
00051 unsigned registered:1;
00052 unsigned emitted:1;
00053 unsigned copy:1;
00054 unsigned equatable:1;
00055 unsigned spills:1;
00056 unsigned mayrecalc:1;
00057 void *state;
00058 short inst;
00059 Node kids[3];
00060 Node prev, next;
00061 Node prevuse;
00062 short argno;
00063 } Xnode;
00064 typedef struct {
00065 Symbol vbl;
00066 short set;
00067 short number;
00068 unsigned mask;
00069 } *Regnode;
00070 enum { IREG=0, FREG=1 };
00071 typedef struct {
00072 char *name;
00073 unsigned int eaddr;
00074 int offset;
00075 Node lastuse;
00076 int usecount;
00077 Regnode regnode;
00078 Symbol *wildcard;
00079 } Xsymbol;
00080 enum { RX=2 };
00081 typedef struct {
00082 int offset;
00083 unsigned freemask[2];
00084 } Env;
00085
00086 #define LBURG_MAX SHRT_MAX
00087
00088 enum { VREG=(44<<4) };
00089
00090
00091 extern void blockbeg(Env *);
00092 extern void blockend(Env *);
00093 extern void emit(Node);
00094 extern Node gen(Node);
00095
00096 extern unsigned emitbin(Node, int);
00097
00098 #ifdef NDEBUG
00099 #define debug(x) (void)0
00100 #else
00101 #define debug(x) (void)(dflag&&((x),0))
00102 #endif