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