xref: /inferno-os/utils/qc/gc.h (revision 45a20ab721a513710138340faff3d59a31c3e01e)
174a4d8c2SCharles.Forsyth #include	"../cc/cc.h"
274a4d8c2SCharles.Forsyth #include	"../qc/q.out.h"
374a4d8c2SCharles.Forsyth 
474a4d8c2SCharles.Forsyth /*
574a4d8c2SCharles.Forsyth  * qc/power
674a4d8c2SCharles.Forsyth  * powerpc
774a4d8c2SCharles.Forsyth  */
874a4d8c2SCharles.Forsyth #define	SZ_CHAR		1
974a4d8c2SCharles.Forsyth #define	SZ_SHORT	2
1074a4d8c2SCharles.Forsyth #define	SZ_INT		4
1174a4d8c2SCharles.Forsyth #define	SZ_LONG		4
1274a4d8c2SCharles.Forsyth #define	SZ_IND		4
1374a4d8c2SCharles.Forsyth #define	SZ_FLOAT	4
1474a4d8c2SCharles.Forsyth #define	SZ_VLONG	8
1574a4d8c2SCharles.Forsyth #define	SZ_DOUBLE	8
1674a4d8c2SCharles.Forsyth #define	FNX		100
1774a4d8c2SCharles.Forsyth 
1874a4d8c2SCharles.Forsyth typedef	struct	Adr	Adr;
1974a4d8c2SCharles.Forsyth typedef	struct	Prog	Prog;
2074a4d8c2SCharles.Forsyth typedef	struct	Case	Case;
2174a4d8c2SCharles.Forsyth typedef	struct	C1	C1;
2274a4d8c2SCharles.Forsyth typedef	struct	Multab	Multab;
2374a4d8c2SCharles.Forsyth typedef	struct	Hintab	Hintab;
2474a4d8c2SCharles.Forsyth typedef	struct	Var	Var;
2574a4d8c2SCharles.Forsyth typedef	struct	Reg	Reg;
2674a4d8c2SCharles.Forsyth typedef	struct	Rgn	Rgn;
2774a4d8c2SCharles.Forsyth 
2874a4d8c2SCharles.Forsyth struct	Adr
2974a4d8c2SCharles.Forsyth {
30*45a20ab7Sforsyth /*	union	*/
31*45a20ab7Sforsyth /*	{	*/
3274a4d8c2SCharles.Forsyth 		long	offset;
3374a4d8c2SCharles.Forsyth 		double	dval;
3474a4d8c2SCharles.Forsyth 		char	sval[NSNAME];
35*45a20ab7Sforsyth /*	};	*/
3674a4d8c2SCharles.Forsyth 	Sym*	sym;
3774a4d8c2SCharles.Forsyth 	char	type;
3874a4d8c2SCharles.Forsyth 	char	reg;
3974a4d8c2SCharles.Forsyth 	char	name;
4074a4d8c2SCharles.Forsyth 	char	etype;
4174a4d8c2SCharles.Forsyth };
4274a4d8c2SCharles.Forsyth #define	A	((Adr*)0)
4374a4d8c2SCharles.Forsyth 
4474a4d8c2SCharles.Forsyth #define	INDEXED	9
4574a4d8c2SCharles.Forsyth struct	Prog
4674a4d8c2SCharles.Forsyth {
4774a4d8c2SCharles.Forsyth 	Adr	from;
4874a4d8c2SCharles.Forsyth 	Adr	from3;		/* third argument for fmadd, fmsub, ... */
4974a4d8c2SCharles.Forsyth 	Adr	to;
5074a4d8c2SCharles.Forsyth 	Prog*	link;
5174a4d8c2SCharles.Forsyth 	long	lineno;
5274a4d8c2SCharles.Forsyth 	short	as;
5374a4d8c2SCharles.Forsyth 	char	reg;
5474a4d8c2SCharles.Forsyth };
5574a4d8c2SCharles.Forsyth #define	P	((Prog*)0)
5674a4d8c2SCharles.Forsyth 
5774a4d8c2SCharles.Forsyth struct	Case
5874a4d8c2SCharles.Forsyth {
5974a4d8c2SCharles.Forsyth 	Case*	link;
60*45a20ab7Sforsyth 	vlong	val;
6174a4d8c2SCharles.Forsyth 	long	label;
6274a4d8c2SCharles.Forsyth 	char	def;
63d67b7dadSforsyth 	char isv;
6474a4d8c2SCharles.Forsyth };
6574a4d8c2SCharles.Forsyth #define	C	((Case*)0)
6674a4d8c2SCharles.Forsyth 
6774a4d8c2SCharles.Forsyth struct	C1
6874a4d8c2SCharles.Forsyth {
69*45a20ab7Sforsyth 	vlong	val;
7074a4d8c2SCharles.Forsyth 	long	label;
7174a4d8c2SCharles.Forsyth };
7274a4d8c2SCharles.Forsyth 
7374a4d8c2SCharles.Forsyth struct	Multab
7474a4d8c2SCharles.Forsyth {
7574a4d8c2SCharles.Forsyth 	long	val;
7674a4d8c2SCharles.Forsyth 	char	code[20];
7774a4d8c2SCharles.Forsyth };
7874a4d8c2SCharles.Forsyth 
7974a4d8c2SCharles.Forsyth struct	Hintab
8074a4d8c2SCharles.Forsyth {
8174a4d8c2SCharles.Forsyth 	ushort	val;
8274a4d8c2SCharles.Forsyth 	char	hint[10];
8374a4d8c2SCharles.Forsyth };
8474a4d8c2SCharles.Forsyth 
8574a4d8c2SCharles.Forsyth struct	Var
8674a4d8c2SCharles.Forsyth {
8774a4d8c2SCharles.Forsyth 	long	offset;
8874a4d8c2SCharles.Forsyth 	Sym*	sym;
8974a4d8c2SCharles.Forsyth 	char	name;
9074a4d8c2SCharles.Forsyth 	char	etype;
9174a4d8c2SCharles.Forsyth };
9274a4d8c2SCharles.Forsyth 
9374a4d8c2SCharles.Forsyth struct	Reg
9474a4d8c2SCharles.Forsyth {
9574a4d8c2SCharles.Forsyth 	long	pc;
9674a4d8c2SCharles.Forsyth 	long	rpo;		/* reverse post ordering */
9774a4d8c2SCharles.Forsyth 
9874a4d8c2SCharles.Forsyth 	Bits	set;
9974a4d8c2SCharles.Forsyth 	Bits	use1;
10074a4d8c2SCharles.Forsyth 	Bits	use2;
10174a4d8c2SCharles.Forsyth 
10274a4d8c2SCharles.Forsyth 	Bits	refbehind;
10374a4d8c2SCharles.Forsyth 	Bits	refahead;
10474a4d8c2SCharles.Forsyth 	Bits	calbehind;
10574a4d8c2SCharles.Forsyth 	Bits	calahead;
10674a4d8c2SCharles.Forsyth 	Bits	regdiff;
10774a4d8c2SCharles.Forsyth 	Bits	act;
10874a4d8c2SCharles.Forsyth 
10974a4d8c2SCharles.Forsyth 	long	regu;
11074a4d8c2SCharles.Forsyth 	long	loop;		/* could be shorter */
11174a4d8c2SCharles.Forsyth 
112*45a20ab7Sforsyth /*	union	*/
113*45a20ab7Sforsyth /*	{	*/
11474a4d8c2SCharles.Forsyth 		Reg*	log5;
115*45a20ab7Sforsyth 		long	active;
116*45a20ab7Sforsyth /*	};	*/
11774a4d8c2SCharles.Forsyth 	Reg*	p1;
11874a4d8c2SCharles.Forsyth 	Reg*	p2;
11974a4d8c2SCharles.Forsyth 	Reg*	p2link;
12074a4d8c2SCharles.Forsyth 	Reg*	s1;
12174a4d8c2SCharles.Forsyth 	Reg*	s2;
12274a4d8c2SCharles.Forsyth 	Reg*	link;
12374a4d8c2SCharles.Forsyth 	Prog*	prog;
12474a4d8c2SCharles.Forsyth };
12574a4d8c2SCharles.Forsyth #define	R	((Reg*)0)
12674a4d8c2SCharles.Forsyth 
12774a4d8c2SCharles.Forsyth #define	NRGN	600
12874a4d8c2SCharles.Forsyth struct	Rgn
12974a4d8c2SCharles.Forsyth {
13074a4d8c2SCharles.Forsyth 	Reg*	enter;
13174a4d8c2SCharles.Forsyth 	short	cost;
13274a4d8c2SCharles.Forsyth 	short	varno;
13374a4d8c2SCharles.Forsyth 	short	regno;
13474a4d8c2SCharles.Forsyth };
13574a4d8c2SCharles.Forsyth 
13674a4d8c2SCharles.Forsyth EXTERN	long	breakpc;
137d67b7dadSforsyth EXTERN	long	nbreak;
13874a4d8c2SCharles.Forsyth EXTERN	Case*	cases;
13974a4d8c2SCharles.Forsyth EXTERN	Node	constnode;
14074a4d8c2SCharles.Forsyth EXTERN	Node	fconstnode;
14174a4d8c2SCharles.Forsyth EXTERN	long	continpc;
14274a4d8c2SCharles.Forsyth EXTERN	long	curarg;
14374a4d8c2SCharles.Forsyth EXTERN	long	cursafe;
14474a4d8c2SCharles.Forsyth EXTERN	Prog*	firstp;
14574a4d8c2SCharles.Forsyth EXTERN	Prog*	lastp;
14674a4d8c2SCharles.Forsyth EXTERN	int	hintabsize;
14774a4d8c2SCharles.Forsyth EXTERN	long	maxargsafe;
14874a4d8c2SCharles.Forsyth EXTERN	Multab	multab[20];
14974a4d8c2SCharles.Forsyth EXTERN	int	mnstring;
15074a4d8c2SCharles.Forsyth EXTERN	Node*	nodrat;
15174a4d8c2SCharles.Forsyth EXTERN	Node*	nodret;
15274a4d8c2SCharles.Forsyth EXTERN	Node*	nodsafe;
153d67b7dadSforsyth EXTERN	Node*	nodretv;
15474a4d8c2SCharles.Forsyth EXTERN	long	nrathole;
15574a4d8c2SCharles.Forsyth EXTERN	long	nstring;
15674a4d8c2SCharles.Forsyth EXTERN	Prog*	p;
15774a4d8c2SCharles.Forsyth EXTERN	long	pc;
15874a4d8c2SCharles.Forsyth EXTERN	Node	regnode;
15974a4d8c2SCharles.Forsyth EXTERN	char	string[NSNAME];
16074a4d8c2SCharles.Forsyth EXTERN	Sym*	symrathole;
16174a4d8c2SCharles.Forsyth EXTERN	Node	znode;
16274a4d8c2SCharles.Forsyth EXTERN	Prog	zprog;
16374a4d8c2SCharles.Forsyth EXTERN	int	reg[NREG+NREG];
16474a4d8c2SCharles.Forsyth EXTERN	long	exregoffset;
16574a4d8c2SCharles.Forsyth EXTERN	long	exfregoffset;
16674a4d8c2SCharles.Forsyth 
16774a4d8c2SCharles.Forsyth #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
16874a4d8c2SCharles.Forsyth #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
16974a4d8c2SCharles.Forsyth #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
17074a4d8c2SCharles.Forsyth #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
17174a4d8c2SCharles.Forsyth 
17274a4d8c2SCharles.Forsyth #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
17374a4d8c2SCharles.Forsyth 
17474a4d8c2SCharles.Forsyth #define	CLOAD	5
17574a4d8c2SCharles.Forsyth #define	CREF	5
17674a4d8c2SCharles.Forsyth #define	CINF	1000
17774a4d8c2SCharles.Forsyth #define	LOOP	3
17874a4d8c2SCharles.Forsyth 
17974a4d8c2SCharles.Forsyth EXTERN	Rgn	region[NRGN];
18074a4d8c2SCharles.Forsyth EXTERN	Rgn*	rgp;
18174a4d8c2SCharles.Forsyth EXTERN	int	nregion;
18274a4d8c2SCharles.Forsyth EXTERN	int	nvar;
18374a4d8c2SCharles.Forsyth 
18474a4d8c2SCharles.Forsyth EXTERN	Bits	externs;
18574a4d8c2SCharles.Forsyth EXTERN	Bits	params;
18674a4d8c2SCharles.Forsyth EXTERN	Bits	consts;
18774a4d8c2SCharles.Forsyth EXTERN	Bits	addrs;
18874a4d8c2SCharles.Forsyth 
18974a4d8c2SCharles.Forsyth EXTERN	long	regbits;
19074a4d8c2SCharles.Forsyth EXTERN	long	exregbits;
19174a4d8c2SCharles.Forsyth 
19274a4d8c2SCharles.Forsyth EXTERN	int	change;
19374a4d8c2SCharles.Forsyth EXTERN	int	suppress;
19474a4d8c2SCharles.Forsyth 
19574a4d8c2SCharles.Forsyth EXTERN	Reg*	firstr;
19674a4d8c2SCharles.Forsyth EXTERN	Reg*	lastr;
19774a4d8c2SCharles.Forsyth EXTERN	Reg	zreg;
19874a4d8c2SCharles.Forsyth EXTERN	Reg*	freer;
19974a4d8c2SCharles.Forsyth EXTERN	Var	var[NVAR];
20074a4d8c2SCharles.Forsyth EXTERN	long*	idom;
20174a4d8c2SCharles.Forsyth EXTERN	Reg**	rpo2r;
20274a4d8c2SCharles.Forsyth EXTERN	long	maxnr;
20374a4d8c2SCharles.Forsyth 
20474a4d8c2SCharles.Forsyth #define	R0ISZERO	(debug['0']==0)
20574a4d8c2SCharles.Forsyth 
20674a4d8c2SCharles.Forsyth extern	char*	anames[];
20774a4d8c2SCharles.Forsyth extern	Hintab	hintab[];
20874a4d8c2SCharles.Forsyth 
20974a4d8c2SCharles.Forsyth /*
21074a4d8c2SCharles.Forsyth  * sgen.c
21174a4d8c2SCharles.Forsyth  */
21274a4d8c2SCharles.Forsyth void	codgen(Node*, Node*);
21374a4d8c2SCharles.Forsyth void	gen(Node*);
21474a4d8c2SCharles.Forsyth void	usedset(Node*, int);
21574a4d8c2SCharles.Forsyth void	noretval(int);
21674a4d8c2SCharles.Forsyth void	xcom(Node*);
21774a4d8c2SCharles.Forsyth int	bcomplex(Node*, Node*);
21874a4d8c2SCharles.Forsyth 
21974a4d8c2SCharles.Forsyth /*
22074a4d8c2SCharles.Forsyth  * cgen.c
22174a4d8c2SCharles.Forsyth  */
22274a4d8c2SCharles.Forsyth void	cgen(Node*, Node*);
22374a4d8c2SCharles.Forsyth void	reglcgen(Node*, Node*, Node*);
22474a4d8c2SCharles.Forsyth void	lcgen(Node*, Node*);
22574a4d8c2SCharles.Forsyth void	bcgen(Node*, int);
22674a4d8c2SCharles.Forsyth void	boolgen(Node*, int, Node*);
22774a4d8c2SCharles.Forsyth void	sugen(Node*, Node*, long);
22874a4d8c2SCharles.Forsyth void	layout(Node*, Node*, int, int, Node*);
22974a4d8c2SCharles.Forsyth 
23074a4d8c2SCharles.Forsyth /*
23174a4d8c2SCharles.Forsyth  * txt.c
23274a4d8c2SCharles.Forsyth  */
23374a4d8c2SCharles.Forsyth void	ginit(void);
23474a4d8c2SCharles.Forsyth void	gclean(void);
23574a4d8c2SCharles.Forsyth void	nextpc(void);
23674a4d8c2SCharles.Forsyth void	gargs(Node*, Node*, Node*);
23774a4d8c2SCharles.Forsyth void	garg1(Node*, Node*, Node*, int, Node**);
23874a4d8c2SCharles.Forsyth Node*	nodconst(long);
23974a4d8c2SCharles.Forsyth Node*	nod32const(vlong);
24074a4d8c2SCharles.Forsyth Node*	nodfconst(double);
24174a4d8c2SCharles.Forsyth void	nodreg(Node*, Node*, int);
24274a4d8c2SCharles.Forsyth void	regret(Node*, Node*);
24374a4d8c2SCharles.Forsyth void	regalloc(Node*, Node*, Node*);
24474a4d8c2SCharles.Forsyth void	regfree(Node*);
24574a4d8c2SCharles.Forsyth void	regialloc(Node*, Node*, Node*);
24674a4d8c2SCharles.Forsyth void	regsalloc(Node*, Node*);
24774a4d8c2SCharles.Forsyth void	regaalloc1(Node*, Node*);
24874a4d8c2SCharles.Forsyth void	regaalloc(Node*, Node*);
24974a4d8c2SCharles.Forsyth void	regind(Node*, Node*);
25074a4d8c2SCharles.Forsyth void	gprep(Node*, Node*);
25174a4d8c2SCharles.Forsyth void	raddr(Node*, Prog*);
25274a4d8c2SCharles.Forsyth void	naddr(Node*, Adr*);
253d67b7dadSforsyth void	gloadhi(Node*, Node*, int);
254d67b7dadSforsyth void	gloadlo(Node*, Node*, int);
25574a4d8c2SCharles.Forsyth void	gmove(Node*, Node*);
25674a4d8c2SCharles.Forsyth void	gins(int a, Node*, Node*);
257d67b7dadSforsyth void	gins3(int a, Node*, Node*, Node*);
25874a4d8c2SCharles.Forsyth void	gopcode(int, Node*, Node*, Node*);
25974a4d8c2SCharles.Forsyth int	samaddr(Node*, Node*);
26074a4d8c2SCharles.Forsyth void	gbranch(int);
26174a4d8c2SCharles.Forsyth void	patch(Prog*, long);
26274a4d8c2SCharles.Forsyth int	sconst(Node*);
26374a4d8c2SCharles.Forsyth int	sval(long);
26474a4d8c2SCharles.Forsyth int	uconst(Node*);
265d67b7dadSforsyth long	hi64v(Node*);
266d67b7dadSforsyth long	lo64v(Node*);
267d67b7dadSforsyth Node*	hi64(Node*);
268d67b7dadSforsyth Node*	lo64(Node*);
26974a4d8c2SCharles.Forsyth void	gpseudo(int, Sym*, Node*);
27074a4d8c2SCharles.Forsyth 
27174a4d8c2SCharles.Forsyth /*
27274a4d8c2SCharles.Forsyth  * swt.c
27374a4d8c2SCharles.Forsyth  */
274*45a20ab7Sforsyth int	swcmp(void*, void*);
27574a4d8c2SCharles.Forsyth void	doswit(Node*);
276d67b7dadSforsyth void	swit1(C1*, int, long, Node*);
277d67b7dadSforsyth void	swit2(C1*, int, long, Node*, Node*);
278d67b7dadSforsyth void	casf(void);
27974a4d8c2SCharles.Forsyth void	bitload(Node*, Node*, Node*, Node*, Node*);
28074a4d8c2SCharles.Forsyth void	bitstore(Node*, Node*, Node*, Node*, Node*);
28174a4d8c2SCharles.Forsyth long	outstring(char*, long);
28274a4d8c2SCharles.Forsyth int	mulcon(Node*, Node*);
28374a4d8c2SCharles.Forsyth Multab*	mulcon0(Node*, long);
28474a4d8c2SCharles.Forsyth int	mulcon1(Node*, long, Node*);
28574a4d8c2SCharles.Forsyth void	nullwarn(Node*, Node*);
28674a4d8c2SCharles.Forsyth void	gextern(Sym*, Node*, long, long);
28774a4d8c2SCharles.Forsyth void	outcode(void);
28874a4d8c2SCharles.Forsyth void	ieeedtod(Ieee*, double);
28974a4d8c2SCharles.Forsyth 
29074a4d8c2SCharles.Forsyth /*
29174a4d8c2SCharles.Forsyth  * list
29274a4d8c2SCharles.Forsyth  */
29374a4d8c2SCharles.Forsyth void	listinit(void);
29474a4d8c2SCharles.Forsyth int	Pconv(Fmt*);
29574a4d8c2SCharles.Forsyth int	Aconv(Fmt*);
29674a4d8c2SCharles.Forsyth int	Dconv(Fmt*);
29774a4d8c2SCharles.Forsyth int	Sconv(Fmt*);
29874a4d8c2SCharles.Forsyth int	Nconv(Fmt*);
29974a4d8c2SCharles.Forsyth int	Bconv(Fmt*);
30074a4d8c2SCharles.Forsyth 
30174a4d8c2SCharles.Forsyth /*
30274a4d8c2SCharles.Forsyth  * reg.c
30374a4d8c2SCharles.Forsyth  */
30474a4d8c2SCharles.Forsyth Reg*	rega(void);
30574a4d8c2SCharles.Forsyth int	rcmp(void*, void*);
30674a4d8c2SCharles.Forsyth void	regopt(Prog*);
30774a4d8c2SCharles.Forsyth void	addmove(Reg*, int, int, int);
30874a4d8c2SCharles.Forsyth Bits	mkvar(Adr*, int);
30974a4d8c2SCharles.Forsyth void	prop(Reg*, Bits, Bits);
31074a4d8c2SCharles.Forsyth void	loopit(Reg*, long);
31174a4d8c2SCharles.Forsyth void	synch(Reg*, Bits);
31274a4d8c2SCharles.Forsyth ulong	allreg(ulong, Rgn*);
31374a4d8c2SCharles.Forsyth void	paint1(Reg*, int);
31474a4d8c2SCharles.Forsyth ulong	paint2(Reg*, int);
31574a4d8c2SCharles.Forsyth void	paint3(Reg*, int, long, int);
31674a4d8c2SCharles.Forsyth void	addreg(Adr*, int);
31774a4d8c2SCharles.Forsyth 
31874a4d8c2SCharles.Forsyth /*
31974a4d8c2SCharles.Forsyth  * peep.c
32074a4d8c2SCharles.Forsyth  */
32174a4d8c2SCharles.Forsyth void	peep(void);
32274a4d8c2SCharles.Forsyth void	excise(Reg*);
32374a4d8c2SCharles.Forsyth Reg*	uniqp(Reg*);
32474a4d8c2SCharles.Forsyth Reg*	uniqs(Reg*);
32574a4d8c2SCharles.Forsyth int	regtyp(Adr*);
32674a4d8c2SCharles.Forsyth int	regzer(Adr*);
32774a4d8c2SCharles.Forsyth int	anyvar(Adr*);
32874a4d8c2SCharles.Forsyth int	subprop(Reg*);
32974a4d8c2SCharles.Forsyth int	copyprop(Reg*);
33074a4d8c2SCharles.Forsyth int	copy1(Adr*, Adr*, Reg*, int);
33174a4d8c2SCharles.Forsyth int	copyu(Prog*, Adr*, Adr*);
33274a4d8c2SCharles.Forsyth 
33374a4d8c2SCharles.Forsyth int	copyas(Adr*, Adr*);
33474a4d8c2SCharles.Forsyth int	copyau(Adr*, Adr*);
33574a4d8c2SCharles.Forsyth int	copyau1(Prog*, Adr*);
33674a4d8c2SCharles.Forsyth int	copysub(Adr*, Adr*, Adr*, int);
33774a4d8c2SCharles.Forsyth int	copysub1(Prog*, Adr*, Adr*, int);
33874a4d8c2SCharles.Forsyth 
33974a4d8c2SCharles.Forsyth long	RtoB(int);
34074a4d8c2SCharles.Forsyth long	FtoB(int);
34174a4d8c2SCharles.Forsyth int	BtoR(long);
34274a4d8c2SCharles.Forsyth int	BtoF(long);
34374a4d8c2SCharles.Forsyth 
34474a4d8c2SCharles.Forsyth /*
34574a4d8c2SCharles.Forsyth  * com64.c
34674a4d8c2SCharles.Forsyth  */
34774a4d8c2SCharles.Forsyth int	com64(Node*);
34874a4d8c2SCharles.Forsyth void	com64init(void);
34974a4d8c2SCharles.Forsyth void	bool64(Node*);
35074a4d8c2SCharles.Forsyth 
35174a4d8c2SCharles.Forsyth #pragma	varargck	type	"A"	int
35274a4d8c2SCharles.Forsyth #pragma	varargck	type	"B"	Bits
35374a4d8c2SCharles.Forsyth #pragma	varargck	type	"D"	Adr*
35474a4d8c2SCharles.Forsyth #pragma	varargck	type	"N"	Adr*
35574a4d8c2SCharles.Forsyth #pragma	varargck	type	"P"	Prog*
35674a4d8c2SCharles.Forsyth #pragma	varargck	type	"S"	char*
357