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	"../6c/6.out.h"
3
 
4
/*
5
 * 6c/amd64
6
 * Intel 386 with AMD64 extensions
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		8
13
#define	SZ_FLOAT	4
14
#define	SZ_VLONG	8
15
#define	SZ_DOUBLE	8
16
#define	FNX		100
17
 
18
typedef	struct	Adr	Adr;
19
typedef	struct	Prog	Prog;
20
typedef	struct	Case	Case;
21
typedef	struct	C1	C1;
22
typedef	struct	Var	Var;
23
typedef	struct	Reg	Reg;
24
typedef	struct	Rgn	Rgn;
25
typedef	struct	Renv	Renv;
26
 
27
EXTERN	struct
28
{
29
	Node*	regtree;
30
	Node*	basetree;
31
	short	scale;
32
	short	reg;
33
	short	ptr;
34
} idx;
35
 
36
struct	Adr
37
{
38
	vlong	offset;
39
	double	dval;
40
	char	sval[NSNAME];
41
 
42
	Sym*	sym;
43
	uchar	type;
44
	uchar	index;
45
	uchar	etype;
46
	uchar	scale;	/* doubles as width in DATA op */
47
};
48
#define	A	((Adr*)0)
49
 
50
#define	INDEXED	9
51
struct	Prog
52
{
53
	Adr	from;
54
	Adr	to;
55
	Prog*	link;
56
	long	lineno;
57
	short	as;
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	Var
78
{
79
	vlong	offset;
80
	Sym*	sym;
81
	char	name;
82
	char	etype;
83
};
84
 
85
struct	Reg
86
{
87
	long	pc;
88
	long	rpo;		/* reverse post ordering */
89
 
90
	Bits	set;
91
	Bits	use1;
92
	Bits	use2;
93
 
94
	Bits	refbehind;
95
	Bits	refahead;
96
	Bits	calbehind;
97
	Bits	calahead;
98
	Bits	regdiff;
99
	Bits	act;
100
 
101
	long	regu;
102
	long	loop;		/* could be shorter */
103
 
104
	Reg*	log5;
105
	long	active;
106
 
107
	Reg*	p1;
108
	Reg*	p2;
109
	Reg*	p2link;
110
	Reg*	s1;
111
	Reg*	s2;
112
	Reg*	link;
113
	Prog*	prog;
114
};
115
#define	R	((Reg*)0)
116
 
117
struct	Renv
118
{
119
	int	safe;
120
	Node	base;
121
	Node*	saved;
122
	Node*	scope;
123
};
124
 
125
#define	NRGN	600
126
struct	Rgn
127
{
128
	Reg*	enter;
129
	short	cost;
130
	short	varno;
131
	short	regno;
132
};
133
 
134
EXTERN	long	breakpc;
135
EXTERN	long	nbreak;
136
EXTERN	Case*	cases;
137
EXTERN	Node	constnode;
138
EXTERN	Node	fconstnode;
139
EXTERN	Node	vconstnode;
140
EXTERN	long	continpc;
141
EXTERN	long	curarg;
142
EXTERN	long	cursafe;
143
EXTERN	Prog*	firstp;
144
EXTERN	Prog*	lastp;
145
EXTERN	long	maxargsafe;
146
EXTERN	int	mnstring;
147
EXTERN	Node*	nodrat;
148
EXTERN	Node*	nodret;
149
EXTERN	Node*	nodsafe;
150
EXTERN	long	nrathole;
151
EXTERN	long	nstring;
152
EXTERN	Prog*	p;
153
EXTERN	long	pc;
154
EXTERN	Node	lregnode;
155
EXTERN	Node	qregnode;
156
EXTERN	char	string[NSNAME];
157
EXTERN	Sym*	symrathole;
158
EXTERN	Node	znode;
159
EXTERN	Prog	zprog;
160
EXTERN	int	reg[D_NONE];
161
EXTERN	long	exregoffset;
162
EXTERN	long	exfregoffset;
163
EXTERN	uchar	typechlpv[NTYPE];
164
 
165
#define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
166
#define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
167
#define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
168
#define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
169
 
170
#define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
171
 
172
#define	CLOAD	5
173
#define	CREF	5
174
#define	CINF	1000
175
#define	LOOP	3
176
 
177
EXTERN	Rgn	region[NRGN];
178
EXTERN	Rgn*	rgp;
179
EXTERN	int	nregion;
180
EXTERN	int	nvar;
181
 
182
EXTERN	Bits	externs;
183
EXTERN	Bits	params;
184
EXTERN	Bits	consts;
185
EXTERN	Bits	addrs;
186
 
187
EXTERN	long	regbits;
188
EXTERN	long	exregbits;
189
 
190
EXTERN	int	change;
191
EXTERN	int	suppress;
192
 
193
EXTERN	Reg*	firstr;
194
EXTERN	Reg*	lastr;
195
EXTERN	Reg	zreg;
196
EXTERN	Reg*	freer;
197
EXTERN	Var	var[NVAR];
198
EXTERN	long*	idom;
199
EXTERN	Reg**	rpo2r;
200
EXTERN	long	maxnr;
201
 
202
extern	char*	anames[];
203
 
204
/*
205
 * sgen.c
206
 */
207
void	codgen(Node*, Node*);
208
void	gen(Node*);
209
void	noretval(int);
210
void	usedset(Node*, int);
211
void	xcom(Node*);
212
void	indx(Node*);
213
int	bcomplex(Node*, Node*);
214
 
215
/*
216
 * cgen.c
217
 */
218
void	zeroregm(Node*);
219
void	cgen(Node*, Node*);
220
void	reglcgen(Node*, Node*, Node*);
221
void	lcgen(Node*, Node*);
222
void	bcgen(Node*, int);
223
void	boolgen(Node*, int, Node*);
224
void	sugen(Node*, Node*, long);
225
int	needreg(Node*, int);
226
int	hardconst(Node*);
227
int	immconst(Node*);
228
 
229
/*
230
 * cgen64.c
231
 */
232
int	vaddr(Node*, int);
233
void	loadpair(Node*, Node*);
234
int	cgen64(Node*, Node*);
235
void	testv(Node*, int);
236
 
237
/*
238
 * txt.c
239
 */
240
void	ginit(void);
241
void	gclean(void);
242
void	nextpc(void);
243
void	gargs(Node*, Node*, Node*);
244
void	garg1(Node*, Node*, Node*, int, Node**);
245
Node*	nodconst(long);
246
Node*	nodfconst(double);
247
Node*	nodgconst(vlong, Type*);
248
int	nodreg(Node*, Node*, int);
249
int	isreg(Node*, int);
250
void	regret(Node*, Node*);
251
void	regalloc(Node*, Node*, Node*);
252
void	regfree(Node*);
253
void	regialloc(Node*, Node*, Node*);
254
void	regsalloc(Node*, Node*);
255
void	regaalloc1(Node*, Node*);
256
void	regaalloc(Node*, Node*);
257
void	regind(Node*, Node*);
258
void	gprep(Node*, Node*);
259
void	naddr(Node*, Adr*);
260
void	gcmp(int, Node*, vlong);
261
void	gmove(Node*, Node*);
262
void	gins(int a, Node*, Node*);
263
void	gopcode(int, Type*, Node*, Node*);
264
int	samaddr(Node*, Node*);
265
void	gbranch(int);
266
void	patch(Prog*, long);
267
int	sconst(Node*);
268
void	gpseudo(int, Sym*, Node*);
269
 
270
/*
271
 * swt.c
272
 */
273
int	swcmp(const void*, const void*);
274
void	doswit(Node*);
275
void	swit1(C1*, int, long, 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
void	nullwarn(Node*, Node*);
281
void	gextern(Sym*, Node*, long, long);
282
void	outcode(void);
283
void	ieeedtod(Ieee*, double);
284
 
285
/*
286
 * list
287
 */
288
void	listinit(void);
289
int	Pconv(Fmt*);
290
int	Aconv(Fmt*);
291
int	Dconv(Fmt*);
292
int	Sconv(Fmt*);
293
int	Rconv(Fmt*);
294
int	Xconv(Fmt*);
295
int	Bconv(Fmt*);
296
 
297
/*
298
 * reg.c
299
 */
300
Reg*	rega(void);
301
int	rcmp(const void*, const void*);
302
void	regopt(Prog*);
303
void	addmove(Reg*, int, int, int);
304
Bits	mkvar(Reg*, Adr*);
305
void	prop(Reg*, Bits, Bits);
306
void	loopit(Reg*, long);
307
void	synch(Reg*, Bits);
308
ulong	allreg(ulong, Rgn*);
309
void	paint1(Reg*, int);
310
ulong	paint2(Reg*, int);
311
void	paint3(Reg*, int, long, int);
312
void	addreg(Adr*, int);
313
 
314
/*
315
 * peep.c
316
 */
317
void	peep(void);
318
void	excise(Reg*);
319
Reg*	uniqp(Reg*);
320
Reg*	uniqs(Reg*);
321
int	regtyp(Adr*);
322
int	anyvar(Adr*);
323
int	subprop(Reg*);
324
int	copyprop(Reg*);
325
int	copy1(Adr*, Adr*, Reg*, int);
326
int	copyu(Prog*, Adr*, Adr*);
327
 
328
int	copyas(Adr*, Adr*);
329
int	copyau(Adr*, 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
#define	D_HI	D_NONE
339
#define	D_LO	D_NONE
340
 
341
#define	isregtype(t)	((t)>= D_AX && (t)<=D_R15)
342
 
343
/*
344
 * bound
345
 */
346
void	comtarg(void);
347
 
348
/*
349
 * com64
350
 */
351
int	cond(int);
352
int	com64(Node*);
353
void	com64init(void);
354
void	bool64(Node*);
355
long	lo64v(Node*);
356
long	hi64v(Node*);
357
Node*	lo64(Node*);
358
Node*	hi64(Node*);
359
 
360
/*
361
 * div/mul
362
 */
363
void	sdivgen(Node*, Node*, Node*, Node*);
364
void	udivgen(Node*, Node*, Node*, Node*);
365
void	sdiv2(long, int, Node*, Node*);
366
void	smod2(long, int, Node*, Node*);
367
void	mulgen(Type*, Node*, Node*);
368
void	genmuladd(Node*, Node*, int, Node*);
369
void	shiftit(Type*, Node*, Node*);
370
 
371
#pragma	varargck	type	"A"	int
372
#pragma	varargck	type	"B"	Bits
373
#pragma	varargck	type	"D"	Adr*
374
#pragma	varargck	type	"P"	Prog*
375
#pragma	varargck	type	"R"	int
376
#pragma	varargck	type	"S"	char*
377
 
378
#define	D_X7	(D_X0+7)
379
 
380
void	fgopcode(int, Node*, Node*, int, int);