mirror of
https://github.com/UberGames/lilium-voyager.git
synced 2024-12-14 22:20:58 +00:00
102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
typedef struct {
|
|
unsigned char max_unaligned_load;
|
|
Symbol (*rmap)(int);
|
|
|
|
void (*blkfetch)(int size, int off, int reg, int tmp);
|
|
void (*blkstore)(int size, int off, int reg, int tmp);
|
|
void (*blkloop)(int dreg, int doff,
|
|
int sreg, int soff,
|
|
int size, int tmps[]);
|
|
void (*_label)(Node);
|
|
int (*_rule)(void*, int);
|
|
short **_nts;
|
|
void (*_kids)(Node, int, Node*);
|
|
char **_string;
|
|
char **_templates;
|
|
char *_isinstruction;
|
|
char **_ntname;
|
|
void (*emit2)(Node);
|
|
void (*doarg)(Node);
|
|
void (*target)(Node);
|
|
void (*clobber)(Node);
|
|
} Xinterface;
|
|
extern int askregvar(Symbol, Symbol);
|
|
extern void blkcopy(int, int, int, int, int, int[]);
|
|
extern int getregnum(Node);
|
|
extern int mayrecalc(Node);
|
|
extern int mkactual(int, int);
|
|
extern void mkauto(Symbol);
|
|
extern Symbol mkreg(char *, int, int, int);
|
|
extern Symbol mkwildcard(Symbol *);
|
|
extern int move(Node);
|
|
extern int notarget(Node);
|
|
extern void parseflags(int, char **);
|
|
extern int range(Node, int, int);
|
|
extern unsigned regloc(Symbol); /* omit */
|
|
extern void rtarget(Node, int, Symbol);
|
|
extern void setreg(Node, Symbol);
|
|
extern void spill(unsigned, int, Node);
|
|
extern int widens(Node);
|
|
|
|
extern int argoffset, maxargoffset;
|
|
extern int bflag, dflag;
|
|
extern int dalign, salign;
|
|
extern int framesize;
|
|
extern unsigned freemask[], usedmask[];
|
|
extern int offset, maxoffset;
|
|
extern int swap;
|
|
extern unsigned tmask[], vmask[];
|
|
typedef struct {
|
|
unsigned listed:1;
|
|
unsigned registered:1;
|
|
unsigned emitted:1;
|
|
unsigned copy:1;
|
|
unsigned equatable:1;
|
|
unsigned spills:1;
|
|
unsigned mayrecalc:1;
|
|
void *state;
|
|
short inst;
|
|
Node kids[3];
|
|
Node prev, next;
|
|
Node prevuse;
|
|
short argno;
|
|
} Xnode;
|
|
typedef struct {
|
|
Symbol vbl;
|
|
short set;
|
|
short number;
|
|
unsigned mask;
|
|
} *Regnode;
|
|
enum { IREG=0, FREG=1 };
|
|
typedef struct {
|
|
char *name;
|
|
unsigned int eaddr; /* omit */
|
|
int offset;
|
|
Node lastuse;
|
|
int usecount;
|
|
Regnode regnode;
|
|
Symbol *wildcard;
|
|
} Xsymbol;
|
|
enum { RX=2 };
|
|
typedef struct {
|
|
int offset;
|
|
unsigned freemask[2];
|
|
} Env;
|
|
|
|
#define LBURG_MAX SHRT_MAX
|
|
|
|
enum { VREG=(44<<4) };
|
|
|
|
/* Exported for the front end */
|
|
extern void blockbeg(Env *);
|
|
extern void blockend(Env *);
|
|
extern void emit(Node);
|
|
extern Node gen(Node);
|
|
|
|
extern unsigned emitbin(Node, int);
|
|
|
|
#ifdef NDEBUG
|
|
#define debug(x) (void)0
|
|
#else
|
|
#define debug(x) (void)(dflag&&((x),0))
|
|
#endif
|