xref: /inferno-os/utils/tc/gc.h (revision 2b69dba5038ffd0b59cf30a4c44bce549e5097f8)
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(const void*, const 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(const void*, const 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