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