xref: /inferno-os/utils/8c/gc.h (revision 45a20ab721a513710138340faff3d59a31c3e01e)
174a4d8c2SCharles.Forsyth #include	"../cc/cc.h"
274a4d8c2SCharles.Forsyth #include	"../8c/8.out.h"
374a4d8c2SCharles.Forsyth 
474a4d8c2SCharles.Forsyth /*
574a4d8c2SCharles.Forsyth  * 8c/386
674a4d8c2SCharles.Forsyth  * Intel 386
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	Var	Var;
2374a4d8c2SCharles.Forsyth typedef	struct	Reg	Reg;
2474a4d8c2SCharles.Forsyth typedef	struct	Rgn	Rgn;
2574a4d8c2SCharles.Forsyth typedef	struct	Renv	Renv;
2674a4d8c2SCharles.Forsyth 
2774a4d8c2SCharles.Forsyth EXTERN	struct
2874a4d8c2SCharles.Forsyth {
2974a4d8c2SCharles.Forsyth 	Node*	regtree;
3074a4d8c2SCharles.Forsyth 	Node*	basetree;
3174a4d8c2SCharles.Forsyth 	short	scale;
3274a4d8c2SCharles.Forsyth 	short	reg;
3374a4d8c2SCharles.Forsyth 	short	ptr;
3474a4d8c2SCharles.Forsyth } idx;
3574a4d8c2SCharles.Forsyth 
3674a4d8c2SCharles.Forsyth struct	Adr
3774a4d8c2SCharles.Forsyth {
3874a4d8c2SCharles.Forsyth 	long	offset;
3974a4d8c2SCharles.Forsyth 	double	dval;
4074a4d8c2SCharles.Forsyth 	char	sval[NSNAME];
4174a4d8c2SCharles.Forsyth 
4274a4d8c2SCharles.Forsyth 	Sym*	sym;
4374a4d8c2SCharles.Forsyth 	uchar	type;
4474a4d8c2SCharles.Forsyth 	uchar	index;
4574a4d8c2SCharles.Forsyth 	uchar	etype;
4674a4d8c2SCharles.Forsyth 	uchar	scale;	/* doubles as width in DATA op */
4774a4d8c2SCharles.Forsyth };
4874a4d8c2SCharles.Forsyth #define	A	((Adr*)0)
4974a4d8c2SCharles.Forsyth 
5074a4d8c2SCharles.Forsyth #define	INDEXED	9
5174a4d8c2SCharles.Forsyth struct	Prog
5274a4d8c2SCharles.Forsyth {
5374a4d8c2SCharles.Forsyth 	Adr	from;
5474a4d8c2SCharles.Forsyth 	Adr	to;
5574a4d8c2SCharles.Forsyth 	Prog*	link;
5674a4d8c2SCharles.Forsyth 	long	lineno;
5774a4d8c2SCharles.Forsyth 	short	as;
5874a4d8c2SCharles.Forsyth };
5974a4d8c2SCharles.Forsyth #define	P	((Prog*)0)
6074a4d8c2SCharles.Forsyth 
6174a4d8c2SCharles.Forsyth struct	Case
6274a4d8c2SCharles.Forsyth {
6374a4d8c2SCharles.Forsyth 	Case*	link;
64*45a20ab7Sforsyth 	vlong	val;
6574a4d8c2SCharles.Forsyth 	long	label;
6674a4d8c2SCharles.Forsyth 	char	def;
67c0927006Sforsyth 	char isv;
6874a4d8c2SCharles.Forsyth };
6974a4d8c2SCharles.Forsyth #define	C	((Case*)0)
7074a4d8c2SCharles.Forsyth 
7174a4d8c2SCharles.Forsyth struct	C1
7274a4d8c2SCharles.Forsyth {
73*45a20ab7Sforsyth 	vlong	val;
7474a4d8c2SCharles.Forsyth 	long	label;
7574a4d8c2SCharles.Forsyth };
7674a4d8c2SCharles.Forsyth 
7774a4d8c2SCharles.Forsyth struct	Var
7874a4d8c2SCharles.Forsyth {
7974a4d8c2SCharles.Forsyth 	long	offset;
8074a4d8c2SCharles.Forsyth 	Sym*	sym;
8174a4d8c2SCharles.Forsyth 	char	name;
8274a4d8c2SCharles.Forsyth 	char	etype;
8374a4d8c2SCharles.Forsyth };
8474a4d8c2SCharles.Forsyth 
8574a4d8c2SCharles.Forsyth struct	Reg
8674a4d8c2SCharles.Forsyth {
8774a4d8c2SCharles.Forsyth 	long	pc;
8874a4d8c2SCharles.Forsyth 	long	rpo;		/* reverse post ordering */
8974a4d8c2SCharles.Forsyth 
9074a4d8c2SCharles.Forsyth 	Bits	set;
9174a4d8c2SCharles.Forsyth 	Bits	use1;
9274a4d8c2SCharles.Forsyth 	Bits	use2;
9374a4d8c2SCharles.Forsyth 
9474a4d8c2SCharles.Forsyth 	Bits	refbehind;
9574a4d8c2SCharles.Forsyth 	Bits	refahead;
9674a4d8c2SCharles.Forsyth 	Bits	calbehind;
9774a4d8c2SCharles.Forsyth 	Bits	calahead;
9874a4d8c2SCharles.Forsyth 	Bits	regdiff;
9974a4d8c2SCharles.Forsyth 	Bits	act;
10074a4d8c2SCharles.Forsyth 
10174a4d8c2SCharles.Forsyth 	long	regu;
10274a4d8c2SCharles.Forsyth 	long	loop;		/* could be shorter */
10374a4d8c2SCharles.Forsyth 
10474a4d8c2SCharles.Forsyth 	Reg*	log5;
10574a4d8c2SCharles.Forsyth 	long	active;
10674a4d8c2SCharles.Forsyth 
10774a4d8c2SCharles.Forsyth 	Reg*	p1;
10874a4d8c2SCharles.Forsyth 	Reg*	p2;
10974a4d8c2SCharles.Forsyth 	Reg*	p2link;
11074a4d8c2SCharles.Forsyth 	Reg*	s1;
11174a4d8c2SCharles.Forsyth 	Reg*	s2;
11274a4d8c2SCharles.Forsyth 	Reg*	link;
11374a4d8c2SCharles.Forsyth 	Prog*	prog;
11474a4d8c2SCharles.Forsyth };
11574a4d8c2SCharles.Forsyth #define	R	((Reg*)0)
11674a4d8c2SCharles.Forsyth 
11774a4d8c2SCharles.Forsyth struct	Renv
11874a4d8c2SCharles.Forsyth {
11974a4d8c2SCharles.Forsyth 	int	safe;
12074a4d8c2SCharles.Forsyth 	Node	base;
12174a4d8c2SCharles.Forsyth 	Node*	saved;
12274a4d8c2SCharles.Forsyth 	Node*	scope;
12374a4d8c2SCharles.Forsyth };
12474a4d8c2SCharles.Forsyth 
12574a4d8c2SCharles.Forsyth #define	NRGN	600
12674a4d8c2SCharles.Forsyth struct	Rgn
12774a4d8c2SCharles.Forsyth {
12874a4d8c2SCharles.Forsyth 	Reg*	enter;
12974a4d8c2SCharles.Forsyth 	short	cost;
13074a4d8c2SCharles.Forsyth 	short	varno;
13174a4d8c2SCharles.Forsyth 	short	regno;
13274a4d8c2SCharles.Forsyth };
13374a4d8c2SCharles.Forsyth 
13474a4d8c2SCharles.Forsyth EXTERN	long	breakpc;
135c0927006Sforsyth EXTERN	long	nbreak;
13674a4d8c2SCharles.Forsyth EXTERN	Case*	cases;
13774a4d8c2SCharles.Forsyth EXTERN	Node	constnode;
13874a4d8c2SCharles.Forsyth EXTERN	Node	fconstnode;
13974a4d8c2SCharles.Forsyth EXTERN	long	continpc;
14074a4d8c2SCharles.Forsyth EXTERN	long	curarg;
14174a4d8c2SCharles.Forsyth EXTERN	long	cursafe;
14274a4d8c2SCharles.Forsyth EXTERN	Prog*	firstp;
14374a4d8c2SCharles.Forsyth EXTERN	Prog*	lastp;
14474a4d8c2SCharles.Forsyth EXTERN	long	maxargsafe;
14574a4d8c2SCharles.Forsyth EXTERN	int	mnstring;
14674a4d8c2SCharles.Forsyth EXTERN	Node*	nodrat;
14774a4d8c2SCharles.Forsyth EXTERN	Node*	nodret;
14874a4d8c2SCharles.Forsyth EXTERN	Node*	nodsafe;
14974a4d8c2SCharles.Forsyth EXTERN	long	nrathole;
15074a4d8c2SCharles.Forsyth EXTERN	long	nstring;
15174a4d8c2SCharles.Forsyth EXTERN	Prog*	p;
15274a4d8c2SCharles.Forsyth EXTERN	long	pc;
15374a4d8c2SCharles.Forsyth EXTERN	Node	regnode;
15474a4d8c2SCharles.Forsyth EXTERN	Node	fregnode0;
15574a4d8c2SCharles.Forsyth EXTERN	Node	fregnode1;
15674a4d8c2SCharles.Forsyth EXTERN	char	string[NSNAME];
15774a4d8c2SCharles.Forsyth EXTERN	Sym*	symrathole;
15874a4d8c2SCharles.Forsyth EXTERN	Node	znode;
15974a4d8c2SCharles.Forsyth EXTERN	Prog	zprog;
16074a4d8c2SCharles.Forsyth EXTERN	int	reg[D_NONE];
16174a4d8c2SCharles.Forsyth EXTERN	long	exregoffset;
16274a4d8c2SCharles.Forsyth EXTERN	long	exfregoffset;
16374a4d8c2SCharles.Forsyth 
16474a4d8c2SCharles.Forsyth #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
16574a4d8c2SCharles.Forsyth #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
16674a4d8c2SCharles.Forsyth #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
16774a4d8c2SCharles.Forsyth #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
16874a4d8c2SCharles.Forsyth 
16974a4d8c2SCharles.Forsyth #define	bset(a,n)	((a).b[(n)/32]&(1L<<(n)%32))
17074a4d8c2SCharles.Forsyth 
17174a4d8c2SCharles.Forsyth #define	CLOAD	5
17274a4d8c2SCharles.Forsyth #define	CREF	5
17374a4d8c2SCharles.Forsyth #define	CINF	1000
17474a4d8c2SCharles.Forsyth #define	LOOP	3
17574a4d8c2SCharles.Forsyth 
17674a4d8c2SCharles.Forsyth EXTERN	Rgn	region[NRGN];
17774a4d8c2SCharles.Forsyth EXTERN	Rgn*	rgp;
17874a4d8c2SCharles.Forsyth EXTERN	int	nregion;
17974a4d8c2SCharles.Forsyth EXTERN	int	nvar;
18074a4d8c2SCharles.Forsyth 
18174a4d8c2SCharles.Forsyth EXTERN	Bits	externs;
18274a4d8c2SCharles.Forsyth EXTERN	Bits	params;
18374a4d8c2SCharles.Forsyth EXTERN	Bits	consts;
18474a4d8c2SCharles.Forsyth EXTERN	Bits	addrs;
18574a4d8c2SCharles.Forsyth 
18674a4d8c2SCharles.Forsyth EXTERN	long	regbits;
18774a4d8c2SCharles.Forsyth EXTERN	long	exregbits;
18874a4d8c2SCharles.Forsyth 
18974a4d8c2SCharles.Forsyth EXTERN	int	change;
19074a4d8c2SCharles.Forsyth EXTERN	int	suppress;
19174a4d8c2SCharles.Forsyth 
19274a4d8c2SCharles.Forsyth EXTERN	Reg*	firstr;
19374a4d8c2SCharles.Forsyth EXTERN	Reg*	lastr;
19474a4d8c2SCharles.Forsyth EXTERN	Reg	zreg;
19574a4d8c2SCharles.Forsyth EXTERN	Reg*	freer;
19674a4d8c2SCharles.Forsyth EXTERN	Var	var[NVAR];
19774a4d8c2SCharles.Forsyth EXTERN	long*	idom;
19874a4d8c2SCharles.Forsyth EXTERN	Reg**	rpo2r;
19974a4d8c2SCharles.Forsyth EXTERN	long	maxnr;
20074a4d8c2SCharles.Forsyth 
20174a4d8c2SCharles.Forsyth extern	char*	anames[];
20274a4d8c2SCharles.Forsyth 
20374a4d8c2SCharles.Forsyth /*
20474a4d8c2SCharles.Forsyth  * sgen.c
20574a4d8c2SCharles.Forsyth  */
20674a4d8c2SCharles.Forsyth void	codgen(Node*, Node*);
20774a4d8c2SCharles.Forsyth void	gen(Node*);
20874a4d8c2SCharles.Forsyth void	noretval(int);
20974a4d8c2SCharles.Forsyth void	usedset(Node*, int);
21074a4d8c2SCharles.Forsyth void	xcom(Node*);
21174a4d8c2SCharles.Forsyth void	indx(Node*);
21274a4d8c2SCharles.Forsyth int	bcomplex(Node*, Node*);
21374a4d8c2SCharles.Forsyth 
21474a4d8c2SCharles.Forsyth /*
21574a4d8c2SCharles.Forsyth  * cgen.c
21674a4d8c2SCharles.Forsyth  */
21774a4d8c2SCharles.Forsyth void	zeroregm(Node*);
21874a4d8c2SCharles.Forsyth void	cgen(Node*, Node*);
21974a4d8c2SCharles.Forsyth void	reglcgen(Node*, Node*, Node*);
22074a4d8c2SCharles.Forsyth void	lcgen(Node*, Node*);
22174a4d8c2SCharles.Forsyth void	bcgen(Node*, int);
22274a4d8c2SCharles.Forsyth void	boolgen(Node*, int, Node*);
22374a4d8c2SCharles.Forsyth void	sugen(Node*, Node*, long);
22474a4d8c2SCharles.Forsyth int	needreg(Node*, int);
22574a4d8c2SCharles.Forsyth 
22674a4d8c2SCharles.Forsyth /*
22774a4d8c2SCharles.Forsyth  * cgen64.c
22874a4d8c2SCharles.Forsyth  */
22974a4d8c2SCharles.Forsyth int	vaddr(Node*, int);
23074a4d8c2SCharles.Forsyth void	loadpair(Node*, Node*);
23174a4d8c2SCharles.Forsyth int	cgen64(Node*, Node*);
23274a4d8c2SCharles.Forsyth void	testv(Node*, int);
23374a4d8c2SCharles.Forsyth 
23474a4d8c2SCharles.Forsyth /*
23574a4d8c2SCharles.Forsyth  * txt.c
23674a4d8c2SCharles.Forsyth  */
23774a4d8c2SCharles.Forsyth void	ginit(void);
23874a4d8c2SCharles.Forsyth void	gclean(void);
23974a4d8c2SCharles.Forsyth void	nextpc(void);
24074a4d8c2SCharles.Forsyth void	gargs(Node*, Node*, Node*);
24174a4d8c2SCharles.Forsyth void	garg1(Node*, Node*, Node*, int, Node**);
24274a4d8c2SCharles.Forsyth Node*	nodconst(long);
243*45a20ab7Sforsyth int	nareg(int);
24474a4d8c2SCharles.Forsyth Node*	nodfconst(double);
24574a4d8c2SCharles.Forsyth int	nodreg(Node*, Node*, int);
24674a4d8c2SCharles.Forsyth int	isreg(Node*, int);
24774a4d8c2SCharles.Forsyth void	regret(Node*, Node*);
24874a4d8c2SCharles.Forsyth void	regalloc(Node*, Node*, Node*);
24974a4d8c2SCharles.Forsyth void	regfree(Node*);
25074a4d8c2SCharles.Forsyth void	regialloc(Node*, Node*, Node*);
25174a4d8c2SCharles.Forsyth void	regsalloc(Node*, Node*);
25274a4d8c2SCharles.Forsyth void	regaalloc1(Node*, Node*);
25374a4d8c2SCharles.Forsyth void	regaalloc(Node*, Node*);
25474a4d8c2SCharles.Forsyth void	regind(Node*, Node*);
25574a4d8c2SCharles.Forsyth void	gprep(Node*, Node*);
25674a4d8c2SCharles.Forsyth void	naddr(Node*, Adr*);
25774a4d8c2SCharles.Forsyth void	gmove(Node*, Node*);
25874a4d8c2SCharles.Forsyth void	gins(int a, Node*, Node*);
25974a4d8c2SCharles.Forsyth void	fgopcode(int, Node*, Node*, int, int);
26074a4d8c2SCharles.Forsyth void	gopcode(int, Type*, Node*, Node*);
26174a4d8c2SCharles.Forsyth int	samaddr(Node*, Node*);
26274a4d8c2SCharles.Forsyth void	gbranch(int);
26374a4d8c2SCharles.Forsyth void	patch(Prog*, long);
26474a4d8c2SCharles.Forsyth int	sconst(Node*);
26574a4d8c2SCharles.Forsyth void	gpseudo(int, Sym*, Node*);
26674a4d8c2SCharles.Forsyth 
26774a4d8c2SCharles.Forsyth /*
26874a4d8c2SCharles.Forsyth  * swt.c
26974a4d8c2SCharles.Forsyth  */
270*45a20ab7Sforsyth int	swcmp(void*, void*);
27174a4d8c2SCharles.Forsyth void	doswit(Node*);
27274a4d8c2SCharles.Forsyth void	swit1(C1*, int, long, Node*);
273d67b7dadSforsyth void	casf(void);
27474a4d8c2SCharles.Forsyth void	bitload(Node*, Node*, Node*, Node*, Node*);
27574a4d8c2SCharles.Forsyth void	bitstore(Node*, Node*, Node*, Node*, Node*);
27674a4d8c2SCharles.Forsyth long	outstring(char*, long);
27774a4d8c2SCharles.Forsyth void	nullwarn(Node*, Node*);
27874a4d8c2SCharles.Forsyth void	gextern(Sym*, Node*, long, long);
27974a4d8c2SCharles.Forsyth void	outcode(void);
28074a4d8c2SCharles.Forsyth void	ieeedtod(Ieee*, double);
28174a4d8c2SCharles.Forsyth 
28274a4d8c2SCharles.Forsyth /*
28374a4d8c2SCharles.Forsyth  * list
28474a4d8c2SCharles.Forsyth  */
28574a4d8c2SCharles.Forsyth void	listinit(void);
28674a4d8c2SCharles.Forsyth int	Pconv(Fmt*);
28774a4d8c2SCharles.Forsyth int	Aconv(Fmt*);
28874a4d8c2SCharles.Forsyth int	Dconv(Fmt*);
28974a4d8c2SCharles.Forsyth int	Sconv(Fmt*);
29074a4d8c2SCharles.Forsyth int	Rconv(Fmt*);
29174a4d8c2SCharles.Forsyth int	Xconv(Fmt*);
29274a4d8c2SCharles.Forsyth int	Bconv(Fmt*);
29374a4d8c2SCharles.Forsyth 
29474a4d8c2SCharles.Forsyth /*
29574a4d8c2SCharles.Forsyth  * reg.c
29674a4d8c2SCharles.Forsyth  */
29774a4d8c2SCharles.Forsyth Reg*	rega(void);
298*45a20ab7Sforsyth int	rcmp(void*, void*);
29974a4d8c2SCharles.Forsyth void	regopt(Prog*);
30074a4d8c2SCharles.Forsyth void	addmove(Reg*, int, int, int);
301*45a20ab7Sforsyth Bits	mkvar(Reg*, Adr*, int);
30274a4d8c2SCharles.Forsyth void	prop(Reg*, Bits, Bits);
30374a4d8c2SCharles.Forsyth void	loopit(Reg*, long);
30474a4d8c2SCharles.Forsyth void	synch(Reg*, Bits);
30574a4d8c2SCharles.Forsyth ulong	allreg(ulong, Rgn*);
30674a4d8c2SCharles.Forsyth void	paint1(Reg*, int);
30774a4d8c2SCharles.Forsyth ulong	paint2(Reg*, int);
30874a4d8c2SCharles.Forsyth void	paint3(Reg*, int, long, int);
30974a4d8c2SCharles.Forsyth void	addreg(Adr*, int);
31074a4d8c2SCharles.Forsyth 
31174a4d8c2SCharles.Forsyth /*
31274a4d8c2SCharles.Forsyth  * peep.c
31374a4d8c2SCharles.Forsyth  */
31474a4d8c2SCharles.Forsyth void	peep(void);
31574a4d8c2SCharles.Forsyth void	excise(Reg*);
31674a4d8c2SCharles.Forsyth Reg*	uniqp(Reg*);
31774a4d8c2SCharles.Forsyth Reg*	uniqs(Reg*);
31874a4d8c2SCharles.Forsyth int	regtyp(Adr*);
31974a4d8c2SCharles.Forsyth int	anyvar(Adr*);
32074a4d8c2SCharles.Forsyth int	subprop(Reg*);
32174a4d8c2SCharles.Forsyth int	copyprop(Reg*);
32274a4d8c2SCharles.Forsyth int	copy1(Adr*, Adr*, Reg*, int);
32374a4d8c2SCharles.Forsyth int	copyu(Prog*, Adr*, Adr*);
32474a4d8c2SCharles.Forsyth 
32574a4d8c2SCharles.Forsyth int	copyas(Adr*, Adr*);
32674a4d8c2SCharles.Forsyth int	copyau(Adr*, Adr*);
32774a4d8c2SCharles.Forsyth int	copysub(Adr*, Adr*, Adr*, int);
32874a4d8c2SCharles.Forsyth int	copysub1(Prog*, Adr*, Adr*, int);
32974a4d8c2SCharles.Forsyth 
33074a4d8c2SCharles.Forsyth long	RtoB(int);
33174a4d8c2SCharles.Forsyth long	FtoB(int);
33274a4d8c2SCharles.Forsyth int	BtoR(long);
33374a4d8c2SCharles.Forsyth int	BtoF(long);
33474a4d8c2SCharles.Forsyth 
33574a4d8c2SCharles.Forsyth #define	D_HI	D_NONE
33674a4d8c2SCharles.Forsyth #define	D_LO	D_NONE
33774a4d8c2SCharles.Forsyth 
33874a4d8c2SCharles.Forsyth /*
33974a4d8c2SCharles.Forsyth  * com64
34074a4d8c2SCharles.Forsyth  */
34174a4d8c2SCharles.Forsyth int	cond(int);
34274a4d8c2SCharles.Forsyth int	com64(Node*);
34374a4d8c2SCharles.Forsyth void	com64init(void);
34474a4d8c2SCharles.Forsyth void	bool64(Node*);
34574a4d8c2SCharles.Forsyth long	lo64v(Node*);
34674a4d8c2SCharles.Forsyth long	hi64v(Node*);
34774a4d8c2SCharles.Forsyth Node*	lo64(Node*);
34874a4d8c2SCharles.Forsyth Node*	hi64(Node*);
34974a4d8c2SCharles.Forsyth 
35074a4d8c2SCharles.Forsyth /*
35174a4d8c2SCharles.Forsyth  * div/mul
35274a4d8c2SCharles.Forsyth  */
35374a4d8c2SCharles.Forsyth void	sdivgen(Node*, Node*, Node*, Node*);
35474a4d8c2SCharles.Forsyth void	udivgen(Node*, Node*, Node*, Node*);
35574a4d8c2SCharles.Forsyth void	sdiv2(long, int, Node*, Node*);
35674a4d8c2SCharles.Forsyth void	smod2(long, int, Node*, Node*);
35774a4d8c2SCharles.Forsyth void	mulgen(Type*, Node*, Node*);
35874a4d8c2SCharles.Forsyth void	genmuladd(Node*, Node*, int, Node*);
35974a4d8c2SCharles.Forsyth void	shiftit(Type*, Node*, Node*);
36074a4d8c2SCharles.Forsyth 
36174a4d8c2SCharles.Forsyth #pragma	varargck	type	"A"	int
36274a4d8c2SCharles.Forsyth #pragma	varargck	type	"B"	Bits
36374a4d8c2SCharles.Forsyth #pragma	varargck	type	"D"	Adr*
36474a4d8c2SCharles.Forsyth #pragma	varargck	type	"P"	Prog*
36574a4d8c2SCharles.Forsyth #pragma	varargck	type	"R"	int
36674a4d8c2SCharles.Forsyth #pragma	varargck	type	"S"	char*
36774a4d8c2SCharles.Forsyth 
36874a4d8c2SCharles.Forsyth /* wrecklessly steal a field */
36974a4d8c2SCharles.Forsyth 
37074a4d8c2SCharles.Forsyth #define	rplink	label
371