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