xref: /plan9-contrib/sys/src/cmd/9l/sched.c (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
1*fbadb1c4SDavid du Colombier #include	"l.h"
2*fbadb1c4SDavid du Colombier 
3*fbadb1c4SDavid du Colombier enum
4*fbadb1c4SDavid du Colombier {
5*fbadb1c4SDavid du Colombier 	E_ICC	= 1<<0,
6*fbadb1c4SDavid du Colombier 	E_FCC	= 1<<1,
7*fbadb1c4SDavid du Colombier 	E_MEM	= 1<<2,
8*fbadb1c4SDavid du Colombier 	E_MEMSP	= 1<<3,	/* uses offset and size */
9*fbadb1c4SDavid du Colombier 	E_MEMSB	= 1<<4,	/* uses offset and size */
10*fbadb1c4SDavid du Colombier 	E_LR	= 1<<5,
11*fbadb1c4SDavid du Colombier 	E_CR = 1<<6,
12*fbadb1c4SDavid du Colombier 	E_CTR = 1<<7,
13*fbadb1c4SDavid du Colombier 	E_XER = 1<<8,
14*fbadb1c4SDavid du Colombier 
15*fbadb1c4SDavid du Colombier 	E_CR0 = 0xF<<0,
16*fbadb1c4SDavid du Colombier 	E_CR1 = 0xF<<4,
17*fbadb1c4SDavid du Colombier 
18*fbadb1c4SDavid du Colombier 	ANYMEM	= E_MEM|E_MEMSP|E_MEMSB,
19*fbadb1c4SDavid du Colombier 	ALL	= ~0,
20*fbadb1c4SDavid du Colombier };
21*fbadb1c4SDavid du Colombier 
22*fbadb1c4SDavid du Colombier typedef	struct	Sch	Sch;
23*fbadb1c4SDavid du Colombier typedef	struct	Dep	Dep;
24*fbadb1c4SDavid du Colombier 
25*fbadb1c4SDavid du Colombier struct	Dep
26*fbadb1c4SDavid du Colombier {
27*fbadb1c4SDavid du Colombier 	ulong	ireg;
28*fbadb1c4SDavid du Colombier 	ulong	freg;
29*fbadb1c4SDavid du Colombier 	ulong	cc;
30*fbadb1c4SDavid du Colombier 	ulong	cr;
31*fbadb1c4SDavid du Colombier };
32*fbadb1c4SDavid du Colombier struct	Sch
33*fbadb1c4SDavid du Colombier {
34*fbadb1c4SDavid du Colombier 	Prog	p;
35*fbadb1c4SDavid du Colombier 	Dep	set;
36*fbadb1c4SDavid du Colombier 	Dep	used;
37*fbadb1c4SDavid du Colombier 	long	soffset;
38*fbadb1c4SDavid du Colombier 	char	size;
39*fbadb1c4SDavid du Colombier 	char	comp;
40*fbadb1c4SDavid du Colombier };
41*fbadb1c4SDavid du Colombier 
42*fbadb1c4SDavid du Colombier void	regused(Sch*, Prog*);
43*fbadb1c4SDavid du Colombier int	depend(Sch*, Sch*);
44*fbadb1c4SDavid du Colombier int	conflict(Sch*, Sch*);
45*fbadb1c4SDavid du Colombier int	offoverlap(Sch*, Sch*);
46*fbadb1c4SDavid du Colombier void	dumpbits(Sch*, Dep*);
47*fbadb1c4SDavid du Colombier 
48*fbadb1c4SDavid du Colombier void
sched(Prog * p0,Prog * pe)49*fbadb1c4SDavid du Colombier sched(Prog *p0, Prog *pe)
50*fbadb1c4SDavid du Colombier {
51*fbadb1c4SDavid du Colombier 	Prog *p, *q;
52*fbadb1c4SDavid du Colombier 	Sch sch[NSCHED], *s, *t, *u, *se, stmp;
53*fbadb1c4SDavid du Colombier 
54*fbadb1c4SDavid du Colombier 	if(!debug['Q'])
55*fbadb1c4SDavid du Colombier 		return;
56*fbadb1c4SDavid du Colombier 	/*
57*fbadb1c4SDavid du Colombier 	 * build side structure
58*fbadb1c4SDavid du Colombier 	 */
59*fbadb1c4SDavid du Colombier 	s = sch;
60*fbadb1c4SDavid du Colombier 	for(p=p0;; p=p->link) {
61*fbadb1c4SDavid du Colombier 		memset(s, 0, sizeof(*s));
62*fbadb1c4SDavid du Colombier 		s->p = *p;
63*fbadb1c4SDavid du Colombier 		regused(s, p);
64*fbadb1c4SDavid du Colombier 		if(debug['X']) {
65*fbadb1c4SDavid du Colombier 			Bprint(&bso, "%P\tset", &s->p);
66*fbadb1c4SDavid du Colombier 			dumpbits(s, &s->set);
67*fbadb1c4SDavid du Colombier 			Bprint(&bso, "; used");
68*fbadb1c4SDavid du Colombier 			dumpbits(s, &s->used);
69*fbadb1c4SDavid du Colombier 			if(s->comp)
70*fbadb1c4SDavid du Colombier 				Bprint(&bso, "; compound");
71*fbadb1c4SDavid du Colombier 			if(s->p.mark & LOAD)
72*fbadb1c4SDavid du Colombier 				Bprint(&bso, "; load");
73*fbadb1c4SDavid du Colombier 			if(s->p.mark & BRANCH)
74*fbadb1c4SDavid du Colombier 				Bprint(&bso, "; branch");
75*fbadb1c4SDavid du Colombier 			if(s->p.mark & FCMP)
76*fbadb1c4SDavid du Colombier 				Bprint(&bso, "; fcmp");
77*fbadb1c4SDavid du Colombier 			Bprint(&bso, "\n");
78*fbadb1c4SDavid du Colombier 		}
79*fbadb1c4SDavid du Colombier 		s++;
80*fbadb1c4SDavid du Colombier 		if(p == pe)
81*fbadb1c4SDavid du Colombier 			break;
82*fbadb1c4SDavid du Colombier 	}
83*fbadb1c4SDavid du Colombier 	se = s;
84*fbadb1c4SDavid du Colombier 
85*fbadb1c4SDavid du Colombier 	for(s=se-1; s>=sch; s--) {
86*fbadb1c4SDavid du Colombier 
87*fbadb1c4SDavid du Colombier 		/*
88*fbadb1c4SDavid du Colombier 		 * load delay. interlocked.
89*fbadb1c4SDavid du Colombier 		 */
90*fbadb1c4SDavid du Colombier 		if(s->p.mark & LOAD) {
91*fbadb1c4SDavid du Colombier 			if(s >= se-1)
92*fbadb1c4SDavid du Colombier 				continue;
93*fbadb1c4SDavid du Colombier 			if(!conflict(s, (s+1)))
94*fbadb1c4SDavid du Colombier 				continue;
95*fbadb1c4SDavid du Colombier 			/*
96*fbadb1c4SDavid du Colombier 			 * s is load, s+1 is immediate use of result
97*fbadb1c4SDavid du Colombier 			 * t is the trial instruction to insert between s and s+1
98*fbadb1c4SDavid du Colombier 			 */
99*fbadb1c4SDavid du Colombier 			for(t=s-1; t>=sch; t--) {
100*fbadb1c4SDavid du Colombier 				if(t->p.mark & BRANCH)
101*fbadb1c4SDavid du Colombier 					goto no2;
102*fbadb1c4SDavid du Colombier 				if(t->p.mark & FCMP)
103*fbadb1c4SDavid du Colombier 					if((s+1)->p.mark & BRANCH)
104*fbadb1c4SDavid du Colombier 						goto no2;
105*fbadb1c4SDavid du Colombier 				if(t->p.mark & LOAD)
106*fbadb1c4SDavid du Colombier 					if(conflict(t, (s+1)))
107*fbadb1c4SDavid du Colombier 						goto no2;
108*fbadb1c4SDavid du Colombier 				for(u=t+1; u<=s; u++)
109*fbadb1c4SDavid du Colombier 					if(depend(u, t))
110*fbadb1c4SDavid du Colombier 						goto no2;
111*fbadb1c4SDavid du Colombier 				goto out2;
112*fbadb1c4SDavid du Colombier 			no2:;
113*fbadb1c4SDavid du Colombier 			}
114*fbadb1c4SDavid du Colombier 			if(debug['X'])
115*fbadb1c4SDavid du Colombier 				Bprint(&bso, "?l%P\n", &s->p);
116*fbadb1c4SDavid du Colombier 			continue;
117*fbadb1c4SDavid du Colombier 		out2:
118*fbadb1c4SDavid du Colombier 			if(debug['X']) {
119*fbadb1c4SDavid du Colombier 				Bprint(&bso, "!l%P\n", &t->p);
120*fbadb1c4SDavid du Colombier 				Bprint(&bso, "%P\n", &s->p);
121*fbadb1c4SDavid du Colombier 			}
122*fbadb1c4SDavid du Colombier 			stmp = *t;
123*fbadb1c4SDavid du Colombier 			memmove(t, t+1, (uchar*)s - (uchar*)t);
124*fbadb1c4SDavid du Colombier 			*s = stmp;
125*fbadb1c4SDavid du Colombier 			s--;
126*fbadb1c4SDavid du Colombier 			continue;
127*fbadb1c4SDavid du Colombier 		}
128*fbadb1c4SDavid du Colombier 
129*fbadb1c4SDavid du Colombier 		/*
130*fbadb1c4SDavid du Colombier 		 * fop2 delay.
131*fbadb1c4SDavid du Colombier 		 */
132*fbadb1c4SDavid du Colombier 		if(s->p.mark & FCMP) {
133*fbadb1c4SDavid du Colombier 			if(s >= se-1)
134*fbadb1c4SDavid du Colombier 				continue;
135*fbadb1c4SDavid du Colombier 			if(!((s+1)->p.mark & BRANCH))
136*fbadb1c4SDavid du Colombier 				continue;
137*fbadb1c4SDavid du Colombier 			/* t is the trial instruction to use */
138*fbadb1c4SDavid du Colombier 			for(t=s-1; t>=sch; t--) {
139*fbadb1c4SDavid du Colombier 				for(u=t+1; u<=s; u++)
140*fbadb1c4SDavid du Colombier 					if(depend(u, t))
141*fbadb1c4SDavid du Colombier 						goto no3;
142*fbadb1c4SDavid du Colombier 				goto out3;
143*fbadb1c4SDavid du Colombier 			no3:;
144*fbadb1c4SDavid du Colombier 			}
145*fbadb1c4SDavid du Colombier 			if(debug['X'])
146*fbadb1c4SDavid du Colombier 				Bprint(&bso, "?f%P\n", &s->p);
147*fbadb1c4SDavid du Colombier 			continue;
148*fbadb1c4SDavid du Colombier 		out3:
149*fbadb1c4SDavid du Colombier 			if(debug['X']) {
150*fbadb1c4SDavid du Colombier 				Bprint(&bso, "!f%P\n", &t->p);
151*fbadb1c4SDavid du Colombier 				Bprint(&bso, "%P\n", &s->p);
152*fbadb1c4SDavid du Colombier 			}
153*fbadb1c4SDavid du Colombier 			stmp = *t;
154*fbadb1c4SDavid du Colombier 			memmove(t, t+1, (uchar*)s - (uchar*)t);
155*fbadb1c4SDavid du Colombier 			*s = stmp;
156*fbadb1c4SDavid du Colombier 			s--;
157*fbadb1c4SDavid du Colombier 			continue;
158*fbadb1c4SDavid du Colombier 		}
159*fbadb1c4SDavid du Colombier 	}
160*fbadb1c4SDavid du Colombier 
161*fbadb1c4SDavid du Colombier 	/*
162*fbadb1c4SDavid du Colombier 	 * put it all back
163*fbadb1c4SDavid du Colombier 	 */
164*fbadb1c4SDavid du Colombier 	for(s=sch, p=p0; s<se; s++, p=q) {
165*fbadb1c4SDavid du Colombier 		q = p->link;
166*fbadb1c4SDavid du Colombier 		if(q != s->p.link) {
167*fbadb1c4SDavid du Colombier 			*p = s->p;
168*fbadb1c4SDavid du Colombier 			p->link = q;
169*fbadb1c4SDavid du Colombier 		}
170*fbadb1c4SDavid du Colombier 	}
171*fbadb1c4SDavid du Colombier 	if(debug['X'])
172*fbadb1c4SDavid du Colombier 		Bprint(&bso, "\n");
173*fbadb1c4SDavid du Colombier }
174*fbadb1c4SDavid du Colombier 
175*fbadb1c4SDavid du Colombier void
regused(Sch * s,Prog * realp)176*fbadb1c4SDavid du Colombier regused(Sch *s, Prog *realp)
177*fbadb1c4SDavid du Colombier {
178*fbadb1c4SDavid du Colombier 	int c, ar, ad, ld, sz, nr, upd;
179*fbadb1c4SDavid du Colombier 	ulong m;
180*fbadb1c4SDavid du Colombier 	Prog *p;
181*fbadb1c4SDavid du Colombier 
182*fbadb1c4SDavid du Colombier 	p = &s->p;
183*fbadb1c4SDavid du Colombier 	s->comp = compound(p);
184*fbadb1c4SDavid du Colombier 	if(s->comp) {
185*fbadb1c4SDavid du Colombier 		s->set.ireg |= 1<<REGTMP;
186*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGTMP;
187*fbadb1c4SDavid du Colombier 	}
188*fbadb1c4SDavid du Colombier 	ar = 0;		/* dest is really reference */
189*fbadb1c4SDavid du Colombier 	ad = 0;		/* source/dest is really address */
190*fbadb1c4SDavid du Colombier 	ld = 0;		/* opcode is load instruction */
191*fbadb1c4SDavid du Colombier 	sz = 32*4;		/* size of load/store for overlap computation */
192*fbadb1c4SDavid du Colombier 	nr = 0;	/* source/dest is not really reg */
193*fbadb1c4SDavid du Colombier 	upd = 0;	/* move with update; changes reg */
194*fbadb1c4SDavid du Colombier 
195*fbadb1c4SDavid du Colombier /*
196*fbadb1c4SDavid du Colombier  * flags based on opcode
197*fbadb1c4SDavid du Colombier  */
198*fbadb1c4SDavid du Colombier 	switch(p->as) {
199*fbadb1c4SDavid du Colombier 	case ATEXT:
200*fbadb1c4SDavid du Colombier 		curtext = realp;
201*fbadb1c4SDavid du Colombier 		autosize = p->to.offset + 8;
202*fbadb1c4SDavid du Colombier 		ad = 1;
203*fbadb1c4SDavid du Colombier 		break;
204*fbadb1c4SDavid du Colombier 	case ABL:
205*fbadb1c4SDavid du Colombier 		s->set.cc |= E_LR;
206*fbadb1c4SDavid du Colombier 		ar = 1;
207*fbadb1c4SDavid du Colombier 		ad = 1;
208*fbadb1c4SDavid du Colombier 		break;
209*fbadb1c4SDavid du Colombier 	case ABR:
210*fbadb1c4SDavid du Colombier 		ar = 1;
211*fbadb1c4SDavid du Colombier 		ad = 1;
212*fbadb1c4SDavid du Colombier 		break;
213*fbadb1c4SDavid du Colombier 	case ACMP:
214*fbadb1c4SDavid du Colombier 	case ACMPU:
215*fbadb1c4SDavid du Colombier 	case ACMPW:
216*fbadb1c4SDavid du Colombier 	case ACMPWU:
217*fbadb1c4SDavid du Colombier 		s->set.cc |= E_ICC;
218*fbadb1c4SDavid du Colombier 		if(p->reg == 0)
219*fbadb1c4SDavid du Colombier 			s->set.cr |= E_CR0;
220*fbadb1c4SDavid du Colombier 		else
221*fbadb1c4SDavid du Colombier 			s->set.cr |= (0xF<<((p->reg&7)*4));
222*fbadb1c4SDavid du Colombier 		ar = 1;
223*fbadb1c4SDavid du Colombier 		break;
224*fbadb1c4SDavid du Colombier 	case AFCMPO:
225*fbadb1c4SDavid du Colombier 	case AFCMPU:
226*fbadb1c4SDavid du Colombier 		s->set.cc |= E_FCC;
227*fbadb1c4SDavid du Colombier 		if(p->reg == 0)
228*fbadb1c4SDavid du Colombier 			s->set.cr |= E_CR0;
229*fbadb1c4SDavid du Colombier 		else
230*fbadb1c4SDavid du Colombier 			s->set.cr |= (0xF<<((p->reg&7)*4));
231*fbadb1c4SDavid du Colombier 		ar = 1;
232*fbadb1c4SDavid du Colombier 		break;
233*fbadb1c4SDavid du Colombier 	case ACRAND:
234*fbadb1c4SDavid du Colombier 	case ACRANDN:
235*fbadb1c4SDavid du Colombier 	case ACREQV:
236*fbadb1c4SDavid du Colombier 	case ACRNAND:
237*fbadb1c4SDavid du Colombier 	case ACRNOR:
238*fbadb1c4SDavid du Colombier 	case ACROR:
239*fbadb1c4SDavid du Colombier 	case ACRORN:
240*fbadb1c4SDavid du Colombier 	case ACRXOR:
241*fbadb1c4SDavid du Colombier 		s->used.cr |= 1<<p->from.reg;
242*fbadb1c4SDavid du Colombier 		s->set.cr |= 1<<p->to.reg;
243*fbadb1c4SDavid du Colombier 		nr = 1;
244*fbadb1c4SDavid du Colombier 		break;
245*fbadb1c4SDavid du Colombier 	case ABCL:	/* tricky */
246*fbadb1c4SDavid du Colombier 		s->used.cc |= E_FCC|E_ICC;
247*fbadb1c4SDavid du Colombier 		s->used.cr = ALL;
248*fbadb1c4SDavid du Colombier 		s->set.cc |= E_LR;
249*fbadb1c4SDavid du Colombier 		ar = 1;
250*fbadb1c4SDavid du Colombier 		break;
251*fbadb1c4SDavid du Colombier 	case ABC:		/* tricky */
252*fbadb1c4SDavid du Colombier 		s->used.cc |= E_FCC|E_ICC;
253*fbadb1c4SDavid du Colombier 		s->used.cr = ALL;
254*fbadb1c4SDavid du Colombier 		ar = 1;
255*fbadb1c4SDavid du Colombier 		break;
256*fbadb1c4SDavid du Colombier 	case ABEQ:
257*fbadb1c4SDavid du Colombier 	case ABGE:
258*fbadb1c4SDavid du Colombier 	case ABGT:
259*fbadb1c4SDavid du Colombier 	case ABLE:
260*fbadb1c4SDavid du Colombier 	case ABLT:
261*fbadb1c4SDavid du Colombier 	case ABNE:
262*fbadb1c4SDavid du Colombier 	case ABVC:
263*fbadb1c4SDavid du Colombier 	case ABVS:
264*fbadb1c4SDavid du Colombier 		s->used.cc |= E_ICC;
265*fbadb1c4SDavid du Colombier 		s->used.cr |= E_CR0;
266*fbadb1c4SDavid du Colombier 		ar = 1;
267*fbadb1c4SDavid du Colombier 		break;
268*fbadb1c4SDavid du Colombier 	case ALSW:
269*fbadb1c4SDavid du Colombier 	case AMOVMW:
270*fbadb1c4SDavid du Colombier 		/* could do better */
271*fbadb1c4SDavid du Colombier 		sz = 32*4;
272*fbadb1c4SDavid du Colombier 		ld = 1;
273*fbadb1c4SDavid du Colombier 		break;
274*fbadb1c4SDavid du Colombier 	case AMOVBU:
275*fbadb1c4SDavid du Colombier 	case AMOVBZU:
276*fbadb1c4SDavid du Colombier 		upd = 1;
277*fbadb1c4SDavid du Colombier 		sz = 1;
278*fbadb1c4SDavid du Colombier 		ld = 1;
279*fbadb1c4SDavid du Colombier 		break;
280*fbadb1c4SDavid du Colombier 	case AMOVB:
281*fbadb1c4SDavid du Colombier 	case AMOVBZ:
282*fbadb1c4SDavid du Colombier 		sz = 1;
283*fbadb1c4SDavid du Colombier 		ld = 1;
284*fbadb1c4SDavid du Colombier 		break;
285*fbadb1c4SDavid du Colombier 	case AMOVHU:
286*fbadb1c4SDavid du Colombier 	case AMOVHZU:
287*fbadb1c4SDavid du Colombier 		upd = 1;
288*fbadb1c4SDavid du Colombier 		sz = 2;
289*fbadb1c4SDavid du Colombier 		ld = 1;
290*fbadb1c4SDavid du Colombier 		break;
291*fbadb1c4SDavid du Colombier 	case AMOVH:
292*fbadb1c4SDavid du Colombier 	case AMOVHBR:
293*fbadb1c4SDavid du Colombier 	case AMOVHZ:
294*fbadb1c4SDavid du Colombier 		sz = 2;
295*fbadb1c4SDavid du Colombier 		ld = 1;
296*fbadb1c4SDavid du Colombier 		break;
297*fbadb1c4SDavid du Colombier 	case AFMOVSU:
298*fbadb1c4SDavid du Colombier 	case AMOVWU:
299*fbadb1c4SDavid du Colombier 	case AMOVWZU:
300*fbadb1c4SDavid du Colombier 		upd = 1;
301*fbadb1c4SDavid du Colombier 		sz = 4;
302*fbadb1c4SDavid du Colombier 		ld = 1;
303*fbadb1c4SDavid du Colombier 		break;
304*fbadb1c4SDavid du Colombier 	case AFMOVS:
305*fbadb1c4SDavid du Colombier 	case AMOVW:
306*fbadb1c4SDavid du Colombier 	case AMOVWZ:
307*fbadb1c4SDavid du Colombier 	case AMOVWBR:
308*fbadb1c4SDavid du Colombier 	case ALWAR:
309*fbadb1c4SDavid du Colombier 		sz = 4;
310*fbadb1c4SDavid du Colombier 		ld = 1;
311*fbadb1c4SDavid du Colombier 		break;
312*fbadb1c4SDavid du Colombier 	case AFMOVDU:
313*fbadb1c4SDavid du Colombier 		upd = 1;
314*fbadb1c4SDavid du Colombier 		sz = 8;
315*fbadb1c4SDavid du Colombier 		ld = 1;
316*fbadb1c4SDavid du Colombier 		break;
317*fbadb1c4SDavid du Colombier 	case AFMOVD:
318*fbadb1c4SDavid du Colombier 		sz = 8;
319*fbadb1c4SDavid du Colombier 		ld = 1;
320*fbadb1c4SDavid du Colombier 		break;
321*fbadb1c4SDavid du Colombier 	case AFMOVDCC:
322*fbadb1c4SDavid du Colombier 		sz = 8;
323*fbadb1c4SDavid du Colombier 		ld = 1;
324*fbadb1c4SDavid du Colombier 		s->set.cc |= E_FCC;
325*fbadb1c4SDavid du Colombier 		s->set.cr |= E_CR1;
326*fbadb1c4SDavid du Colombier 		break;
327*fbadb1c4SDavid du Colombier 	case AMOVFL:
328*fbadb1c4SDavid du Colombier 	case AMOVCRFS:
329*fbadb1c4SDavid du Colombier 	case AMTFSB0:
330*fbadb1c4SDavid du Colombier 	case AMTFSB0CC:
331*fbadb1c4SDavid du Colombier 	case AMTFSB1:
332*fbadb1c4SDavid du Colombier 	case AMTFSB1CC:
333*fbadb1c4SDavid du Colombier 		s->set.ireg = ALL;
334*fbadb1c4SDavid du Colombier 		s->set.freg = ALL;
335*fbadb1c4SDavid du Colombier 		s->set.cc = ALL;
336*fbadb1c4SDavid du Colombier 		s->set.cr = ALL;
337*fbadb1c4SDavid du Colombier 		break;
338*fbadb1c4SDavid du Colombier 	case AADDCC:
339*fbadb1c4SDavid du Colombier 	case AADDVCC:
340*fbadb1c4SDavid du Colombier 	case AADDCCC:
341*fbadb1c4SDavid du Colombier 	case AADDCVCC:
342*fbadb1c4SDavid du Colombier 	case AADDMECC:
343*fbadb1c4SDavid du Colombier 	case AADDMEVCC:
344*fbadb1c4SDavid du Colombier 	case AADDECC:
345*fbadb1c4SDavid du Colombier 	case AADDEVCC:
346*fbadb1c4SDavid du Colombier 	case AADDZECC:
347*fbadb1c4SDavid du Colombier 	case AADDZEVCC:
348*fbadb1c4SDavid du Colombier 	case AANDCC:
349*fbadb1c4SDavid du Colombier 	case AANDNCC:
350*fbadb1c4SDavid du Colombier 	case ACNTLZWCC:
351*fbadb1c4SDavid du Colombier 	case ADIVWCC:
352*fbadb1c4SDavid du Colombier 	case ADIVWVCC:
353*fbadb1c4SDavid du Colombier 	case ADIVWUCC:
354*fbadb1c4SDavid du Colombier 	case ADIVWUVCC:
355*fbadb1c4SDavid du Colombier 	case AEQVCC:
356*fbadb1c4SDavid du Colombier 	case AEXTSBCC:
357*fbadb1c4SDavid du Colombier 	case AEXTSHCC:
358*fbadb1c4SDavid du Colombier 	case AMULHWCC:
359*fbadb1c4SDavid du Colombier 	case AMULHWUCC:
360*fbadb1c4SDavid du Colombier 	case AMULLWCC:
361*fbadb1c4SDavid du Colombier 	case AMULLWVCC:
362*fbadb1c4SDavid du Colombier 	case ANANDCC:
363*fbadb1c4SDavid du Colombier 	case ANEGCC:
364*fbadb1c4SDavid du Colombier 	case ANEGVCC:
365*fbadb1c4SDavid du Colombier 	case ANORCC:
366*fbadb1c4SDavid du Colombier 	case AORCC:
367*fbadb1c4SDavid du Colombier 	case AORNCC:
368*fbadb1c4SDavid du Colombier 	case AREMCC:
369*fbadb1c4SDavid du Colombier 	case AREMVCC:
370*fbadb1c4SDavid du Colombier 	case AREMUCC:
371*fbadb1c4SDavid du Colombier 	case AREMUVCC:
372*fbadb1c4SDavid du Colombier 	case ARLWMICC:
373*fbadb1c4SDavid du Colombier 	case ARLWNMCC:
374*fbadb1c4SDavid du Colombier 	case ASLWCC:
375*fbadb1c4SDavid du Colombier 	case ASRAWCC:
376*fbadb1c4SDavid du Colombier 	case ASRWCC:
377*fbadb1c4SDavid du Colombier 	case ASTWCCC:
378*fbadb1c4SDavid du Colombier 	case ASUBCC:
379*fbadb1c4SDavid du Colombier 	case ASUBVCC:
380*fbadb1c4SDavid du Colombier 	case ASUBCCC:
381*fbadb1c4SDavid du Colombier 	case ASUBCVCC:
382*fbadb1c4SDavid du Colombier 	case ASUBMECC:
383*fbadb1c4SDavid du Colombier 	case ASUBMEVCC:
384*fbadb1c4SDavid du Colombier 	case ASUBECC:
385*fbadb1c4SDavid du Colombier 	case ASUBEVCC:
386*fbadb1c4SDavid du Colombier 	case ASUBZECC:
387*fbadb1c4SDavid du Colombier 	case ASUBZEVCC:
388*fbadb1c4SDavid du Colombier 	case AXORCC:
389*fbadb1c4SDavid du Colombier 		s->set.cc |= E_ICC;
390*fbadb1c4SDavid du Colombier 		s->set.cr |= E_CR0;
391*fbadb1c4SDavid du Colombier 		break;
392*fbadb1c4SDavid du Colombier 	case AFABSCC:
393*fbadb1c4SDavid du Colombier 	case AFADDCC:
394*fbadb1c4SDavid du Colombier 	case AFADDSCC:
395*fbadb1c4SDavid du Colombier 	case AFCTIWCC:
396*fbadb1c4SDavid du Colombier 	case AFCTIWZCC:
397*fbadb1c4SDavid du Colombier 	case AFDIVCC:
398*fbadb1c4SDavid du Colombier 	case AFDIVSCC:
399*fbadb1c4SDavid du Colombier 	case AFMADDCC:
400*fbadb1c4SDavid du Colombier 	case AFMADDSCC:
401*fbadb1c4SDavid du Colombier 	case AFMSUBCC:
402*fbadb1c4SDavid du Colombier 	case AFMSUBSCC:
403*fbadb1c4SDavid du Colombier 	case AFMULCC:
404*fbadb1c4SDavid du Colombier 	case AFMULSCC:
405*fbadb1c4SDavid du Colombier 	case AFNABSCC:
406*fbadb1c4SDavid du Colombier 	case AFNEGCC:
407*fbadb1c4SDavid du Colombier 	case AFNMADDCC:
408*fbadb1c4SDavid du Colombier 	case AFNMADDSCC:
409*fbadb1c4SDavid du Colombier 	case AFNMSUBCC:
410*fbadb1c4SDavid du Colombier 	case AFNMSUBSCC:
411*fbadb1c4SDavid du Colombier 	case AFRSPCC:
412*fbadb1c4SDavid du Colombier 	case AFSUBCC:
413*fbadb1c4SDavid du Colombier 	case AFSUBSCC:
414*fbadb1c4SDavid du Colombier 		s->set.cc |= E_FCC;
415*fbadb1c4SDavid du Colombier 		s->set.cr |= E_CR1;
416*fbadb1c4SDavid du Colombier 		break;
417*fbadb1c4SDavid du Colombier 	}
418*fbadb1c4SDavid du Colombier 
419*fbadb1c4SDavid du Colombier /*
420*fbadb1c4SDavid du Colombier  * flags based on 'to' field
421*fbadb1c4SDavid du Colombier  */
422*fbadb1c4SDavid du Colombier 	c = p->to.class;
423*fbadb1c4SDavid du Colombier 	if(c == 0) {
424*fbadb1c4SDavid du Colombier 		c = aclass(&p->to) + 1;
425*fbadb1c4SDavid du Colombier 		p->to.class = c;
426*fbadb1c4SDavid du Colombier 	}
427*fbadb1c4SDavid du Colombier 	c--;
428*fbadb1c4SDavid du Colombier 	switch(c) {
429*fbadb1c4SDavid du Colombier 	default:
430*fbadb1c4SDavid du Colombier 		print("unknown class %d %D\n", c, &p->to);
431*fbadb1c4SDavid du Colombier 
432*fbadb1c4SDavid du Colombier 	case C_NONE:
433*fbadb1c4SDavid du Colombier 	case C_ZCON:
434*fbadb1c4SDavid du Colombier 	case C_SCON:
435*fbadb1c4SDavid du Colombier 	case C_UCON:
436*fbadb1c4SDavid du Colombier 	case C_LCON:
437*fbadb1c4SDavid du Colombier 	case C_ADDCON:
438*fbadb1c4SDavid du Colombier 	case C_ANDCON:
439*fbadb1c4SDavid du Colombier 	case C_SBRA:
440*fbadb1c4SDavid du Colombier 	case C_LBRA:
441*fbadb1c4SDavid du Colombier 		break;
442*fbadb1c4SDavid du Colombier 	case C_CREG:
443*fbadb1c4SDavid du Colombier 		c = p->to.reg;
444*fbadb1c4SDavid du Colombier 		if(c == NREG)
445*fbadb1c4SDavid du Colombier 			s->set.cr = ALL;
446*fbadb1c4SDavid du Colombier 		else
447*fbadb1c4SDavid du Colombier 			s->set.cr |= (0xF << ((p->from.reg&7)*4));
448*fbadb1c4SDavid du Colombier 		s->set.cc = ALL;
449*fbadb1c4SDavid du Colombier 		break;
450*fbadb1c4SDavid du Colombier 	case C_SPR:
451*fbadb1c4SDavid du Colombier 	case C_FPSCR:
452*fbadb1c4SDavid du Colombier 	case C_MSR:
453*fbadb1c4SDavid du Colombier 	case C_XER:
454*fbadb1c4SDavid du Colombier 		s->set.ireg = ALL;
455*fbadb1c4SDavid du Colombier 		s->set.freg = ALL;
456*fbadb1c4SDavid du Colombier 		s->set.cc = ALL;
457*fbadb1c4SDavid du Colombier 		s->set.cr = ALL;
458*fbadb1c4SDavid du Colombier 		break;
459*fbadb1c4SDavid du Colombier 	case C_LR:
460*fbadb1c4SDavid du Colombier 		s->set.cc |= E_LR;
461*fbadb1c4SDavid du Colombier 		break;
462*fbadb1c4SDavid du Colombier 	case C_CTR:
463*fbadb1c4SDavid du Colombier 		s->set.cc |= E_CTR;
464*fbadb1c4SDavid du Colombier 		break;
465*fbadb1c4SDavid du Colombier 	case C_ZOREG:
466*fbadb1c4SDavid du Colombier 	case C_SOREG:
467*fbadb1c4SDavid du Colombier 	case C_LOREG:
468*fbadb1c4SDavid du Colombier 		c = p->to.reg;
469*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<c;
470*fbadb1c4SDavid du Colombier 		if(upd)
471*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<c;
472*fbadb1c4SDavid du Colombier 		if(ad)
473*fbadb1c4SDavid du Colombier 			break;
474*fbadb1c4SDavid du Colombier 		s->size = sz;
475*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->to);
476*fbadb1c4SDavid du Colombier 
477*fbadb1c4SDavid du Colombier 		m = ANYMEM;
478*fbadb1c4SDavid du Colombier 		if(c == REGSB)
479*fbadb1c4SDavid du Colombier 			m = E_MEMSB;
480*fbadb1c4SDavid du Colombier 		if(c == REGSP)
481*fbadb1c4SDavid du Colombier 			m = E_MEMSP;
482*fbadb1c4SDavid du Colombier 
483*fbadb1c4SDavid du Colombier 		if(ar)
484*fbadb1c4SDavid du Colombier 			s->used.cc |= m;
485*fbadb1c4SDavid du Colombier 		else
486*fbadb1c4SDavid du Colombier 			s->set.cc |= m;
487*fbadb1c4SDavid du Colombier 		break;
488*fbadb1c4SDavid du Colombier 	case C_SACON:
489*fbadb1c4SDavid du Colombier 	case C_LACON:
490*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSP;
491*fbadb1c4SDavid du Colombier 		if(upd)
492*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<c;
493*fbadb1c4SDavid du Colombier 		break;
494*fbadb1c4SDavid du Colombier 	case C_SECON:
495*fbadb1c4SDavid du Colombier 	case C_LECON:
496*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSB;
497*fbadb1c4SDavid du Colombier 		if(upd)
498*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<c;
499*fbadb1c4SDavid du Colombier 		break;
500*fbadb1c4SDavid du Colombier 	case C_REG:
501*fbadb1c4SDavid du Colombier 		if(nr)
502*fbadb1c4SDavid du Colombier 			break;
503*fbadb1c4SDavid du Colombier 		if(ar)
504*fbadb1c4SDavid du Colombier 			s->used.ireg |= 1<<p->to.reg;
505*fbadb1c4SDavid du Colombier 		else
506*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<p->to.reg;
507*fbadb1c4SDavid du Colombier 		break;
508*fbadb1c4SDavid du Colombier 	case C_FREG:
509*fbadb1c4SDavid du Colombier 		if(ar)
510*fbadb1c4SDavid du Colombier 			s->used.freg |= 1<<p->to.reg;
511*fbadb1c4SDavid du Colombier 		else
512*fbadb1c4SDavid du Colombier 			s->set.freg |= 1<<p->to.reg;
513*fbadb1c4SDavid du Colombier 		break;
514*fbadb1c4SDavid du Colombier 	case C_SAUTO:
515*fbadb1c4SDavid du Colombier 	case C_LAUTO:
516*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSP;
517*fbadb1c4SDavid du Colombier 		if(upd)
518*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<c;
519*fbadb1c4SDavid du Colombier 		if(ad)
520*fbadb1c4SDavid du Colombier 			break;
521*fbadb1c4SDavid du Colombier 		s->size = sz;
522*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->to);
523*fbadb1c4SDavid du Colombier 
524*fbadb1c4SDavid du Colombier 		if(ar)
525*fbadb1c4SDavid du Colombier 			s->used.cc |= E_MEMSP;
526*fbadb1c4SDavid du Colombier 		else
527*fbadb1c4SDavid du Colombier 			s->set.cc |= E_MEMSP;
528*fbadb1c4SDavid du Colombier 		break;
529*fbadb1c4SDavid du Colombier 	case C_SEXT:
530*fbadb1c4SDavid du Colombier 	case C_LEXT:
531*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSB;
532*fbadb1c4SDavid du Colombier 		if(upd)
533*fbadb1c4SDavid du Colombier 			s->set.ireg |= 1<<c;
534*fbadb1c4SDavid du Colombier 		if(ad)
535*fbadb1c4SDavid du Colombier 			break;
536*fbadb1c4SDavid du Colombier 		s->size = sz;
537*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->to);
538*fbadb1c4SDavid du Colombier 
539*fbadb1c4SDavid du Colombier 		if(ar)
540*fbadb1c4SDavid du Colombier 			s->used.cc |= E_MEMSB;
541*fbadb1c4SDavid du Colombier 		else
542*fbadb1c4SDavid du Colombier 			s->set.cc |= E_MEMSB;
543*fbadb1c4SDavid du Colombier 		break;
544*fbadb1c4SDavid du Colombier 	}
545*fbadb1c4SDavid du Colombier 
546*fbadb1c4SDavid du Colombier /*
547*fbadb1c4SDavid du Colombier  * flags based on 'from' field
548*fbadb1c4SDavid du Colombier  */
549*fbadb1c4SDavid du Colombier 	c = p->from.class;
550*fbadb1c4SDavid du Colombier 	if(c == 0) {
551*fbadb1c4SDavid du Colombier 		c = aclass(&p->from) + 1;
552*fbadb1c4SDavid du Colombier 		p->from.class = c;
553*fbadb1c4SDavid du Colombier 	}
554*fbadb1c4SDavid du Colombier 	c--;
555*fbadb1c4SDavid du Colombier 	switch(c) {
556*fbadb1c4SDavid du Colombier 	default:
557*fbadb1c4SDavid du Colombier 		print("unknown class %d %D\n", c, &p->from);
558*fbadb1c4SDavid du Colombier 
559*fbadb1c4SDavid du Colombier 	case C_NONE:
560*fbadb1c4SDavid du Colombier 	case C_ZCON:
561*fbadb1c4SDavid du Colombier 	case C_SCON:
562*fbadb1c4SDavid du Colombier 	case C_UCON:
563*fbadb1c4SDavid du Colombier 	case C_LCON:
564*fbadb1c4SDavid du Colombier 	case C_ADDCON:
565*fbadb1c4SDavid du Colombier 	case C_ANDCON:
566*fbadb1c4SDavid du Colombier 	case C_SBRA:
567*fbadb1c4SDavid du Colombier 	case C_LBRA:
568*fbadb1c4SDavid du Colombier 		c = p->from.reg;
569*fbadb1c4SDavid du Colombier 		if(c != NREG)
570*fbadb1c4SDavid du Colombier 			s->used.ireg |= 1<<c;
571*fbadb1c4SDavid du Colombier 		break;
572*fbadb1c4SDavid du Colombier 	case C_CREG:
573*fbadb1c4SDavid du Colombier 		c = p->from.reg;
574*fbadb1c4SDavid du Colombier 		if(c == NREG)
575*fbadb1c4SDavid du Colombier 			s->used.cr = ALL;
576*fbadb1c4SDavid du Colombier 		else
577*fbadb1c4SDavid du Colombier 			s->used.cr |= (0xF << ((p->from.reg&7)*4));
578*fbadb1c4SDavid du Colombier 		s->used.cc = ALL;
579*fbadb1c4SDavid du Colombier 		break;
580*fbadb1c4SDavid du Colombier 	case C_SPR:
581*fbadb1c4SDavid du Colombier 	case C_FPSCR:
582*fbadb1c4SDavid du Colombier 	case C_MSR:
583*fbadb1c4SDavid du Colombier 	case C_XER:
584*fbadb1c4SDavid du Colombier 		s->set.ireg = ALL;
585*fbadb1c4SDavid du Colombier 		s->set.freg = ALL;
586*fbadb1c4SDavid du Colombier 		s->set.cc = ALL;
587*fbadb1c4SDavid du Colombier 		s->set.cr = ALL;
588*fbadb1c4SDavid du Colombier 		break;
589*fbadb1c4SDavid du Colombier 	case C_LR:
590*fbadb1c4SDavid du Colombier 		s->used.cc |= E_LR;
591*fbadb1c4SDavid du Colombier 		break;
592*fbadb1c4SDavid du Colombier 	case C_CTR:
593*fbadb1c4SDavid du Colombier 		s->used.cc |= E_CTR;
594*fbadb1c4SDavid du Colombier 		break;
595*fbadb1c4SDavid du Colombier 	case C_ZOREG:
596*fbadb1c4SDavid du Colombier 	case C_SOREG:
597*fbadb1c4SDavid du Colombier 	case C_LOREG:
598*fbadb1c4SDavid du Colombier 		c = p->from.reg;
599*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<c;
600*fbadb1c4SDavid du Colombier 		if(ld)
601*fbadb1c4SDavid du Colombier 			p->mark |= LOAD;
602*fbadb1c4SDavid du Colombier 		if(ad)
603*fbadb1c4SDavid du Colombier 			break;
604*fbadb1c4SDavid du Colombier 		s->size = sz;
605*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->from);
606*fbadb1c4SDavid du Colombier 
607*fbadb1c4SDavid du Colombier 		m = ANYMEM;
608*fbadb1c4SDavid du Colombier 		if(c == REGSB)
609*fbadb1c4SDavid du Colombier 			m = E_MEMSB;
610*fbadb1c4SDavid du Colombier 		if(c == REGSP)
611*fbadb1c4SDavid du Colombier 			m = E_MEMSP;
612*fbadb1c4SDavid du Colombier 
613*fbadb1c4SDavid du Colombier 		s->used.cc |= m;
614*fbadb1c4SDavid du Colombier 		break;
615*fbadb1c4SDavid du Colombier 	case C_SACON:
616*fbadb1c4SDavid du Colombier 	case C_LACON:
617*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSP;
618*fbadb1c4SDavid du Colombier 		break;
619*fbadb1c4SDavid du Colombier 	case C_SECON:
620*fbadb1c4SDavid du Colombier 	case C_LECON:
621*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSB;
622*fbadb1c4SDavid du Colombier 		break;
623*fbadb1c4SDavid du Colombier 	case C_REG:
624*fbadb1c4SDavid du Colombier 		if(nr)
625*fbadb1c4SDavid du Colombier 			break;
626*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<p->from.reg;
627*fbadb1c4SDavid du Colombier 		break;
628*fbadb1c4SDavid du Colombier 	case C_FREG:
629*fbadb1c4SDavid du Colombier 		s->used.freg |= 1<<p->from.reg;
630*fbadb1c4SDavid du Colombier 		break;
631*fbadb1c4SDavid du Colombier 	case C_SAUTO:
632*fbadb1c4SDavid du Colombier 	case C_LAUTO:
633*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSP;
634*fbadb1c4SDavid du Colombier 		if(ld)
635*fbadb1c4SDavid du Colombier 			p->mark |= LOAD;
636*fbadb1c4SDavid du Colombier 		if(ad)
637*fbadb1c4SDavid du Colombier 			break;
638*fbadb1c4SDavid du Colombier 		s->size = sz;
639*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->from);
640*fbadb1c4SDavid du Colombier 
641*fbadb1c4SDavid du Colombier 		s->used.cc |= E_MEMSP;
642*fbadb1c4SDavid du Colombier 		break;
643*fbadb1c4SDavid du Colombier 	case C_SEXT:
644*fbadb1c4SDavid du Colombier 	case C_LEXT:
645*fbadb1c4SDavid du Colombier 		s->used.ireg |= 1<<REGSB;
646*fbadb1c4SDavid du Colombier 		if(ld)
647*fbadb1c4SDavid du Colombier 			p->mark |= LOAD;
648*fbadb1c4SDavid du Colombier 		if(ad)
649*fbadb1c4SDavid du Colombier 			break;
650*fbadb1c4SDavid du Colombier 		s->size = sz;
651*fbadb1c4SDavid du Colombier 		s->soffset = regoff(&p->from);
652*fbadb1c4SDavid du Colombier 
653*fbadb1c4SDavid du Colombier 		s->used.cc |= E_MEMSB;
654*fbadb1c4SDavid du Colombier 		break;
655*fbadb1c4SDavid du Colombier 	}
656*fbadb1c4SDavid du Colombier 
657*fbadb1c4SDavid du Colombier 	c = p->reg;
658*fbadb1c4SDavid du Colombier 	if(c != NREG) {
659*fbadb1c4SDavid du Colombier 		if(p->from.type == D_FREG || p->to.type == D_FREG)
660*fbadb1c4SDavid du Colombier 			s->used.freg |= 1<<c;
661*fbadb1c4SDavid du Colombier 		else
662*fbadb1c4SDavid du Colombier 			s->used.ireg |= 1<<c;
663*fbadb1c4SDavid du Colombier 	}
664*fbadb1c4SDavid du Colombier }
665*fbadb1c4SDavid du Colombier 
666*fbadb1c4SDavid du Colombier /*
667*fbadb1c4SDavid du Colombier  * test to see if 2 instrictions can be
668*fbadb1c4SDavid du Colombier  * interchanged without changing semantics
669*fbadb1c4SDavid du Colombier  */
670*fbadb1c4SDavid du Colombier int
depend(Sch * sa,Sch * sb)671*fbadb1c4SDavid du Colombier depend(Sch *sa, Sch *sb)
672*fbadb1c4SDavid du Colombier {
673*fbadb1c4SDavid du Colombier 	ulong x;
674*fbadb1c4SDavid du Colombier 
675*fbadb1c4SDavid du Colombier 	if(sa->set.ireg & (sb->set.ireg|sb->used.ireg))
676*fbadb1c4SDavid du Colombier 		return 1;
677*fbadb1c4SDavid du Colombier 	if(sb->set.ireg & sa->used.ireg)
678*fbadb1c4SDavid du Colombier 		return 1;
679*fbadb1c4SDavid du Colombier 
680*fbadb1c4SDavid du Colombier 	if(sa->set.freg & (sb->set.freg|sb->used.freg))
681*fbadb1c4SDavid du Colombier 		return 1;
682*fbadb1c4SDavid du Colombier 	if(sb->set.freg & sa->used.freg)
683*fbadb1c4SDavid du Colombier 		return 1;
684*fbadb1c4SDavid du Colombier 
685*fbadb1c4SDavid du Colombier 	if(sa->set.cr & (sb->set.cr|sb->used.cr))
686*fbadb1c4SDavid du Colombier 		return 1;
687*fbadb1c4SDavid du Colombier 	if(sb->set.cr & sa->used.cr)
688*fbadb1c4SDavid du Colombier 		return 1;
689*fbadb1c4SDavid du Colombier 
690*fbadb1c4SDavid du Colombier 
691*fbadb1c4SDavid du Colombier 	x = (sa->set.cc & (sb->set.cc|sb->used.cc)) |
692*fbadb1c4SDavid du Colombier 		(sb->set.cc & sa->used.cc);
693*fbadb1c4SDavid du Colombier 	if(x) {
694*fbadb1c4SDavid du Colombier 		/*
695*fbadb1c4SDavid du Colombier 		 * allow SB and SP to pass each other.
696*fbadb1c4SDavid du Colombier 		 * allow SB to pass SB iff doffsets are ok
697*fbadb1c4SDavid du Colombier 		 * anything else conflicts
698*fbadb1c4SDavid du Colombier 		 */
699*fbadb1c4SDavid du Colombier 		if(x != E_MEMSP && x != E_MEMSB)
700*fbadb1c4SDavid du Colombier 			return 1;
701*fbadb1c4SDavid du Colombier 		x = sa->set.cc | sb->set.cc |
702*fbadb1c4SDavid du Colombier 			sa->used.cc | sb->used.cc;
703*fbadb1c4SDavid du Colombier 		if(x & E_MEM)
704*fbadb1c4SDavid du Colombier 			return 1;
705*fbadb1c4SDavid du Colombier 		if(offoverlap(sa, sb))
706*fbadb1c4SDavid du Colombier 			return 1;
707*fbadb1c4SDavid du Colombier 	}
708*fbadb1c4SDavid du Colombier 
709*fbadb1c4SDavid du Colombier 	return 0;
710*fbadb1c4SDavid du Colombier }
711*fbadb1c4SDavid du Colombier 
712*fbadb1c4SDavid du Colombier int
offoverlap(Sch * sa,Sch * sb)713*fbadb1c4SDavid du Colombier offoverlap(Sch *sa, Sch *sb)
714*fbadb1c4SDavid du Colombier {
715*fbadb1c4SDavid du Colombier 
716*fbadb1c4SDavid du Colombier 	if(sa->soffset < sb->soffset) {
717*fbadb1c4SDavid du Colombier 		if(sa->soffset+sa->size > sb->soffset)
718*fbadb1c4SDavid du Colombier 			return 1;
719*fbadb1c4SDavid du Colombier 		return 0;
720*fbadb1c4SDavid du Colombier 	}
721*fbadb1c4SDavid du Colombier 	if(sb->soffset+sb->size > sa->soffset)
722*fbadb1c4SDavid du Colombier 		return 1;
723*fbadb1c4SDavid du Colombier 	return 0;
724*fbadb1c4SDavid du Colombier }
725*fbadb1c4SDavid du Colombier 
726*fbadb1c4SDavid du Colombier /*
727*fbadb1c4SDavid du Colombier  * test 2 adjacent instructions
728*fbadb1c4SDavid du Colombier  * and find out if inserted instructions
729*fbadb1c4SDavid du Colombier  * are desired to prevent stalls.
730*fbadb1c4SDavid du Colombier  * first instruction is a load instruction.
731*fbadb1c4SDavid du Colombier  */
732*fbadb1c4SDavid du Colombier int
conflict(Sch * sa,Sch * sb)733*fbadb1c4SDavid du Colombier conflict(Sch *sa, Sch *sb)
734*fbadb1c4SDavid du Colombier {
735*fbadb1c4SDavid du Colombier 
736*fbadb1c4SDavid du Colombier 	if(sa->set.ireg & sb->used.ireg)
737*fbadb1c4SDavid du Colombier 		return 1;
738*fbadb1c4SDavid du Colombier 	if(sa->set.freg & sb->used.freg)
739*fbadb1c4SDavid du Colombier 		return 1;
740*fbadb1c4SDavid du Colombier 	if(sa->set.cr & sb->used.cr)
741*fbadb1c4SDavid du Colombier 		return 1;
742*fbadb1c4SDavid du Colombier 	return 0;
743*fbadb1c4SDavid du Colombier }
744*fbadb1c4SDavid du Colombier 
745*fbadb1c4SDavid du Colombier int
compound(Prog * p)746*fbadb1c4SDavid du Colombier compound(Prog *p)
747*fbadb1c4SDavid du Colombier {
748*fbadb1c4SDavid du Colombier 	Optab *o;
749*fbadb1c4SDavid du Colombier 
750*fbadb1c4SDavid du Colombier 	o = oplook(p);
751*fbadb1c4SDavid du Colombier 	if(o->size != 4)
752*fbadb1c4SDavid du Colombier 		return 1;
753*fbadb1c4SDavid du Colombier 	if(p->to.type == D_REG && p->to.reg == REGSB)
754*fbadb1c4SDavid du Colombier 		return 1;
755*fbadb1c4SDavid du Colombier 	return 0;
756*fbadb1c4SDavid du Colombier }
757*fbadb1c4SDavid du Colombier 
758*fbadb1c4SDavid du Colombier void
dumpbits(Sch * s,Dep * d)759*fbadb1c4SDavid du Colombier dumpbits(Sch *s, Dep *d)
760*fbadb1c4SDavid du Colombier {
761*fbadb1c4SDavid du Colombier 	int i;
762*fbadb1c4SDavid du Colombier 
763*fbadb1c4SDavid du Colombier 	for(i=0; i<32; i++)
764*fbadb1c4SDavid du Colombier 		if(d->ireg & (1<<i))
765*fbadb1c4SDavid du Colombier 			Bprint(&bso, " R%d", i);
766*fbadb1c4SDavid du Colombier 	for(i=0; i<32; i++)
767*fbadb1c4SDavid du Colombier 		if(d->freg & (1<<i))
768*fbadb1c4SDavid du Colombier 			Bprint(&bso, " F%d", i);
769*fbadb1c4SDavid du Colombier 	for(i=0; i<32; i++)
770*fbadb1c4SDavid du Colombier 		if(d->cr & (1<<i))
771*fbadb1c4SDavid du Colombier 			Bprint(&bso, " C%d", i);
772*fbadb1c4SDavid du Colombier 	for(i=0; i<32; i++)
773*fbadb1c4SDavid du Colombier 		switch(d->cc & (1<<i)) {
774*fbadb1c4SDavid du Colombier 		default:
775*fbadb1c4SDavid du Colombier 			break;
776*fbadb1c4SDavid du Colombier 		case E_ICC:
777*fbadb1c4SDavid du Colombier 			Bprint(&bso, " ICC");
778*fbadb1c4SDavid du Colombier 			break;
779*fbadb1c4SDavid du Colombier 		case E_FCC:
780*fbadb1c4SDavid du Colombier 			Bprint(&bso, " FCC");
781*fbadb1c4SDavid du Colombier 			break;
782*fbadb1c4SDavid du Colombier 		case E_LR:
783*fbadb1c4SDavid du Colombier 			Bprint(&bso, " LR");
784*fbadb1c4SDavid du Colombier 			break;
785*fbadb1c4SDavid du Colombier 		case E_CR:
786*fbadb1c4SDavid du Colombier 			Bprint(&bso, " CR");
787*fbadb1c4SDavid du Colombier 			break;
788*fbadb1c4SDavid du Colombier 		case E_CTR:
789*fbadb1c4SDavid du Colombier 			Bprint(&bso, " CTR");
790*fbadb1c4SDavid du Colombier 			break;
791*fbadb1c4SDavid du Colombier 		case E_XER:
792*fbadb1c4SDavid du Colombier 			Bprint(&bso, " XER");
793*fbadb1c4SDavid du Colombier 			break;
794*fbadb1c4SDavid du Colombier 		case E_MEM:
795*fbadb1c4SDavid du Colombier 			Bprint(&bso, " MEM%d", s->size);
796*fbadb1c4SDavid du Colombier 			break;
797*fbadb1c4SDavid du Colombier 		case E_MEMSB:
798*fbadb1c4SDavid du Colombier 			Bprint(&bso, " SB%d", s->size);
799*fbadb1c4SDavid du Colombier 			break;
800*fbadb1c4SDavid du Colombier 		case E_MEMSP:
801*fbadb1c4SDavid du Colombier 			Bprint(&bso, " SP%d", s->size);
802*fbadb1c4SDavid du Colombier 			break;
803*fbadb1c4SDavid du Colombier 		}
804*fbadb1c4SDavid du Colombier }
805