xref: /plan9/sys/src/cmd/vc/gc.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include	"../cc/cc.h"
23e12c5d1SDavid du Colombier #include	"../vc/v.out.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier #define	TINT		TLONG
53e12c5d1SDavid du Colombier #define	TFIELD		TLONG
63e12c5d1SDavid du Colombier #define	SZ_CHAR		1
73e12c5d1SDavid du Colombier #define	SZ_SHORT	2
83e12c5d1SDavid du Colombier #define	SZ_LONG		4
93e12c5d1SDavid du Colombier #define	SZ_VLONG	8
103e12c5d1SDavid du Colombier #define	SZ_IND		4
113e12c5d1SDavid du Colombier #define	SZ_FLOAT	4
123e12c5d1SDavid du Colombier #define	SZ_DOUBLE	8
133e12c5d1SDavid du Colombier #define	SU_ALLIGN	SZ_LONG
143e12c5d1SDavid du Colombier #define	SU_PAD		SZ_LONG
153e12c5d1SDavid du Colombier #define	FNX		100
163e12c5d1SDavid du Colombier #define	INLINE		(5*SZ_LONG)
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
193e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
203e12c5d1SDavid du Colombier typedef	struct	Case	Case;
213e12c5d1SDavid du Colombier typedef	struct	C1	C1;
22*219b2ee8SDavid du Colombier typedef	struct	Multab	Multab;
23*219b2ee8SDavid du Colombier typedef	struct	Hintab	Hintab;
243e12c5d1SDavid du Colombier typedef	struct	Bits	Bits;
253e12c5d1SDavid du Colombier typedef	struct	Var	Var;
263e12c5d1SDavid du Colombier typedef	struct	Reg	Reg;
273e12c5d1SDavid du Colombier typedef	struct	Rgn	Rgn;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier struct	Adr
313e12c5d1SDavid du Colombier {
323e12c5d1SDavid du Colombier 	union
333e12c5d1SDavid du Colombier 	{
343e12c5d1SDavid du Colombier 		long	offset;
353e12c5d1SDavid du Colombier 		double	dval;
363e12c5d1SDavid du Colombier 		char	sval[NSNAME];
373e12c5d1SDavid du Colombier 		Ieee	ieee;
383e12c5d1SDavid du Colombier 	};
393e12c5d1SDavid du Colombier 	Sym*	sym;
403e12c5d1SDavid du Colombier 	char	type;
413e12c5d1SDavid du Colombier 	char	reg;
423e12c5d1SDavid du Colombier 	char	name;
433e12c5d1SDavid du Colombier 	char	etype;
443e12c5d1SDavid du Colombier };
453e12c5d1SDavid du Colombier #define	A	((Adr*)0)
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier #define	INDEXED	9
483e12c5d1SDavid du Colombier struct	Prog
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 	Adr	from;
513e12c5d1SDavid du Colombier 	Adr	to;
523e12c5d1SDavid du Colombier 	Prog*	link;
533e12c5d1SDavid du Colombier 	long	lineno;
543e12c5d1SDavid du Colombier 	char	as;
553e12c5d1SDavid du Colombier 	char	reg;
563e12c5d1SDavid du Colombier };
573e12c5d1SDavid du Colombier #define	P	((Prog*)0)
583e12c5d1SDavid du Colombier 
593e12c5d1SDavid du Colombier struct	Case
603e12c5d1SDavid du Colombier {
613e12c5d1SDavid du Colombier 	Case*	link;
623e12c5d1SDavid du Colombier 	long	val;
633e12c5d1SDavid du Colombier 	long	label;
643e12c5d1SDavid du Colombier 	char	def;
653e12c5d1SDavid du Colombier };
663e12c5d1SDavid du Colombier #define	C	((Case*)0)
673e12c5d1SDavid du Colombier 
683e12c5d1SDavid du Colombier struct	C1
693e12c5d1SDavid du Colombier {
703e12c5d1SDavid du Colombier 	long	val;
713e12c5d1SDavid du Colombier 	long	label;
723e12c5d1SDavid du Colombier };
733e12c5d1SDavid du Colombier 
74*219b2ee8SDavid du Colombier struct	Multab
75*219b2ee8SDavid du Colombier {
76*219b2ee8SDavid du Colombier 	long	val;
77*219b2ee8SDavid du Colombier 	char	code[20];
78*219b2ee8SDavid du Colombier };
79*219b2ee8SDavid du Colombier 
80*219b2ee8SDavid du Colombier struct	Hintab
81*219b2ee8SDavid du Colombier {
82*219b2ee8SDavid du Colombier 	ushort	val;
83*219b2ee8SDavid du Colombier 	char	hint[10];
84*219b2ee8SDavid du Colombier };
85*219b2ee8SDavid du Colombier 
86*219b2ee8SDavid du Colombier #define	BITS	6
873e12c5d1SDavid du Colombier #define	NVAR	(BITS*sizeof(ulong)*8)
883e12c5d1SDavid du Colombier struct	Bits
893e12c5d1SDavid du Colombier {
903e12c5d1SDavid du Colombier 	ulong	b[BITS];
913e12c5d1SDavid du Colombier };
923e12c5d1SDavid du Colombier 
933e12c5d1SDavid du Colombier struct	Var
943e12c5d1SDavid du Colombier {
953e12c5d1SDavid du Colombier 	long	offset;
963e12c5d1SDavid du Colombier 	Sym*	sym;
973e12c5d1SDavid du Colombier 	char	name;
983e12c5d1SDavid du Colombier 	char	etype;
993e12c5d1SDavid du Colombier };
1003e12c5d1SDavid du Colombier 
1013e12c5d1SDavid du Colombier struct	Reg
1023e12c5d1SDavid du Colombier {
1033e12c5d1SDavid du Colombier 	long	pc;
1043e12c5d1SDavid du Colombier 
1053e12c5d1SDavid du Colombier 	Bits	set;
1063e12c5d1SDavid du Colombier 	Bits	use1;
1073e12c5d1SDavid du Colombier 	Bits	use2;
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 	Bits	refbehind;
1103e12c5d1SDavid du Colombier 	Bits	refahead;
1113e12c5d1SDavid du Colombier 	Bits	calbehind;
1123e12c5d1SDavid du Colombier 	Bits	calahead;
1133e12c5d1SDavid du Colombier 	Bits	regdiff;
1143e12c5d1SDavid du Colombier 	Bits	act;
1153e12c5d1SDavid du Colombier 
1163e12c5d1SDavid du Colombier 	long	regu;
1173e12c5d1SDavid du Colombier 	long	loop;		/* could be shorter */
1183e12c5d1SDavid du Colombier 
1193e12c5d1SDavid du Colombier 	union	{
1203e12c5d1SDavid du Colombier 		Reg*	log5;
1213e12c5d1SDavid du Colombier 		int	active;
1223e12c5d1SDavid du Colombier 	};
1233e12c5d1SDavid du Colombier 	Reg*	p1;
1243e12c5d1SDavid du Colombier 	Reg*	p2;
1253e12c5d1SDavid du Colombier 	Reg*	p2link;
1263e12c5d1SDavid du Colombier 	Reg*	s1;
1273e12c5d1SDavid du Colombier 	Reg*	s2;
1283e12c5d1SDavid du Colombier 	Reg*	link;
1293e12c5d1SDavid du Colombier 	Prog*	prog;
1303e12c5d1SDavid du Colombier };
1313e12c5d1SDavid du Colombier #define	R	((Reg*)0)
1323e12c5d1SDavid du Colombier 
1333e12c5d1SDavid du Colombier #define	NRGN	600
1343e12c5d1SDavid du Colombier struct	Rgn
1353e12c5d1SDavid du Colombier {
1363e12c5d1SDavid du Colombier 	Reg*	enter;
1373e12c5d1SDavid du Colombier 	short	cost;
1383e12c5d1SDavid du Colombier 	short	varno;
1393e12c5d1SDavid du Colombier 	short	regno;
1403e12c5d1SDavid du Colombier };
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier long	breakpc;
1433e12c5d1SDavid du Colombier Case*	cases;
1443e12c5d1SDavid du Colombier Node	constnode;
1453e12c5d1SDavid du Colombier Node	fconstnode;
1463e12c5d1SDavid du Colombier long	continpc;
1473e12c5d1SDavid du Colombier long	curarg;
1483e12c5d1SDavid du Colombier long	cursafe;
1493e12c5d1SDavid du Colombier Prog*	firstp;
1503e12c5d1SDavid du Colombier Prog*	lastp;
1513e12c5d1SDavid du Colombier long	maxargsafe;
1523e12c5d1SDavid du Colombier int	mnstring;
153*219b2ee8SDavid du Colombier Multab	multab[20];
1543e12c5d1SDavid du Colombier int	retok;
155*219b2ee8SDavid du Colombier int	hintabsize;
1563e12c5d1SDavid du Colombier Node*	nodrat;
1573e12c5d1SDavid du Colombier Node*	nodret;
1583e12c5d1SDavid du Colombier Node*	nodsafe;
1593e12c5d1SDavid du Colombier long	nrathole;
1603e12c5d1SDavid du Colombier long	nstring;
1613e12c5d1SDavid du Colombier Prog*	p;
1623e12c5d1SDavid du Colombier long	pc;
1633e12c5d1SDavid du Colombier Node	regnode;
1643e12c5d1SDavid du Colombier char	string[NSNAME];
1653e12c5d1SDavid du Colombier Sym*	symrathole;
1663e12c5d1SDavid du Colombier Node	znode;
1673e12c5d1SDavid du Colombier Prog	zprog;
1683e12c5d1SDavid du Colombier char	reg[NREG+NREG];
1693e12c5d1SDavid du Colombier long	exregoffset;
1703e12c5d1SDavid du Colombier long	exfregoffset;
1713e12c5d1SDavid du Colombier 
1723e12c5d1SDavid du Colombier #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
1733e12c5d1SDavid du Colombier #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
1743e12c5d1SDavid du Colombier #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
1753e12c5d1SDavid du Colombier #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
1763e12c5d1SDavid du Colombier 
1773e12c5d1SDavid du Colombier #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
1783e12c5d1SDavid du Colombier 
179*219b2ee8SDavid du Colombier #define	CLOAD	4
1803e12c5d1SDavid du Colombier #define	CREF	5
1813e12c5d1SDavid du Colombier #define	CINF	1000
1823e12c5d1SDavid du Colombier #define	LOOP	3
1833e12c5d1SDavid du Colombier 
1843e12c5d1SDavid du Colombier Rgn	region[NRGN];
1853e12c5d1SDavid du Colombier Rgn*	rgp;
1863e12c5d1SDavid du Colombier int	nregion;
1873e12c5d1SDavid du Colombier int	nvar;
1883e12c5d1SDavid du Colombier 
1893e12c5d1SDavid du Colombier Bits	externs;
1903e12c5d1SDavid du Colombier Bits	params;
1913e12c5d1SDavid du Colombier Bits	consts;
1923e12c5d1SDavid du Colombier Bits	addrs;
1933e12c5d1SDavid du Colombier Bits	zbits;
1943e12c5d1SDavid du Colombier 
1953e12c5d1SDavid du Colombier long	regbits;
1963e12c5d1SDavid du Colombier long	exregbits;
1973e12c5d1SDavid du Colombier 
1983e12c5d1SDavid du Colombier int	change;
1993e12c5d1SDavid du Colombier 
2003e12c5d1SDavid du Colombier Reg*	firstr;
2013e12c5d1SDavid du Colombier Reg*	lastr;
2023e12c5d1SDavid du Colombier Reg	zreg;
2033e12c5d1SDavid du Colombier Reg*	freer;
2043e12c5d1SDavid du Colombier Var	var[NVAR];
2053e12c5d1SDavid du Colombier 
2063e12c5d1SDavid du Colombier extern	char*	anames[];
207*219b2ee8SDavid du Colombier extern	Hintab	hintab[];
2083e12c5d1SDavid du Colombier 
2093e12c5d1SDavid du Colombier /*
2103e12c5d1SDavid du Colombier  * sgen.c
2113e12c5d1SDavid du Colombier  */
2123e12c5d1SDavid du Colombier void	codgen(Node*, Node*);
2133e12c5d1SDavid du Colombier void	gen(Node*);
2143e12c5d1SDavid du Colombier void	noretval(int);
2153e12c5d1SDavid du Colombier void	xcom(Node*);
2163e12c5d1SDavid du Colombier void	bcomplex(Node*);
2173e12c5d1SDavid du Colombier 
2183e12c5d1SDavid du Colombier /*
2193e12c5d1SDavid du Colombier  * cgen.c
2203e12c5d1SDavid du Colombier  */
2213e12c5d1SDavid du Colombier void	cgen(Node*, Node*);
2223e12c5d1SDavid du Colombier void	reglcgen(Node*, Node*, Node*);
2233e12c5d1SDavid du Colombier void	lcgen(Node*, Node*);
2243e12c5d1SDavid du Colombier void	bcgen(Node*, int);
2253e12c5d1SDavid du Colombier void	boolgen(Node*, int, Node*);
2263e12c5d1SDavid du Colombier void	sugen(Node*, Node*, long);
2273e12c5d1SDavid du Colombier void	layout(Node*, Node*, int, int, Node*);
2283e12c5d1SDavid du Colombier 
2293e12c5d1SDavid du Colombier /*
2303e12c5d1SDavid du Colombier  * txt.c
2313e12c5d1SDavid du Colombier  */
2323e12c5d1SDavid du Colombier void	ginit(void);
2333e12c5d1SDavid du Colombier void	gclean(void);
2343e12c5d1SDavid du Colombier void	nextpc(void);
2353e12c5d1SDavid du Colombier void	gargs(Node*, Node*, Node*);
2363e12c5d1SDavid du Colombier void	garg1(Node*, Node*, Node*, int, Node**);
2373e12c5d1SDavid du Colombier Node*	nodconst(long);
238*219b2ee8SDavid du Colombier Node*	nod32const(vlong);
239bd389b36SDavid du Colombier Node*	nodfconst(double);
2403e12c5d1SDavid du Colombier void	nodreg(Node*, Node*, int);
2413e12c5d1SDavid du Colombier void	regret(Node*, Node*);
2423e12c5d1SDavid du Colombier void	regalloc(Node*, Node*, Node*);
2433e12c5d1SDavid du Colombier void	regfree(Node*);
2443e12c5d1SDavid du Colombier void	regialloc(Node*, Node*, Node*);
2453e12c5d1SDavid du Colombier void	regsalloc(Node*, Node*);
2463e12c5d1SDavid du Colombier void	regaalloc1(Node*, Node*);
2473e12c5d1SDavid du Colombier void	regaalloc(Node*, Node*);
2483e12c5d1SDavid du Colombier void	regind(Node*, Node*);
2493e12c5d1SDavid du Colombier void	gprep(Node*, Node*);
2503e12c5d1SDavid du Colombier void	raddr(Node*, Prog*);
2513e12c5d1SDavid du Colombier void	naddr(Node*, Adr*);
2523e12c5d1SDavid du Colombier void	gmove(Node*, Node*);
2533e12c5d1SDavid du Colombier void	gins(int a, Node*, Node*);
2543e12c5d1SDavid du Colombier void	gopcode(int, Node*, Node*, Node*);
2553e12c5d1SDavid du Colombier int	samaddr(Node*, Node*);
2563e12c5d1SDavid du Colombier void	gbranch(int);
2573e12c5d1SDavid du Colombier void	patch(Prog*, long);
2583e12c5d1SDavid du Colombier int	sconst(Node*);
2593e12c5d1SDavid du Colombier int	sval(long);
2603e12c5d1SDavid du Colombier void	gpseudo(int, Sym*, Node*);
2613e12c5d1SDavid du Colombier 
2623e12c5d1SDavid du Colombier /*
2633e12c5d1SDavid du Colombier  * swt.c
2643e12c5d1SDavid du Colombier  */
2653e12c5d1SDavid du Colombier int	swcmp(void*, void*);
2663e12c5d1SDavid du Colombier void	doswit(Node*);
2673e12c5d1SDavid du Colombier void	swit1(C1*, int, long, Node*, Node*);
2683e12c5d1SDavid du Colombier void	cas(void);
2693e12c5d1SDavid du Colombier void	bitload(Node*, Node*, Node*, Node*, Node*);
2703e12c5d1SDavid du Colombier void	bitstore(Node*, Node*, Node*, Node*, Node*);
2713e12c5d1SDavid du Colombier long	outstring(char*, long);
2723e12c5d1SDavid du Colombier int	vlog(Node*);
273*219b2ee8SDavid du Colombier int	mulcon(Node*, Node*);
274*219b2ee8SDavid du Colombier Multab*	mulcon0(long);
2753e12c5d1SDavid du Colombier void	nullwarn(Node*, Node*);
2763e12c5d1SDavid du Colombier void	sextern(Sym*, Node*, long, long);
2773e12c5d1SDavid du Colombier void	gextern(Sym*, Node*, long, long);
2783e12c5d1SDavid du Colombier void	outcode(void);
2793e12c5d1SDavid du Colombier void	ieeedtod(Ieee*, double);
2803e12c5d1SDavid du Colombier 
2813e12c5d1SDavid du Colombier /*
2823e12c5d1SDavid du Colombier  * list
2833e12c5d1SDavid du Colombier  */
2843e12c5d1SDavid du Colombier void	listinit(void);
285bd389b36SDavid du Colombier int	Pconv(void*, Fconv*);
286bd389b36SDavid du Colombier int	Aconv(void*, Fconv*);
287bd389b36SDavid du Colombier int	Dconv(void*, Fconv*);
288bd389b36SDavid du Colombier int	Sconv(void*, Fconv*);
289bd389b36SDavid du Colombier int	Nconv(void*, Fconv*);
290bd389b36SDavid du Colombier int	Bconv(void*, Fconv*);
2913e12c5d1SDavid du Colombier 
2923e12c5d1SDavid du Colombier /*
2933e12c5d1SDavid du Colombier  * reg.c
2943e12c5d1SDavid du Colombier  */
2953e12c5d1SDavid du Colombier Reg*	rega(void);
2963e12c5d1SDavid du Colombier int	rcmp(void*, void*);
2973e12c5d1SDavid du Colombier void	regopt(Prog*);
2983e12c5d1SDavid du Colombier void	addmove(Reg*, int, int, int);
2993e12c5d1SDavid du Colombier Bits	mkvar(Adr*, int);
3003e12c5d1SDavid du Colombier void	prop(Reg*, Bits, Bits);
3013e12c5d1SDavid du Colombier int	loopit(Reg*);
3023e12c5d1SDavid du Colombier void	synch(Reg*, Bits);
3033e12c5d1SDavid du Colombier ulong	allreg(ulong, Rgn*);
3043e12c5d1SDavid du Colombier void	paint1(Reg*, int);
3053e12c5d1SDavid du Colombier ulong	paint2(Reg*, int);
3063e12c5d1SDavid du Colombier void	paint3(Reg*, int, long, int);
3073e12c5d1SDavid du Colombier void	addreg(Adr*, int);
3083e12c5d1SDavid du Colombier 
3093e12c5d1SDavid du Colombier /*
3103e12c5d1SDavid du Colombier  * peep.c
3113e12c5d1SDavid du Colombier  */
3123e12c5d1SDavid du Colombier void	peep(void);
3133e12c5d1SDavid du Colombier void	excise(Reg*);
3143e12c5d1SDavid du Colombier Reg*	uniqp(Reg*);
3153e12c5d1SDavid du Colombier Reg*	uniqs(Reg*);
3163e12c5d1SDavid du Colombier int	regtyp(Adr*);
3173e12c5d1SDavid du Colombier int	regzer(Adr*);
3183e12c5d1SDavid du Colombier int	anyvar(Adr*);
3193e12c5d1SDavid du Colombier int	subprop(Reg*);
3203e12c5d1SDavid du Colombier int	copyprop(Reg*);
3213e12c5d1SDavid du Colombier int	copy1(Adr*, Adr*, Reg*, int);
3223e12c5d1SDavid du Colombier int	copyu(Prog*, Adr*, Adr*);
3233e12c5d1SDavid du Colombier 
3243e12c5d1SDavid du Colombier int	copyas(Adr*, Adr*);
3253e12c5d1SDavid du Colombier int	copyau(Adr*, Adr*);
3263e12c5d1SDavid du Colombier int	copyau1(Prog*, Adr*);
3273e12c5d1SDavid du Colombier int	copysub(Adr*, Adr*, Adr*, int);
3283e12c5d1SDavid du Colombier int	copysub1(Prog*, Adr*, Adr*, int);
3293e12c5d1SDavid du Colombier 
3303e12c5d1SDavid du Colombier long	RtoB(int);
3313e12c5d1SDavid du Colombier long	FtoB(int);
3323e12c5d1SDavid du Colombier int	BtoR(long);
3333e12c5d1SDavid du Colombier int	BtoF(long);
3343e12c5d1SDavid du Colombier 
3353e12c5d1SDavid du Colombier /*
3363e12c5d1SDavid du Colombier  * bits.c
3373e12c5d1SDavid du Colombier  */
3383e12c5d1SDavid du Colombier Bits	bor(Bits, Bits);
3393e12c5d1SDavid du Colombier Bits	band(Bits, Bits);
3403e12c5d1SDavid du Colombier Bits	bnot(Bits);
3413e12c5d1SDavid du Colombier int	bany(Bits*);
3423e12c5d1SDavid du Colombier int	bnum(Bits);
3433e12c5d1SDavid du Colombier Bits	blsh(unsigned);
3443e12c5d1SDavid du Colombier int	beq(Bits, Bits);
345