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