xref: /inferno-os/utils/0c/gc.h (revision 45a20ab721a513710138340faff3d59a31c3e01e)
174a4d8c2SCharles.Forsyth #include	"../cc/cc.h"
274a4d8c2SCharles.Forsyth #include	"../vc/v.out.h"
374a4d8c2SCharles.Forsyth 
474a4d8c2SCharles.Forsyth /*
574a4d8c2SCharles.Forsyth  * 0c/spim
674a4d8c2SCharles.Forsyth  * Mips 4000 little endian
774a4d8c2SCharles.Forsyth  */
874a4d8c2SCharles.Forsyth #define	SZ_CHAR		1
974a4d8c2SCharles.Forsyth #define	SZ_SHORT	2
1074a4d8c2SCharles.Forsyth #define	SZ_INT		4
1174a4d8c2SCharles.Forsyth #define	SZ_LONG		4
1274a4d8c2SCharles.Forsyth #define	SZ_IND		4
1374a4d8c2SCharles.Forsyth #define	SZ_FLOAT	4
1474a4d8c2SCharles.Forsyth #define	SZ_VLONG	8
1574a4d8c2SCharles.Forsyth #define	SZ_DOUBLE	8
1674a4d8c2SCharles.Forsyth #define	FNX		100
1774a4d8c2SCharles.Forsyth 
1874a4d8c2SCharles.Forsyth typedef	struct	Adr	Adr;
1974a4d8c2SCharles.Forsyth typedef	struct	Prog	Prog;
2074a4d8c2SCharles.Forsyth typedef	struct	Case	Case;
2174a4d8c2SCharles.Forsyth typedef	struct	C1	C1;
2274a4d8c2SCharles.Forsyth typedef	struct	Multab	Multab;
2374a4d8c2SCharles.Forsyth typedef	struct	Hintab	Hintab;
2474a4d8c2SCharles.Forsyth typedef	struct	Var	Var;
2574a4d8c2SCharles.Forsyth typedef	struct	Reg	Reg;
2674a4d8c2SCharles.Forsyth typedef	struct	Rgn	Rgn;
2774a4d8c2SCharles.Forsyth 
2874a4d8c2SCharles.Forsyth struct	Adr
2974a4d8c2SCharles.Forsyth {
3074a4d8c2SCharles.Forsyth 	long	offset;
3174a4d8c2SCharles.Forsyth 	double	dval;
3274a4d8c2SCharles.Forsyth 	vlong	vval;
3374a4d8c2SCharles.Forsyth 	char	sval[NSNAME];
3474a4d8c2SCharles.Forsyth 	Ieee	ieee;
3574a4d8c2SCharles.Forsyth 
3674a4d8c2SCharles.Forsyth 	Sym*	sym;
3774a4d8c2SCharles.Forsyth 	char	type;
3874a4d8c2SCharles.Forsyth 	char	reg;
3974a4d8c2SCharles.Forsyth 	char	name;
4074a4d8c2SCharles.Forsyth 	char	etype;
4174a4d8c2SCharles.Forsyth };
4274a4d8c2SCharles.Forsyth #define	A	((Adr*)0)
4374a4d8c2SCharles.Forsyth 
4474a4d8c2SCharles.Forsyth #define	INDEXED	9
4574a4d8c2SCharles.Forsyth struct	Prog
4674a4d8c2SCharles.Forsyth {
4774a4d8c2SCharles.Forsyth 	Adr	from;
4874a4d8c2SCharles.Forsyth 	Adr	to;
4974a4d8c2SCharles.Forsyth 	Prog*	link;
5074a4d8c2SCharles.Forsyth 	long	lineno;
5174a4d8c2SCharles.Forsyth 	char	as;
5274a4d8c2SCharles.Forsyth 	char	reg;
5374a4d8c2SCharles.Forsyth };
5474a4d8c2SCharles.Forsyth #define	P	((Prog*)0)
5574a4d8c2SCharles.Forsyth 
5674a4d8c2SCharles.Forsyth struct	Case
5774a4d8c2SCharles.Forsyth {
5874a4d8c2SCharles.Forsyth 	Case*	link;
5974a4d8c2SCharles.Forsyth 	long	val;
6074a4d8c2SCharles.Forsyth 	long	label;
6174a4d8c2SCharles.Forsyth 	char	def;
6274a4d8c2SCharles.Forsyth };
6374a4d8c2SCharles.Forsyth #define	C	((Case*)0)
6474a4d8c2SCharles.Forsyth 
6574a4d8c2SCharles.Forsyth struct	C1
6674a4d8c2SCharles.Forsyth {
6774a4d8c2SCharles.Forsyth 	long	val;
6874a4d8c2SCharles.Forsyth 	long	label;
6974a4d8c2SCharles.Forsyth };
7074a4d8c2SCharles.Forsyth 
7174a4d8c2SCharles.Forsyth struct	Multab
7274a4d8c2SCharles.Forsyth {
7374a4d8c2SCharles.Forsyth 	long	val;
7474a4d8c2SCharles.Forsyth 	char	code[20];
7574a4d8c2SCharles.Forsyth };
7674a4d8c2SCharles.Forsyth 
7774a4d8c2SCharles.Forsyth struct	Hintab
7874a4d8c2SCharles.Forsyth {
7974a4d8c2SCharles.Forsyth 	ushort	val;
8074a4d8c2SCharles.Forsyth 	char	hint[10];
8174a4d8c2SCharles.Forsyth };
8274a4d8c2SCharles.Forsyth 
8374a4d8c2SCharles.Forsyth struct	Var
8474a4d8c2SCharles.Forsyth {
8574a4d8c2SCharles.Forsyth 	long	offset;
8674a4d8c2SCharles.Forsyth 	Sym*	sym;
8774a4d8c2SCharles.Forsyth 	char	name;
8874a4d8c2SCharles.Forsyth 	char	etype;
8974a4d8c2SCharles.Forsyth };
9074a4d8c2SCharles.Forsyth 
9174a4d8c2SCharles.Forsyth struct	Reg
9274a4d8c2SCharles.Forsyth {
9374a4d8c2SCharles.Forsyth 	long	pc;
9474a4d8c2SCharles.Forsyth 	long	rpo;		/* reverse post ordering */
9574a4d8c2SCharles.Forsyth 
9674a4d8c2SCharles.Forsyth 	Bits	set;
9774a4d8c2SCharles.Forsyth 	Bits	use1;
9874a4d8c2SCharles.Forsyth 	Bits	use2;
9974a4d8c2SCharles.Forsyth 
10074a4d8c2SCharles.Forsyth 	Bits	refbehind;
10174a4d8c2SCharles.Forsyth 	Bits	refahead;
10274a4d8c2SCharles.Forsyth 	Bits	calbehind;
10374a4d8c2SCharles.Forsyth 	Bits	calahead;
10474a4d8c2SCharles.Forsyth 	Bits	regdiff;
10574a4d8c2SCharles.Forsyth 	Bits	act;
10674a4d8c2SCharles.Forsyth 
10774a4d8c2SCharles.Forsyth 	long	regu;
10874a4d8c2SCharles.Forsyth 	long	loop;		/* could be shorter */
10974a4d8c2SCharles.Forsyth 
11074a4d8c2SCharles.Forsyth 	Reg*	log5;
11174a4d8c2SCharles.Forsyth 	long	active;
11274a4d8c2SCharles.Forsyth 
11374a4d8c2SCharles.Forsyth 	Reg*	p1;
11474a4d8c2SCharles.Forsyth 	Reg*	p2;
11574a4d8c2SCharles.Forsyth 	Reg*	p2link;
11674a4d8c2SCharles.Forsyth 	Reg*	s1;
11774a4d8c2SCharles.Forsyth 	Reg*	s2;
11874a4d8c2SCharles.Forsyth 	Reg*	link;
11974a4d8c2SCharles.Forsyth 	Prog*	prog;
12074a4d8c2SCharles.Forsyth };
12174a4d8c2SCharles.Forsyth #define	R	((Reg*)0)
12274a4d8c2SCharles.Forsyth 
12374a4d8c2SCharles.Forsyth #define	NRGN	600
12474a4d8c2SCharles.Forsyth struct	Rgn
12574a4d8c2SCharles.Forsyth {
12674a4d8c2SCharles.Forsyth 	Reg*	enter;
12774a4d8c2SCharles.Forsyth 	short	cost;
12874a4d8c2SCharles.Forsyth 	short	varno;
12974a4d8c2SCharles.Forsyth 	short	regno;
13074a4d8c2SCharles.Forsyth };
13174a4d8c2SCharles.Forsyth 
13274a4d8c2SCharles.Forsyth EXTERN	long	breakpc;
13374a4d8c2SCharles.Forsyth EXTERN	Case*	cases;
13474a4d8c2SCharles.Forsyth EXTERN	Node	constnode;
13574a4d8c2SCharles.Forsyth EXTERN	Node	fconstnode;
13674a4d8c2SCharles.Forsyth EXTERN	long	continpc;
13774a4d8c2SCharles.Forsyth EXTERN	long	curarg;
13874a4d8c2SCharles.Forsyth EXTERN	long	cursafe;
13974a4d8c2SCharles.Forsyth EXTERN	Prog*	firstp;
14074a4d8c2SCharles.Forsyth EXTERN	Prog*	lastp;
14174a4d8c2SCharles.Forsyth EXTERN	long	maxargsafe;
14274a4d8c2SCharles.Forsyth EXTERN	int	mnstring;
14374a4d8c2SCharles.Forsyth EXTERN	Multab	multab[20];
14474a4d8c2SCharles.Forsyth EXTERN	int	retok;
14574a4d8c2SCharles.Forsyth EXTERN	int	hintabsize;
14674a4d8c2SCharles.Forsyth EXTERN	Node*	nodrat;
14774a4d8c2SCharles.Forsyth EXTERN	Node*	nodret;
14874a4d8c2SCharles.Forsyth EXTERN	Node*	nodsafe;
14974a4d8c2SCharles.Forsyth EXTERN	long	nrathole;
15074a4d8c2SCharles.Forsyth EXTERN	long	nstring;
15174a4d8c2SCharles.Forsyth EXTERN	Prog*	p;
15274a4d8c2SCharles.Forsyth EXTERN	long	pc;
15374a4d8c2SCharles.Forsyth EXTERN	Node	regnode;
15474a4d8c2SCharles.Forsyth EXTERN	char	string[NSNAME];
15574a4d8c2SCharles.Forsyth EXTERN	Sym*	symrathole;
15674a4d8c2SCharles.Forsyth EXTERN	Node	znode;
15774a4d8c2SCharles.Forsyth EXTERN	Prog	zprog;
15874a4d8c2SCharles.Forsyth EXTERN	int	reg[NREG+NREG];
15974a4d8c2SCharles.Forsyth EXTERN	long	exregoffset;
16074a4d8c2SCharles.Forsyth EXTERN	long	exfregoffset;
16174a4d8c2SCharles.Forsyth 
16274a4d8c2SCharles.Forsyth #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
16374a4d8c2SCharles.Forsyth #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
16474a4d8c2SCharles.Forsyth #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
16574a4d8c2SCharles.Forsyth #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
16674a4d8c2SCharles.Forsyth 
16774a4d8c2SCharles.Forsyth #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
16874a4d8c2SCharles.Forsyth 
16974a4d8c2SCharles.Forsyth #define	CLOAD	4
17074a4d8c2SCharles.Forsyth #define	CREF	5
17174a4d8c2SCharles.Forsyth #define	CINF	1000
17274a4d8c2SCharles.Forsyth #define	LOOP	3
17374a4d8c2SCharles.Forsyth 
17474a4d8c2SCharles.Forsyth EXTERN	Rgn	region[NRGN];
17574a4d8c2SCharles.Forsyth EXTERN	Rgn*	rgp;
17674a4d8c2SCharles.Forsyth EXTERN	int	nregion;
17774a4d8c2SCharles.Forsyth EXTERN	int	nvar;
17874a4d8c2SCharles.Forsyth 
17974a4d8c2SCharles.Forsyth EXTERN	Bits	externs;
18074a4d8c2SCharles.Forsyth EXTERN	Bits	params;
18174a4d8c2SCharles.Forsyth EXTERN	Bits	consts;
18274a4d8c2SCharles.Forsyth EXTERN	Bits	addrs;
18374a4d8c2SCharles.Forsyth 
18474a4d8c2SCharles.Forsyth EXTERN	long	regbits;
18574a4d8c2SCharles.Forsyth EXTERN	long	exregbits;
18674a4d8c2SCharles.Forsyth 
18774a4d8c2SCharles.Forsyth EXTERN	int	change;
18874a4d8c2SCharles.Forsyth 
18974a4d8c2SCharles.Forsyth EXTERN	Reg*	firstr;
19074a4d8c2SCharles.Forsyth EXTERN	Reg*	lastr;
19174a4d8c2SCharles.Forsyth EXTERN	Reg	zreg;
19274a4d8c2SCharles.Forsyth EXTERN	Reg*	freer;
19374a4d8c2SCharles.Forsyth EXTERN	Var	var[NVAR];
19474a4d8c2SCharles.Forsyth EXTERN	long*	idom;
19574a4d8c2SCharles.Forsyth EXTERN	Reg**	rpo2r;
19674a4d8c2SCharles.Forsyth EXTERN	long	maxnr;
19774a4d8c2SCharles.Forsyth 
19874a4d8c2SCharles.Forsyth extern	char*	anames[];
19974a4d8c2SCharles.Forsyth extern	Hintab	hintab[];
20074a4d8c2SCharles.Forsyth 
20174a4d8c2SCharles.Forsyth /*
20274a4d8c2SCharles.Forsyth  * sgen.c
20374a4d8c2SCharles.Forsyth  */
20474a4d8c2SCharles.Forsyth void	codgen(Node*, Node*);
20574a4d8c2SCharles.Forsyth void	gen(Node*);
20674a4d8c2SCharles.Forsyth void	noretval(int);
20774a4d8c2SCharles.Forsyth void	xcom(Node*);
20874a4d8c2SCharles.Forsyth void	bcomplex(Node*);
20974a4d8c2SCharles.Forsyth void	usedset(Node*, int);
21074a4d8c2SCharles.Forsyth 
21174a4d8c2SCharles.Forsyth /*
21274a4d8c2SCharles.Forsyth  * cgen.c
21374a4d8c2SCharles.Forsyth  */
21474a4d8c2SCharles.Forsyth void	cgen(Node*, Node*);
21574a4d8c2SCharles.Forsyth void	reglcgen(Node*, Node*, Node*);
21674a4d8c2SCharles.Forsyth void	lcgen(Node*, Node*);
21774a4d8c2SCharles.Forsyth void	bcgen(Node*, int);
21874a4d8c2SCharles.Forsyth void	boolgen(Node*, int, Node*);
21974a4d8c2SCharles.Forsyth void	sugen(Node*, Node*, long);
22074a4d8c2SCharles.Forsyth void	layout(Node*, Node*, int, int, Node*);
22174a4d8c2SCharles.Forsyth 
22274a4d8c2SCharles.Forsyth /*
22374a4d8c2SCharles.Forsyth  * txt.c
22474a4d8c2SCharles.Forsyth  */
22574a4d8c2SCharles.Forsyth void	ginit(void);
22674a4d8c2SCharles.Forsyth void	gclean(void);
22774a4d8c2SCharles.Forsyth void	nextpc(void);
22874a4d8c2SCharles.Forsyth void	gargs(Node*, Node*, Node*);
22974a4d8c2SCharles.Forsyth void	garg1(Node*, Node*, Node*, int, Node**);
23074a4d8c2SCharles.Forsyth Node*	nodconst(long);
23174a4d8c2SCharles.Forsyth Node*	nodfconst(double);
23274a4d8c2SCharles.Forsyth void	nodreg(Node*, Node*, int);
23374a4d8c2SCharles.Forsyth void	regret(Node*, Node*);
23474a4d8c2SCharles.Forsyth void	regalloc(Node*, Node*, Node*);
23574a4d8c2SCharles.Forsyth void	regfree(Node*);
23674a4d8c2SCharles.Forsyth void	regialloc(Node*, Node*, Node*);
23774a4d8c2SCharles.Forsyth void	regsalloc(Node*, Node*);
23874a4d8c2SCharles.Forsyth void	regaalloc1(Node*, Node*);
23974a4d8c2SCharles.Forsyth void	regaalloc(Node*, Node*);
24074a4d8c2SCharles.Forsyth void	regind(Node*, Node*);
24174a4d8c2SCharles.Forsyth void	gprep(Node*, Node*);
24274a4d8c2SCharles.Forsyth void	raddr(Node*, Prog*);
24374a4d8c2SCharles.Forsyth void	naddr(Node*, Adr*);
24474a4d8c2SCharles.Forsyth void	gmove(Node*, Node*);
24574a4d8c2SCharles.Forsyth void	gins(int a, Node*, Node*);
24674a4d8c2SCharles.Forsyth void	gopcode(int, Node*, Node*, Node*);
24774a4d8c2SCharles.Forsyth int	samaddr(Node*, Node*);
24874a4d8c2SCharles.Forsyth void	gbranch(int);
24974a4d8c2SCharles.Forsyth void	patch(Prog*, long);
25074a4d8c2SCharles.Forsyth int	sconst(Node*);
25174a4d8c2SCharles.Forsyth int	llconst(Node*);
25274a4d8c2SCharles.Forsyth int	sval(long);
25374a4d8c2SCharles.Forsyth void	gpseudo(int, Sym*, Node*);
25474a4d8c2SCharles.Forsyth 
25574a4d8c2SCharles.Forsyth /*
25674a4d8c2SCharles.Forsyth  * swt.c
25774a4d8c2SCharles.Forsyth  */
258*45a20ab7Sforsyth int	swcmp(void*, void*);
25974a4d8c2SCharles.Forsyth void	doswit(Node*);
26074a4d8c2SCharles.Forsyth void	swit1(C1*, int, long, Node*, Node*);
261d67b7dadSforsyth void	casf(void);
26274a4d8c2SCharles.Forsyth void	bitload(Node*, Node*, Node*, Node*, Node*);
26374a4d8c2SCharles.Forsyth void	bitstore(Node*, Node*, Node*, Node*, Node*);
26474a4d8c2SCharles.Forsyth long	outstring(char*, long);
26574a4d8c2SCharles.Forsyth int	mulcon(Node*, Node*);
26674a4d8c2SCharles.Forsyth Multab*	mulcon0(long);
26774a4d8c2SCharles.Forsyth void	nullwarn(Node*, Node*);
26874a4d8c2SCharles.Forsyth void	sextern(Sym*, Node*, long, long);
26974a4d8c2SCharles.Forsyth void	gextern(Sym*, Node*, long, long);
27074a4d8c2SCharles.Forsyth void	outcode(void);
27174a4d8c2SCharles.Forsyth void	ieeedtod(Ieee*, double);
27274a4d8c2SCharles.Forsyth 
27374a4d8c2SCharles.Forsyth /*
27474a4d8c2SCharles.Forsyth  * list
27574a4d8c2SCharles.Forsyth  */
27674a4d8c2SCharles.Forsyth void	listinit(void);
27774a4d8c2SCharles.Forsyth int	Pconv(Fmt*);
27874a4d8c2SCharles.Forsyth int	Aconv(Fmt*);
27974a4d8c2SCharles.Forsyth int	Dconv(Fmt*);
28074a4d8c2SCharles.Forsyth int	Sconv(Fmt*);
28174a4d8c2SCharles.Forsyth int	Nconv(Fmt*);
28274a4d8c2SCharles.Forsyth int	Bconv(Fmt*);
28374a4d8c2SCharles.Forsyth 
28474a4d8c2SCharles.Forsyth /*
28574a4d8c2SCharles.Forsyth  * reg.c
28674a4d8c2SCharles.Forsyth  */
28774a4d8c2SCharles.Forsyth Reg*	rega(void);
288*45a20ab7Sforsyth int	rcmp(void*, void*);
28974a4d8c2SCharles.Forsyth void	regopt(Prog*);
29074a4d8c2SCharles.Forsyth void	addmove(Reg*, int, int, int);
29174a4d8c2SCharles.Forsyth Bits	mkvar(Adr*, int);
29274a4d8c2SCharles.Forsyth void	prop(Reg*, Bits, Bits);
29374a4d8c2SCharles.Forsyth void	loopit(Reg*, long);
29474a4d8c2SCharles.Forsyth void	synch(Reg*, Bits);
29574a4d8c2SCharles.Forsyth ulong	allreg(ulong, Rgn*);
29674a4d8c2SCharles.Forsyth void	paint1(Reg*, int);
29774a4d8c2SCharles.Forsyth ulong	paint2(Reg*, int);
29874a4d8c2SCharles.Forsyth void	paint3(Reg*, int, long, int);
29974a4d8c2SCharles.Forsyth void	addreg(Adr*, int);
30074a4d8c2SCharles.Forsyth 
30174a4d8c2SCharles.Forsyth /*
30274a4d8c2SCharles.Forsyth  * peep.c
30374a4d8c2SCharles.Forsyth  */
30474a4d8c2SCharles.Forsyth void	peep(void);
30574a4d8c2SCharles.Forsyth void	excise(Reg*);
30674a4d8c2SCharles.Forsyth Reg*	uniqp(Reg*);
30774a4d8c2SCharles.Forsyth Reg*	uniqs(Reg*);
30874a4d8c2SCharles.Forsyth int	regtyp(Adr*);
30974a4d8c2SCharles.Forsyth int	regzer(Adr*);
31074a4d8c2SCharles.Forsyth int	anyvar(Adr*);
31174a4d8c2SCharles.Forsyth int	subprop(Reg*);
31274a4d8c2SCharles.Forsyth int	copyprop(Reg*);
31374a4d8c2SCharles.Forsyth int	copy1(Adr*, Adr*, Reg*, int);
31474a4d8c2SCharles.Forsyth int	copyu(Prog*, Adr*, Adr*);
31574a4d8c2SCharles.Forsyth 
31674a4d8c2SCharles.Forsyth int	copyas(Adr*, Adr*);
31774a4d8c2SCharles.Forsyth int	copyau(Adr*, Adr*);
31874a4d8c2SCharles.Forsyth int	copyau1(Prog*, Adr*);
31974a4d8c2SCharles.Forsyth int	copysub(Adr*, Adr*, Adr*, int);
32074a4d8c2SCharles.Forsyth int	copysub1(Prog*, Adr*, Adr*, int);
32174a4d8c2SCharles.Forsyth 
32274a4d8c2SCharles.Forsyth long	RtoB(int);
32374a4d8c2SCharles.Forsyth long	FtoB(int);
32474a4d8c2SCharles.Forsyth int	BtoR(long);
32574a4d8c2SCharles.Forsyth int	BtoF(long);
32674a4d8c2SCharles.Forsyth 
32774a4d8c2SCharles.Forsyth #pragma	varargck	type	"A"	int
32874a4d8c2SCharles.Forsyth #pragma	varargck	type	"B"	Bits
32974a4d8c2SCharles.Forsyth #pragma	varargck	type	"D"	Adr*
33074a4d8c2SCharles.Forsyth #pragma	varargck	type	"N"	Adr*
33174a4d8c2SCharles.Forsyth #pragma	varargck	type	"P"	Prog*
33274a4d8c2SCharles.Forsyth #pragma	varargck	type	"S"	char*
333