xref: /plan9-contrib/sys/src/cmd/ic/gc.h (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier #include	"../cc/cc.h"
2*ce95e1b3SDavid du Colombier #include	"../ic/i.out.h"
3*ce95e1b3SDavid du Colombier 
4*ce95e1b3SDavid du Colombier /*
5*ce95e1b3SDavid du Colombier  * zc/riscv
6*ce95e1b3SDavid du Colombier  * RISC-V 32-bit
7*ce95e1b3SDavid du Colombier  */
8*ce95e1b3SDavid du Colombier #define	SZ_CHAR		1
9*ce95e1b3SDavid du Colombier #define	SZ_SHORT	2
10*ce95e1b3SDavid du Colombier #define	SZ_INT		4
11*ce95e1b3SDavid du Colombier #define	SZ_LONG		4
12*ce95e1b3SDavid du Colombier #define	SZ_IND		4
13*ce95e1b3SDavid du Colombier #define	SZ_FLOAT	4
14*ce95e1b3SDavid du Colombier #define	SZ_VLONG	8
15*ce95e1b3SDavid du Colombier #define	SZ_DOUBLE	8
16*ce95e1b3SDavid du Colombier #define	FNX		100
17*ce95e1b3SDavid du Colombier 
18*ce95e1b3SDavid du Colombier typedef	struct	Adr	Adr;
19*ce95e1b3SDavid du Colombier typedef	struct	Prog	Prog;
20*ce95e1b3SDavid du Colombier typedef	struct	Case	Case;
21*ce95e1b3SDavid du Colombier typedef	struct	C1	C1;
22*ce95e1b3SDavid du Colombier typedef	struct	Multab	Multab;
23*ce95e1b3SDavid du Colombier typedef	struct	Hintab	Hintab;
24*ce95e1b3SDavid du Colombier typedef	struct	Var	Var;
25*ce95e1b3SDavid du Colombier typedef	struct	Reg	Reg;
26*ce95e1b3SDavid du Colombier typedef	struct	Rgn	Rgn;
27*ce95e1b3SDavid du Colombier 
28*ce95e1b3SDavid du Colombier struct	Adr
29*ce95e1b3SDavid du Colombier {
30*ce95e1b3SDavid du Colombier 	long	offset;
31*ce95e1b3SDavid du Colombier 	double	dval;
32*ce95e1b3SDavid du Colombier 	char	sval[NSNAME];
33*ce95e1b3SDavid du Colombier 	Ieee	ieee;
34*ce95e1b3SDavid du Colombier 
35*ce95e1b3SDavid du Colombier 	Sym*	sym;
36*ce95e1b3SDavid du Colombier 	char	type;
37*ce95e1b3SDavid du Colombier 	char	reg;
38*ce95e1b3SDavid du Colombier 	char	name;
39*ce95e1b3SDavid du Colombier 	char	etype;
40*ce95e1b3SDavid du Colombier };
41*ce95e1b3SDavid du Colombier #define	A	((Adr*)0)
42*ce95e1b3SDavid du Colombier 
43*ce95e1b3SDavid du Colombier #define	INDEXED	9
44*ce95e1b3SDavid du Colombier struct	Prog
45*ce95e1b3SDavid du Colombier {
46*ce95e1b3SDavid du Colombier 	Adr	from;
47*ce95e1b3SDavid du Colombier 	Adr	to;
48*ce95e1b3SDavid du Colombier 	Prog*	link;
49*ce95e1b3SDavid du Colombier 	long	lineno;
50*ce95e1b3SDavid du Colombier 	char	as;
51*ce95e1b3SDavid du Colombier 	char	reg;
52*ce95e1b3SDavid du Colombier };
53*ce95e1b3SDavid du Colombier #define	P	((Prog*)0)
54*ce95e1b3SDavid du Colombier 
55*ce95e1b3SDavid du Colombier struct	Case
56*ce95e1b3SDavid du Colombier {
57*ce95e1b3SDavid du Colombier 	Case*	link;
58*ce95e1b3SDavid du Colombier 	vlong	val;
59*ce95e1b3SDavid du Colombier 	long	label;
60*ce95e1b3SDavid du Colombier 	char	def;
61*ce95e1b3SDavid du Colombier 	char isv;
62*ce95e1b3SDavid du Colombier };
63*ce95e1b3SDavid du Colombier #define	C	((Case*)0)
64*ce95e1b3SDavid du Colombier 
65*ce95e1b3SDavid du Colombier struct	C1
66*ce95e1b3SDavid du Colombier {
67*ce95e1b3SDavid du Colombier 	vlong	val;
68*ce95e1b3SDavid du Colombier 	long	label;
69*ce95e1b3SDavid du Colombier };
70*ce95e1b3SDavid du Colombier 
71*ce95e1b3SDavid du Colombier struct	Multab
72*ce95e1b3SDavid du Colombier {
73*ce95e1b3SDavid du Colombier 	long	val;
74*ce95e1b3SDavid du Colombier 	char	code[20];
75*ce95e1b3SDavid du Colombier };
76*ce95e1b3SDavid du Colombier 
77*ce95e1b3SDavid du Colombier struct	Hintab
78*ce95e1b3SDavid du Colombier {
79*ce95e1b3SDavid du Colombier 	ushort	val;
80*ce95e1b3SDavid du Colombier 	char	hint[10];
81*ce95e1b3SDavid du Colombier };
82*ce95e1b3SDavid du Colombier 
83*ce95e1b3SDavid du Colombier struct	Var
84*ce95e1b3SDavid du Colombier {
85*ce95e1b3SDavid du Colombier 	long	offset;
86*ce95e1b3SDavid du Colombier 	Sym*	sym;
87*ce95e1b3SDavid du Colombier 	char	name;
88*ce95e1b3SDavid du Colombier 	char	etype;
89*ce95e1b3SDavid du Colombier };
90*ce95e1b3SDavid du Colombier 
91*ce95e1b3SDavid du Colombier struct	Reg
92*ce95e1b3SDavid du Colombier {
93*ce95e1b3SDavid du Colombier 	long	pc;
94*ce95e1b3SDavid du Colombier 	long	rpo;		/* reverse post ordering */
95*ce95e1b3SDavid du Colombier 
96*ce95e1b3SDavid du Colombier 	Bits	set;
97*ce95e1b3SDavid du Colombier 	Bits	use1;
98*ce95e1b3SDavid du Colombier 	Bits	use2;
99*ce95e1b3SDavid du Colombier 
100*ce95e1b3SDavid du Colombier 	Bits	refbehind;
101*ce95e1b3SDavid du Colombier 	Bits	refahead;
102*ce95e1b3SDavid du Colombier 	Bits	calbehind;
103*ce95e1b3SDavid du Colombier 	Bits	calahead;
104*ce95e1b3SDavid du Colombier 	Bits	regdiff;
105*ce95e1b3SDavid du Colombier 	Bits	act;
106*ce95e1b3SDavid du Colombier 
107*ce95e1b3SDavid du Colombier 	long	regu;
108*ce95e1b3SDavid du Colombier 	long	loop;		/* could be shorter */
109*ce95e1b3SDavid du Colombier 
110*ce95e1b3SDavid du Colombier 	Reg*	log5;
111*ce95e1b3SDavid du Colombier 	long	active;
112*ce95e1b3SDavid du Colombier 
113*ce95e1b3SDavid du Colombier 	Reg*	p1;
114*ce95e1b3SDavid du Colombier 	Reg*	p2;
115*ce95e1b3SDavid du Colombier 	Reg*	p2link;
116*ce95e1b3SDavid du Colombier 	Reg*	s1;
117*ce95e1b3SDavid du Colombier 	Reg*	s2;
118*ce95e1b3SDavid du Colombier 	Reg*	link;
119*ce95e1b3SDavid du Colombier 	Prog*	prog;
120*ce95e1b3SDavid du Colombier };
121*ce95e1b3SDavid du Colombier #define	R	((Reg*)0)
122*ce95e1b3SDavid du Colombier 
123*ce95e1b3SDavid du Colombier #define	NRGN	600
124*ce95e1b3SDavid du Colombier struct	Rgn
125*ce95e1b3SDavid du Colombier {
126*ce95e1b3SDavid du Colombier 	Reg*	enter;
127*ce95e1b3SDavid du Colombier 	short	cost;
128*ce95e1b3SDavid du Colombier 	short	varno;
129*ce95e1b3SDavid du Colombier 	short	regno;
130*ce95e1b3SDavid du Colombier };
131*ce95e1b3SDavid du Colombier 
132*ce95e1b3SDavid du Colombier EXTERN	long	breakpc;
133*ce95e1b3SDavid du Colombier EXTERN	long	nbreak;
134*ce95e1b3SDavid du Colombier EXTERN	Case*	cases;
135*ce95e1b3SDavid du Colombier EXTERN	Node	constnode;
136*ce95e1b3SDavid du Colombier EXTERN	Node	fconstnode;
137*ce95e1b3SDavid du Colombier EXTERN	Node	vconstnode;
138*ce95e1b3SDavid du Colombier EXTERN	long	continpc;
139*ce95e1b3SDavid du Colombier EXTERN	long	curarg;
140*ce95e1b3SDavid du Colombier EXTERN	long	cursafe;
141*ce95e1b3SDavid du Colombier EXTERN	Prog*	firstp;
142*ce95e1b3SDavid du Colombier EXTERN	Prog*	lastp;
143*ce95e1b3SDavid du Colombier EXTERN	long	maxargsafe;
144*ce95e1b3SDavid du Colombier EXTERN	int	mnstring;
145*ce95e1b3SDavid du Colombier EXTERN	Multab	multab[20];
146*ce95e1b3SDavid du Colombier EXTERN	int	hintabsize;
147*ce95e1b3SDavid du Colombier EXTERN	Node*	nodrat;
148*ce95e1b3SDavid du Colombier EXTERN	Node*	nodret;
149*ce95e1b3SDavid du Colombier EXTERN	Node*	nodsafe;
150*ce95e1b3SDavid du Colombier EXTERN	long	nrathole;
151*ce95e1b3SDavid du Colombier EXTERN	long	nstring;
152*ce95e1b3SDavid du Colombier EXTERN	Prog*	p;
153*ce95e1b3SDavid du Colombier EXTERN	long	pc;
154*ce95e1b3SDavid du Colombier EXTERN	Node	regnode;
155*ce95e1b3SDavid du Colombier EXTERN	Node	vregnode;
156*ce95e1b3SDavid du Colombier EXTERN	char	string[NSNAME];
157*ce95e1b3SDavid du Colombier EXTERN	Sym*	symrathole;
158*ce95e1b3SDavid du Colombier EXTERN	Node	znode;
159*ce95e1b3SDavid du Colombier EXTERN	Prog	zprog;
160*ce95e1b3SDavid du Colombier EXTERN	int	reg[NREG+NREG];
161*ce95e1b3SDavid du Colombier EXTERN	long	exregoffset;
162*ce95e1b3SDavid du Colombier EXTERN	long	exfregoffset;
163*ce95e1b3SDavid du Colombier 
164*ce95e1b3SDavid du Colombier #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
165*ce95e1b3SDavid du Colombier #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
166*ce95e1b3SDavid du Colombier #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
167*ce95e1b3SDavid du Colombier #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
168*ce95e1b3SDavid du Colombier 
169*ce95e1b3SDavid du Colombier #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
170*ce95e1b3SDavid du Colombier 
171*ce95e1b3SDavid du Colombier #define	CLOAD	4
172*ce95e1b3SDavid du Colombier #define	CREF	5
173*ce95e1b3SDavid du Colombier #define	CINF	1000
174*ce95e1b3SDavid du Colombier #define	LOOP	3
175*ce95e1b3SDavid du Colombier 
176*ce95e1b3SDavid du Colombier EXTERN	Rgn	region[NRGN];
177*ce95e1b3SDavid du Colombier EXTERN	Rgn*	rgp;
178*ce95e1b3SDavid du Colombier EXTERN	int	nregion;
179*ce95e1b3SDavid du Colombier EXTERN	int	nvar;
180*ce95e1b3SDavid du Colombier 
181*ce95e1b3SDavid du Colombier EXTERN	Bits	externs;
182*ce95e1b3SDavid du Colombier EXTERN	Bits	params;
183*ce95e1b3SDavid du Colombier EXTERN	Bits	consts;
184*ce95e1b3SDavid du Colombier EXTERN	Bits	addrs;
185*ce95e1b3SDavid du Colombier 
186*ce95e1b3SDavid du Colombier EXTERN	long	regbits;
187*ce95e1b3SDavid du Colombier EXTERN	long	exregbits;
188*ce95e1b3SDavid du Colombier 
189*ce95e1b3SDavid du Colombier EXTERN	int	change;
190*ce95e1b3SDavid du Colombier EXTERN	int	suppress;
191*ce95e1b3SDavid du Colombier 
192*ce95e1b3SDavid du Colombier EXTERN	Reg*	firstr;
193*ce95e1b3SDavid du Colombier EXTERN	Reg*	lastr;
194*ce95e1b3SDavid du Colombier EXTERN	Reg	zreg;
195*ce95e1b3SDavid du Colombier EXTERN	Reg*	freer;
196*ce95e1b3SDavid du Colombier EXTERN	Var	var[NVAR];
197*ce95e1b3SDavid du Colombier EXTERN	long*	idom;
198*ce95e1b3SDavid du Colombier EXTERN	Reg**	rpo2r;
199*ce95e1b3SDavid du Colombier EXTERN	long	maxnr;
200*ce95e1b3SDavid du Colombier 
201*ce95e1b3SDavid du Colombier extern	char*	anames[];
202*ce95e1b3SDavid du Colombier extern	Hintab	hintab[];
203*ce95e1b3SDavid du Colombier 
204*ce95e1b3SDavid du Colombier /*
205*ce95e1b3SDavid du Colombier  * sgen.c
206*ce95e1b3SDavid du Colombier  */
207*ce95e1b3SDavid du Colombier void	codgen(Node*, Node*);
208*ce95e1b3SDavid du Colombier void	gen(Node*);
209*ce95e1b3SDavid du Colombier void	noretval(int);
210*ce95e1b3SDavid du Colombier void	xcom(Node*);
211*ce95e1b3SDavid du Colombier int	bcomplex(Node*, Node*);
212*ce95e1b3SDavid du Colombier void	usedset(Node*, int);
213*ce95e1b3SDavid du Colombier 
214*ce95e1b3SDavid du Colombier /*
215*ce95e1b3SDavid du Colombier  * cgen.c
216*ce95e1b3SDavid du Colombier  */
217*ce95e1b3SDavid du Colombier void	cgen(Node*, Node*);
218*ce95e1b3SDavid du Colombier void	reglcgen(Node*, Node*, Node*);
219*ce95e1b3SDavid du Colombier void	lcgen(Node*, Node*);
220*ce95e1b3SDavid du Colombier void	bcgen(Node*, int);
221*ce95e1b3SDavid du Colombier void	boolgen(Node*, int, Node*);
222*ce95e1b3SDavid du Colombier void	sugen(Node*, Node*, long);
223*ce95e1b3SDavid du Colombier void	layout(Node*, Node*, int, int, Node*);
224*ce95e1b3SDavid du Colombier 
225*ce95e1b3SDavid du Colombier /*
226*ce95e1b3SDavid du Colombier  * txt.c
227*ce95e1b3SDavid du Colombier  */
228*ce95e1b3SDavid du Colombier void	ginit(void);
229*ce95e1b3SDavid du Colombier void	gclean(void);
230*ce95e1b3SDavid du Colombier void	nextpc(void);
231*ce95e1b3SDavid du Colombier void	gargs(Node*, Node*, Node*);
232*ce95e1b3SDavid du Colombier void	garg1(Node*, Node*, Node*, int, Node**);
233*ce95e1b3SDavid du Colombier Node*	nodconst(long);
234*ce95e1b3SDavid du Colombier Node*	nod32const(vlong);
235*ce95e1b3SDavid du Colombier Node*	nodfconst(double);
236*ce95e1b3SDavid du Colombier Node*	nodgconst(vlong, Type*);
237*ce95e1b3SDavid du Colombier void	nodreg(Node*, Node*, int);
238*ce95e1b3SDavid du Colombier void	regret(Node*, Node*);
239*ce95e1b3SDavid du Colombier void	regalloc(Node*, Node*, Node*);
240*ce95e1b3SDavid du Colombier void	regfree(Node*);
241*ce95e1b3SDavid du Colombier void	regialloc(Node*, Node*, Node*);
242*ce95e1b3SDavid du Colombier void	regsalloc(Node*, Node*);
243*ce95e1b3SDavid du Colombier void	regaalloc1(Node*, Node*);
244*ce95e1b3SDavid du Colombier void	regaalloc(Node*, Node*);
245*ce95e1b3SDavid du Colombier void	regind(Node*, Node*);
246*ce95e1b3SDavid du Colombier void	gprep(Node*, Node*);
247*ce95e1b3SDavid du Colombier void	raddr(Node*, Prog*);
248*ce95e1b3SDavid du Colombier void	naddr(Node*, Adr*);
249*ce95e1b3SDavid du Colombier void	gmove(Node*, Node*);
250*ce95e1b3SDavid du Colombier void	gins(int a, Node*, Node*);
251*ce95e1b3SDavid du Colombier void	gopcode(int, Node*, Node*, Node*);
252*ce95e1b3SDavid du Colombier int	samaddr(Node*, Node*);
253*ce95e1b3SDavid du Colombier void	gbranch(int);
254*ce95e1b3SDavid du Colombier void	patch(Prog*, long);
255*ce95e1b3SDavid du Colombier int	sconst(Node*);
256*ce95e1b3SDavid du Colombier int	sval(long);
257*ce95e1b3SDavid du Colombier void	gpseudo(int, Sym*, Node*);
258*ce95e1b3SDavid du Colombier 
259*ce95e1b3SDavid du Colombier /*
260*ce95e1b3SDavid du Colombier  * swt.c
261*ce95e1b3SDavid du Colombier  */
262*ce95e1b3SDavid du Colombier int	swcmp(void*, void*);
263*ce95e1b3SDavid du Colombier void	doswit(Node*);
264*ce95e1b3SDavid du Colombier void	swit1(C1*, int, long, Node*);
265*ce95e1b3SDavid du Colombier void	swit2(C1*, int, long, Node*, Node*);
266*ce95e1b3SDavid du Colombier void	casf(void);
267*ce95e1b3SDavid du Colombier void	bitload(Node*, Node*, Node*, Node*, Node*);
268*ce95e1b3SDavid du Colombier void	bitstore(Node*, Node*, Node*, Node*, Node*);
269*ce95e1b3SDavid du Colombier long	outstring(char*, long);
270*ce95e1b3SDavid du Colombier int	mulcon(Node*, Node*);
271*ce95e1b3SDavid du Colombier Multab*	mulcon0(long);
272*ce95e1b3SDavid du Colombier void	nullwarn(Node*, Node*);
273*ce95e1b3SDavid du Colombier void	gextern(Sym*, Node*, long, long);
274*ce95e1b3SDavid du Colombier void	outcode(void);
275*ce95e1b3SDavid du Colombier void	ieeedtod(Ieee*, double);
276*ce95e1b3SDavid du Colombier 
277*ce95e1b3SDavid du Colombier /*
278*ce95e1b3SDavid du Colombier  * list
279*ce95e1b3SDavid du Colombier  */
280*ce95e1b3SDavid du Colombier void	listinit(void);
281*ce95e1b3SDavid du Colombier int	Pconv(Fmt*);
282*ce95e1b3SDavid du Colombier int	Aconv(Fmt*);
283*ce95e1b3SDavid du Colombier int	Dconv(Fmt*);
284*ce95e1b3SDavid du Colombier int	Sconv(Fmt*);
285*ce95e1b3SDavid du Colombier int	Nconv(Fmt*);
286*ce95e1b3SDavid du Colombier int	Bconv(Fmt*);
287*ce95e1b3SDavid du Colombier 
288*ce95e1b3SDavid du Colombier /*
289*ce95e1b3SDavid du Colombier  * reg.c
290*ce95e1b3SDavid du Colombier  */
291*ce95e1b3SDavid du Colombier Reg*	rega(void);
292*ce95e1b3SDavid du Colombier int	rcmp(void*, void*);
293*ce95e1b3SDavid du Colombier void	regopt(Prog*);
294*ce95e1b3SDavid du Colombier void	addmove(Reg*, int, int, int);
295*ce95e1b3SDavid du Colombier Bits	mkvar(Adr*, int);
296*ce95e1b3SDavid du Colombier void	prop(Reg*, Bits, Bits);
297*ce95e1b3SDavid du Colombier void	loopit(Reg*, long);
298*ce95e1b3SDavid du Colombier void	synch(Reg*, Bits);
299*ce95e1b3SDavid du Colombier ulong	allreg(ulong, Rgn*);
300*ce95e1b3SDavid du Colombier void	paint1(Reg*, int);
301*ce95e1b3SDavid du Colombier ulong	paint2(Reg*, int);
302*ce95e1b3SDavid du Colombier void	paint3(Reg*, int, long, int);
303*ce95e1b3SDavid du Colombier void	addreg(Adr*, int);
304*ce95e1b3SDavid du Colombier 
305*ce95e1b3SDavid du Colombier /*
306*ce95e1b3SDavid du Colombier  * peep.c
307*ce95e1b3SDavid du Colombier  */
308*ce95e1b3SDavid du Colombier void	peep(void);
309*ce95e1b3SDavid du Colombier void	excise(Reg*);
310*ce95e1b3SDavid du Colombier Reg*	uniqp(Reg*);
311*ce95e1b3SDavid du Colombier Reg*	uniqs(Reg*);
312*ce95e1b3SDavid du Colombier int	regtyp(Adr*);
313*ce95e1b3SDavid du Colombier int	regzer(Adr*);
314*ce95e1b3SDavid du Colombier int	anyvar(Adr*);
315*ce95e1b3SDavid du Colombier int	subprop(Reg*);
316*ce95e1b3SDavid du Colombier int	copyprop(Reg*);
317*ce95e1b3SDavid du Colombier int	copy1(Adr*, Adr*, Reg*, int);
318*ce95e1b3SDavid du Colombier int	copyu(Prog*, Adr*, Adr*);
319*ce95e1b3SDavid du Colombier 
320*ce95e1b3SDavid du Colombier int	copyas(Adr*, Adr*);
321*ce95e1b3SDavid du Colombier int	copyau(Adr*, Adr*);
322*ce95e1b3SDavid du Colombier int	copyau1(Prog*, Adr*);
323*ce95e1b3SDavid du Colombier int	copysub(Adr*, Adr*, Adr*, int);
324*ce95e1b3SDavid du Colombier int	copysub1(Prog*, Adr*, Adr*, int);
325*ce95e1b3SDavid du Colombier 
326*ce95e1b3SDavid du Colombier long	RtoB(int);
327*ce95e1b3SDavid du Colombier long	FtoB(int);
328*ce95e1b3SDavid du Colombier int	BtoR(long);
329*ce95e1b3SDavid du Colombier int	BtoF(long);
330*ce95e1b3SDavid du Colombier 
331*ce95e1b3SDavid du Colombier #pragma	varargck	type	"A"	int
332*ce95e1b3SDavid du Colombier #pragma	varargck	type	"B"	Bits
333*ce95e1b3SDavid du Colombier #pragma	varargck	type	"D"	Adr*
334*ce95e1b3SDavid du Colombier #pragma	varargck	type	"N"	Adr*
335*ce95e1b3SDavid du Colombier #pragma	varargck	type	"P"	Prog*
336*ce95e1b3SDavid du Colombier #pragma	varargck	type	"S"	char*
337