Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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