xref: /plan9/sys/src/cmd/qc/gc.h (revision 178702b161d3fe3e021aa6cb2f305be898e56ca0)
17dd7cddfSDavid du Colombier #include	"../cc/cc.h"
27dd7cddfSDavid du Colombier #include	"../qc/q.out.h"
37dd7cddfSDavid du Colombier 
47dd7cddfSDavid du Colombier /*
57dd7cddfSDavid du Colombier  * qc/power
67dd7cddfSDavid du Colombier  * powerpc
77dd7cddfSDavid du Colombier  */
87dd7cddfSDavid du Colombier #define	SZ_CHAR		1
97dd7cddfSDavid du Colombier #define	SZ_SHORT	2
107dd7cddfSDavid du Colombier #define	SZ_INT		4
117dd7cddfSDavid du Colombier #define	SZ_LONG		4
127dd7cddfSDavid du Colombier #define	SZ_IND		4
137dd7cddfSDavid du Colombier #define	SZ_FLOAT	4
147dd7cddfSDavid du Colombier #define	SZ_VLONG	8
157dd7cddfSDavid du Colombier #define	SZ_DOUBLE	8
167dd7cddfSDavid du Colombier #define	FNX		100
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier typedef	struct	Adr	Adr;
197dd7cddfSDavid du Colombier typedef	struct	Prog	Prog;
207dd7cddfSDavid du Colombier typedef	struct	Case	Case;
217dd7cddfSDavid du Colombier typedef	struct	C1	C1;
227dd7cddfSDavid du Colombier typedef	struct	Multab	Multab;
237dd7cddfSDavid du Colombier typedef	struct	Hintab	Hintab;
247dd7cddfSDavid du Colombier typedef	struct	Var	Var;
257dd7cddfSDavid du Colombier typedef	struct	Reg	Reg;
267dd7cddfSDavid du Colombier typedef	struct	Rgn	Rgn;
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier struct	Adr
297dd7cddfSDavid du Colombier {
307dd7cddfSDavid du Colombier 	union
317dd7cddfSDavid du Colombier 	{
327dd7cddfSDavid du Colombier 		long	offset;
337dd7cddfSDavid du Colombier 		double	dval;
347dd7cddfSDavid du Colombier 		char	sval[NSNAME];
357dd7cddfSDavid du Colombier 	};
367dd7cddfSDavid du Colombier 	Sym*	sym;
377dd7cddfSDavid du Colombier 	char	type;
387dd7cddfSDavid du Colombier 	char	reg;
397dd7cddfSDavid du Colombier 	char	name;
407dd7cddfSDavid du Colombier 	char	etype;
417dd7cddfSDavid du Colombier };
427dd7cddfSDavid du Colombier #define	A	((Adr*)0)
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier #define	INDEXED	9
457dd7cddfSDavid du Colombier struct	Prog
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier 	Adr	from;
487dd7cddfSDavid du Colombier 	Adr	from3;		/* third argument for fmadd, fmsub, ... */
497dd7cddfSDavid du Colombier 	Adr	to;
507dd7cddfSDavid du Colombier 	Prog*	link;
517dd7cddfSDavid du Colombier 	long	lineno;
527dd7cddfSDavid du Colombier 	short	as;
537dd7cddfSDavid du Colombier 	char	reg;
547dd7cddfSDavid du Colombier };
557dd7cddfSDavid du Colombier #define	P	((Prog*)0)
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier struct	Case
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier 	Case*	link;
60*3a276d32SDavid du Colombier 	vlong	val;
617dd7cddfSDavid du Colombier 	long	label;
627dd7cddfSDavid du Colombier 	char	def;
634ac975e2SDavid du Colombier 	char isv;
647dd7cddfSDavid du Colombier };
657dd7cddfSDavid du Colombier #define	C	((Case*)0)
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier struct	C1
687dd7cddfSDavid du Colombier {
69*3a276d32SDavid du Colombier 	vlong	val;
707dd7cddfSDavid du Colombier 	long	label;
717dd7cddfSDavid du Colombier };
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier struct	Multab
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier 	long	val;
767dd7cddfSDavid du Colombier 	char	code[20];
777dd7cddfSDavid du Colombier };
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier struct	Hintab
807dd7cddfSDavid du Colombier {
817dd7cddfSDavid du Colombier 	ushort	val;
827dd7cddfSDavid du Colombier 	char	hint[10];
837dd7cddfSDavid du Colombier };
847dd7cddfSDavid du Colombier 
857dd7cddfSDavid du Colombier struct	Var
867dd7cddfSDavid du Colombier {
877dd7cddfSDavid du Colombier 	long	offset;
887dd7cddfSDavid du Colombier 	Sym*	sym;
897dd7cddfSDavid du Colombier 	char	name;
907dd7cddfSDavid du Colombier 	char	etype;
917dd7cddfSDavid du Colombier };
927dd7cddfSDavid du Colombier 
937dd7cddfSDavid du Colombier struct	Reg
947dd7cddfSDavid du Colombier {
957dd7cddfSDavid du Colombier 	long	pc;
967dd7cddfSDavid du Colombier 	long	rpo;		/* reverse post ordering */
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier 	Bits	set;
997dd7cddfSDavid du Colombier 	Bits	use1;
1007dd7cddfSDavid du Colombier 	Bits	use2;
1017dd7cddfSDavid du Colombier 
1027dd7cddfSDavid du Colombier 	Bits	refbehind;
1037dd7cddfSDavid du Colombier 	Bits	refahead;
1047dd7cddfSDavid du Colombier 	Bits	calbehind;
1057dd7cddfSDavid du Colombier 	Bits	calahead;
1067dd7cddfSDavid du Colombier 	Bits	regdiff;
1077dd7cddfSDavid du Colombier 	Bits	act;
1087dd7cddfSDavid du Colombier 
1097dd7cddfSDavid du Colombier 	long	regu;
1107dd7cddfSDavid du Colombier 	long	loop;		/* could be shorter */
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier 	union
1137dd7cddfSDavid du Colombier 	{
1147dd7cddfSDavid du Colombier 		Reg*	log5;
1157dd7cddfSDavid du Colombier 		long	active;
1167dd7cddfSDavid du Colombier 	};
1177dd7cddfSDavid du Colombier 	Reg*	p1;
1187dd7cddfSDavid du Colombier 	Reg*	p2;
1197dd7cddfSDavid du Colombier 	Reg*	p2link;
1207dd7cddfSDavid du Colombier 	Reg*	s1;
1217dd7cddfSDavid du Colombier 	Reg*	s2;
1227dd7cddfSDavid du Colombier 	Reg*	link;
1237dd7cddfSDavid du Colombier 	Prog*	prog;
1247dd7cddfSDavid du Colombier };
1257dd7cddfSDavid du Colombier #define	R	((Reg*)0)
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier #define	NRGN	600
1287dd7cddfSDavid du Colombier struct	Rgn
1297dd7cddfSDavid du Colombier {
1307dd7cddfSDavid du Colombier 	Reg*	enter;
1317dd7cddfSDavid du Colombier 	short	cost;
1327dd7cddfSDavid du Colombier 	short	varno;
1337dd7cddfSDavid du Colombier 	short	regno;
1347dd7cddfSDavid du Colombier };
1357dd7cddfSDavid du Colombier 
13659cc4ca5SDavid du Colombier EXTERN	long	breakpc;
1374ac975e2SDavid du Colombier EXTERN	long	nbreak;
13859cc4ca5SDavid du Colombier EXTERN	Case*	cases;
13959cc4ca5SDavid du Colombier EXTERN	Node	constnode;
14059cc4ca5SDavid du Colombier EXTERN	Node	fconstnode;
14159cc4ca5SDavid du Colombier EXTERN	long	continpc;
14259cc4ca5SDavid du Colombier EXTERN	long	curarg;
14359cc4ca5SDavid du Colombier EXTERN	long	cursafe;
14459cc4ca5SDavid du Colombier EXTERN	Prog*	firstp;
14559cc4ca5SDavid du Colombier EXTERN	Prog*	lastp;
14659cc4ca5SDavid du Colombier EXTERN	int	hintabsize;
14759cc4ca5SDavid du Colombier EXTERN	long	maxargsafe;
14859cc4ca5SDavid du Colombier EXTERN	Multab	multab[20];
14959cc4ca5SDavid du Colombier EXTERN	int	mnstring;
15059cc4ca5SDavid du Colombier EXTERN	Node*	nodrat;
15159cc4ca5SDavid du Colombier EXTERN	Node*	nodret;
15259cc4ca5SDavid du Colombier EXTERN	Node*	nodsafe;
1536891d857SDavid du Colombier EXTERN	Node*	nodretv;
15459cc4ca5SDavid du Colombier EXTERN	long	nrathole;
15559cc4ca5SDavid du Colombier EXTERN	long	nstring;
15659cc4ca5SDavid du Colombier EXTERN	Prog*	p;
15759cc4ca5SDavid du Colombier EXTERN	long	pc;
15859cc4ca5SDavid du Colombier EXTERN	Node	regnode;
15959cc4ca5SDavid du Colombier EXTERN	char	string[NSNAME];
16059cc4ca5SDavid du Colombier EXTERN	Sym*	symrathole;
16159cc4ca5SDavid du Colombier EXTERN	Node	znode;
16259cc4ca5SDavid du Colombier EXTERN	Prog	zprog;
163375daca8SDavid du Colombier EXTERN	int	reg[NREG+NREG];
16459cc4ca5SDavid du Colombier EXTERN	long	exregoffset;
16559cc4ca5SDavid du Colombier EXTERN	long	exfregoffset;
1667dd7cddfSDavid du Colombier 
1677dd7cddfSDavid du Colombier #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
1687dd7cddfSDavid du Colombier #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
1697dd7cddfSDavid du Colombier #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
1707dd7cddfSDavid du Colombier #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
1717dd7cddfSDavid du Colombier 
1727dd7cddfSDavid du Colombier #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
1737dd7cddfSDavid du Colombier 
1747dd7cddfSDavid du Colombier #define	CLOAD	5
1757dd7cddfSDavid du Colombier #define	CREF	5
1767dd7cddfSDavid du Colombier #define	CINF	1000
1777dd7cddfSDavid du Colombier #define	LOOP	3
1787dd7cddfSDavid du Colombier 
17959cc4ca5SDavid du Colombier EXTERN	Rgn	region[NRGN];
18059cc4ca5SDavid du Colombier EXTERN	Rgn*	rgp;
18159cc4ca5SDavid du Colombier EXTERN	int	nregion;
18259cc4ca5SDavid du Colombier EXTERN	int	nvar;
1837dd7cddfSDavid du Colombier 
18459cc4ca5SDavid du Colombier EXTERN	Bits	externs;
18559cc4ca5SDavid du Colombier EXTERN	Bits	params;
18659cc4ca5SDavid du Colombier EXTERN	Bits	consts;
18759cc4ca5SDavid du Colombier EXTERN	Bits	addrs;
1887dd7cddfSDavid du Colombier 
18959cc4ca5SDavid du Colombier EXTERN	long	regbits;
19059cc4ca5SDavid du Colombier EXTERN	long	exregbits;
1917dd7cddfSDavid du Colombier 
19259cc4ca5SDavid du Colombier EXTERN	int	change;
193375daca8SDavid du Colombier EXTERN	int	suppress;
1947dd7cddfSDavid du Colombier 
19559cc4ca5SDavid du Colombier EXTERN	Reg*	firstr;
19659cc4ca5SDavid du Colombier EXTERN	Reg*	lastr;
19759cc4ca5SDavid du Colombier EXTERN	Reg	zreg;
19859cc4ca5SDavid du Colombier EXTERN	Reg*	freer;
19959cc4ca5SDavid du Colombier EXTERN	Var	var[NVAR];
20059cc4ca5SDavid du Colombier EXTERN	long*	idom;
20159cc4ca5SDavid du Colombier EXTERN	Reg**	rpo2r;
20259cc4ca5SDavid du Colombier EXTERN	long	maxnr;
2037dd7cddfSDavid du Colombier 
204375daca8SDavid du Colombier #define	R0ISZERO	(debug['0']==0)
205375daca8SDavid du Colombier 
2067dd7cddfSDavid du Colombier extern	char*	anames[];
2077dd7cddfSDavid du Colombier extern	Hintab	hintab[];
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier /*
2107dd7cddfSDavid du Colombier  * sgen.c
2117dd7cddfSDavid du Colombier  */
2127dd7cddfSDavid du Colombier void	codgen(Node*, Node*);
2137dd7cddfSDavid du Colombier void	gen(Node*);
2147dd7cddfSDavid du Colombier void	usedset(Node*, int);
2157dd7cddfSDavid du Colombier void	noretval(int);
2167dd7cddfSDavid du Colombier void	xcom(Node*);
217375daca8SDavid du Colombier int	bcomplex(Node*, Node*);
2187dd7cddfSDavid du Colombier 
2197dd7cddfSDavid du Colombier /*
2207dd7cddfSDavid du Colombier  * cgen.c
2217dd7cddfSDavid du Colombier  */
2227dd7cddfSDavid du Colombier void	cgen(Node*, Node*);
2237dd7cddfSDavid du Colombier void	reglcgen(Node*, Node*, Node*);
2247dd7cddfSDavid du Colombier void	lcgen(Node*, Node*);
2257dd7cddfSDavid du Colombier void	bcgen(Node*, int);
2267dd7cddfSDavid du Colombier void	boolgen(Node*, int, Node*);
2277dd7cddfSDavid du Colombier void	sugen(Node*, Node*, long);
2287dd7cddfSDavid du Colombier void	layout(Node*, Node*, int, int, Node*);
2297dd7cddfSDavid du Colombier 
2307dd7cddfSDavid du Colombier /*
2317dd7cddfSDavid du Colombier  * txt.c
2327dd7cddfSDavid du Colombier  */
2337dd7cddfSDavid du Colombier void	ginit(void);
2347dd7cddfSDavid du Colombier void	gclean(void);
2357dd7cddfSDavid du Colombier void	nextpc(void);
2367dd7cddfSDavid du Colombier void	gargs(Node*, Node*, Node*);
2377dd7cddfSDavid du Colombier void	garg1(Node*, Node*, Node*, int, Node**);
2387dd7cddfSDavid du Colombier Node*	nodconst(long);
2397dd7cddfSDavid du Colombier Node*	nod32const(vlong);
2407dd7cddfSDavid du Colombier Node*	nodfconst(double);
2417dd7cddfSDavid du Colombier void	nodreg(Node*, Node*, int);
2427dd7cddfSDavid du Colombier void	regret(Node*, Node*);
2437dd7cddfSDavid du Colombier void	regalloc(Node*, Node*, Node*);
2447dd7cddfSDavid du Colombier void	regfree(Node*);
2457dd7cddfSDavid du Colombier void	regialloc(Node*, Node*, Node*);
2467dd7cddfSDavid du Colombier void	regsalloc(Node*, Node*);
2477dd7cddfSDavid du Colombier void	regaalloc1(Node*, Node*);
2487dd7cddfSDavid du Colombier void	regaalloc(Node*, Node*);
2497dd7cddfSDavid du Colombier void	regind(Node*, Node*);
2507dd7cddfSDavid du Colombier void	gprep(Node*, Node*);
2517dd7cddfSDavid du Colombier void	raddr(Node*, Prog*);
2527dd7cddfSDavid du Colombier void	naddr(Node*, Adr*);
2536891d857SDavid du Colombier void	gloadhi(Node*, Node*, int);
2546891d857SDavid du Colombier void	gloadlo(Node*, Node*, int);
2557dd7cddfSDavid du Colombier void	gmove(Node*, Node*);
2567dd7cddfSDavid du Colombier void	gins(int a, Node*, Node*);
2576891d857SDavid du Colombier void	gins3(int a, Node*, Node*, Node*);
2587dd7cddfSDavid du Colombier void	gopcode(int, Node*, Node*, Node*);
2597dd7cddfSDavid du Colombier int	samaddr(Node*, Node*);
2607dd7cddfSDavid du Colombier void	gbranch(int);
2617dd7cddfSDavid du Colombier void	patch(Prog*, long);
2627dd7cddfSDavid du Colombier int	sconst(Node*);
2637dd7cddfSDavid du Colombier int	sval(long);
2647dd7cddfSDavid du Colombier int	uconst(Node*);
2656891d857SDavid du Colombier long	hi64v(Node*);
2666891d857SDavid du Colombier long	lo64v(Node*);
2676891d857SDavid du Colombier Node*	hi64(Node*);
2686891d857SDavid du Colombier Node*	lo64(Node*);
2697dd7cddfSDavid du Colombier void	gpseudo(int, Sym*, Node*);
2707dd7cddfSDavid du Colombier 
2717dd7cddfSDavid du Colombier /*
2727dd7cddfSDavid du Colombier  * swt.c
2737dd7cddfSDavid du Colombier  */
2747dd7cddfSDavid du Colombier int	swcmp(void*, void*);
2757dd7cddfSDavid du Colombier void	doswit(Node*);
2764ac975e2SDavid du Colombier void	swit1(C1*, int, long, Node*);
2774ac975e2SDavid du Colombier void	swit2(C1*, int, long, Node*, Node*);
278ff4cd143SDavid du Colombier void	casf(void);
2797dd7cddfSDavid du Colombier void	bitload(Node*, Node*, Node*, Node*, Node*);
2807dd7cddfSDavid du Colombier void	bitstore(Node*, Node*, Node*, Node*, Node*);
2817dd7cddfSDavid du Colombier long	outstring(char*, long);
2827dd7cddfSDavid du Colombier int	mulcon(Node*, Node*);
2837dd7cddfSDavid du Colombier Multab*	mulcon0(Node*, long);
2847dd7cddfSDavid du Colombier int	mulcon1(Node*, long, Node*);
2857dd7cddfSDavid du Colombier void	nullwarn(Node*, Node*);
2867dd7cddfSDavid du Colombier void	gextern(Sym*, Node*, long, long);
2877dd7cddfSDavid du Colombier void	outcode(void);
2887dd7cddfSDavid du Colombier void	ieeedtod(Ieee*, double);
2897dd7cddfSDavid du Colombier 
2907dd7cddfSDavid du Colombier /*
2917dd7cddfSDavid du Colombier  * list
2927dd7cddfSDavid du Colombier  */
2937dd7cddfSDavid du Colombier void	listinit(void);
2949a747e4fSDavid du Colombier int	Pconv(Fmt*);
2959a747e4fSDavid du Colombier int	Aconv(Fmt*);
2969a747e4fSDavid du Colombier int	Dconv(Fmt*);
2979a747e4fSDavid du Colombier int	Sconv(Fmt*);
2989a747e4fSDavid du Colombier int	Nconv(Fmt*);
2999a747e4fSDavid du Colombier int	Bconv(Fmt*);
3007dd7cddfSDavid du Colombier 
3017dd7cddfSDavid du Colombier /*
3027dd7cddfSDavid du Colombier  * reg.c
3037dd7cddfSDavid du Colombier  */
3047dd7cddfSDavid du Colombier Reg*	rega(void);
3057dd7cddfSDavid du Colombier int	rcmp(void*, void*);
3067dd7cddfSDavid du Colombier void	regopt(Prog*);
3077dd7cddfSDavid du Colombier void	addmove(Reg*, int, int, int);
3087dd7cddfSDavid du Colombier Bits	mkvar(Adr*, int);
3097dd7cddfSDavid du Colombier void	prop(Reg*, Bits, Bits);
3107dd7cddfSDavid du Colombier void	loopit(Reg*, long);
3117dd7cddfSDavid du Colombier void	synch(Reg*, Bits);
3127dd7cddfSDavid du Colombier ulong	allreg(ulong, Rgn*);
3137dd7cddfSDavid du Colombier void	paint1(Reg*, int);
3147dd7cddfSDavid du Colombier ulong	paint2(Reg*, int);
3157dd7cddfSDavid du Colombier void	paint3(Reg*, int, long, int);
3167dd7cddfSDavid du Colombier void	addreg(Adr*, int);
3177dd7cddfSDavid du Colombier 
3187dd7cddfSDavid du Colombier /*
3197dd7cddfSDavid du Colombier  * peep.c
3207dd7cddfSDavid du Colombier  */
3217dd7cddfSDavid du Colombier void	peep(void);
3227dd7cddfSDavid du Colombier void	excise(Reg*);
3237dd7cddfSDavid du Colombier Reg*	uniqp(Reg*);
3247dd7cddfSDavid du Colombier Reg*	uniqs(Reg*);
3257dd7cddfSDavid du Colombier int	regtyp(Adr*);
3267dd7cddfSDavid du Colombier int	regzer(Adr*);
3277dd7cddfSDavid du Colombier int	anyvar(Adr*);
3287dd7cddfSDavid du Colombier int	subprop(Reg*);
3297dd7cddfSDavid du Colombier int	copyprop(Reg*);
3307dd7cddfSDavid du Colombier int	copy1(Adr*, Adr*, Reg*, int);
3317dd7cddfSDavid du Colombier int	copyu(Prog*, Adr*, Adr*);
3327dd7cddfSDavid du Colombier 
3337dd7cddfSDavid du Colombier int	copyas(Adr*, Adr*);
3347dd7cddfSDavid du Colombier int	copyau(Adr*, Adr*);
3357dd7cddfSDavid du Colombier int	copyau1(Prog*, Adr*);
3367dd7cddfSDavid du Colombier int	copysub(Adr*, Adr*, Adr*, int);
3377dd7cddfSDavid du Colombier int	copysub1(Prog*, Adr*, Adr*, int);
3387dd7cddfSDavid du Colombier 
3397dd7cddfSDavid du Colombier long	RtoB(int);
3407dd7cddfSDavid du Colombier long	FtoB(int);
3417dd7cddfSDavid du Colombier int	BtoR(long);
3427dd7cddfSDavid du Colombier int	BtoF(long);
3437dd7cddfSDavid du Colombier 
3447dd7cddfSDavid du Colombier /*
3457dd7cddfSDavid du Colombier  * com64.c
3467dd7cddfSDavid du Colombier  */
3477dd7cddfSDavid du Colombier int	com64(Node*);
3487dd7cddfSDavid du Colombier void	com64init(void);
3497dd7cddfSDavid du Colombier void	bool64(Node*);
3507dd7cddfSDavid du Colombier 
3517dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	int
3527dd7cddfSDavid du Colombier #pragma	varargck	type	"B"	Bits
3537dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
3547dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
3557dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
3567dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
357