xref: /plan9/sys/src/cmd/ql/sched.c (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
17dd7cddfSDavid du Colombier #include	"l.h"
27dd7cddfSDavid du Colombier 
37dd7cddfSDavid du Colombier enum
47dd7cddfSDavid du Colombier {
57dd7cddfSDavid du Colombier 	E_ICC	= 1<<0,
67dd7cddfSDavid du Colombier 	E_FCC	= 1<<1,
77dd7cddfSDavid du Colombier 	E_MEM	= 1<<2,
87dd7cddfSDavid du Colombier 	E_MEMSP	= 1<<3,	/* uses offset and size */
97dd7cddfSDavid du Colombier 	E_MEMSB	= 1<<4,	/* uses offset and size */
10*375daca8SDavid du Colombier 	E_LR	= 1<<5,
11*375daca8SDavid du Colombier 	E_CR = 1<<6,
12*375daca8SDavid du Colombier 	E_CTR = 1<<7,
13*375daca8SDavid du Colombier 	E_XER = 1<<8,
14*375daca8SDavid du Colombier 
15*375daca8SDavid du Colombier 	E_CR0 = 0xF<<0,
16*375daca8SDavid du Colombier 	E_CR1 = 0xF<<4,
17*375daca8SDavid du Colombier 
187dd7cddfSDavid du Colombier 	ANYMEM	= E_MEM|E_MEMSP|E_MEMSB,
197dd7cddfSDavid du Colombier 	ALL	= ~0,
207dd7cddfSDavid du Colombier };
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier typedef	struct	Sch	Sch;
237dd7cddfSDavid du Colombier typedef	struct	Dep	Dep;
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier struct	Dep
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	ulong	ireg;
287dd7cddfSDavid du Colombier 	ulong	freg;
297dd7cddfSDavid du Colombier 	ulong	cc;
30*375daca8SDavid du Colombier 	ulong	cr;
317dd7cddfSDavid du Colombier };
327dd7cddfSDavid du Colombier struct	Sch
337dd7cddfSDavid du Colombier {
347dd7cddfSDavid du Colombier 	Prog	p;
357dd7cddfSDavid du Colombier 	Dep	set;
367dd7cddfSDavid du Colombier 	Dep	used;
37*375daca8SDavid du Colombier 	long	soffset;
387dd7cddfSDavid du Colombier 	char	size;
397dd7cddfSDavid du Colombier 	char	comp;
407dd7cddfSDavid du Colombier };
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier void	regused(Sch*, Prog*);
437dd7cddfSDavid du Colombier int	depend(Sch*, Sch*);
447dd7cddfSDavid du Colombier int	conflict(Sch*, Sch*);
457dd7cddfSDavid du Colombier int	offoverlap(Sch*, Sch*);
467dd7cddfSDavid du Colombier void	dumpbits(Sch*, Dep*);
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier void
sched(Prog * p0,Prog * pe)497dd7cddfSDavid du Colombier sched(Prog *p0, Prog *pe)
507dd7cddfSDavid du Colombier {
517dd7cddfSDavid du Colombier 	Prog *p, *q;
527dd7cddfSDavid du Colombier 	Sch sch[NSCHED], *s, *t, *u, *se, stmp;
537dd7cddfSDavid du Colombier 
54*375daca8SDavid du Colombier 	if(!debug['Q'])
55*375daca8SDavid du Colombier 		return;
567dd7cddfSDavid du Colombier 	/*
577dd7cddfSDavid du Colombier 	 * build side structure
587dd7cddfSDavid du Colombier 	 */
597dd7cddfSDavid du Colombier 	s = sch;
607dd7cddfSDavid du Colombier 	for(p=p0;; p=p->link) {
617dd7cddfSDavid du Colombier 		memset(s, 0, sizeof(*s));
627dd7cddfSDavid du Colombier 		s->p = *p;
637dd7cddfSDavid du Colombier 		regused(s, p);
647dd7cddfSDavid du Colombier 		if(debug['X']) {
657dd7cddfSDavid du Colombier 			Bprint(&bso, "%P\tset", &s->p);
667dd7cddfSDavid du Colombier 			dumpbits(s, &s->set);
677dd7cddfSDavid du Colombier 			Bprint(&bso, "; used");
687dd7cddfSDavid du Colombier 			dumpbits(s, &s->used);
697dd7cddfSDavid du Colombier 			if(s->comp)
707dd7cddfSDavid du Colombier 				Bprint(&bso, "; compound");
717dd7cddfSDavid du Colombier 			if(s->p.mark & LOAD)
727dd7cddfSDavid du Colombier 				Bprint(&bso, "; load");
737dd7cddfSDavid du Colombier 			if(s->p.mark & BRANCH)
747dd7cddfSDavid du Colombier 				Bprint(&bso, "; branch");
757dd7cddfSDavid du Colombier 			if(s->p.mark & FCMP)
767dd7cddfSDavid du Colombier 				Bprint(&bso, "; fcmp");
777dd7cddfSDavid du Colombier 			Bprint(&bso, "\n");
787dd7cddfSDavid du Colombier 		}
797dd7cddfSDavid du Colombier 		s++;
807dd7cddfSDavid du Colombier 		if(p == pe)
817dd7cddfSDavid du Colombier 			break;
827dd7cddfSDavid du Colombier 	}
837dd7cddfSDavid du Colombier 	se = s;
847dd7cddfSDavid du Colombier 
857dd7cddfSDavid du Colombier 	for(s=se-1; s>=sch; s--) {
867dd7cddfSDavid du Colombier 
877dd7cddfSDavid du Colombier 		/*
887dd7cddfSDavid du Colombier 		 * load delay. interlocked.
897dd7cddfSDavid du Colombier 		 */
907dd7cddfSDavid du Colombier 		if(s->p.mark & LOAD) {
917dd7cddfSDavid du Colombier 			if(s >= se-1)
927dd7cddfSDavid du Colombier 				continue;
937dd7cddfSDavid du Colombier 			if(!conflict(s, (s+1)))
947dd7cddfSDavid du Colombier 				continue;
957dd7cddfSDavid du Colombier 			/*
967dd7cddfSDavid du Colombier 			 * s is load, s+1 is immediate use of result
977dd7cddfSDavid du Colombier 			 * t is the trial instruction to insert between s and s+1
987dd7cddfSDavid du Colombier 			 */
997dd7cddfSDavid du Colombier 			for(t=s-1; t>=sch; t--) {
1007dd7cddfSDavid du Colombier 				if(t->p.mark & BRANCH)
1017dd7cddfSDavid du Colombier 					goto no2;
1027dd7cddfSDavid du Colombier 				if(t->p.mark & FCMP)
1037dd7cddfSDavid du Colombier 					if((s+1)->p.mark & BRANCH)
1047dd7cddfSDavid du Colombier 						goto no2;
1057dd7cddfSDavid du Colombier 				if(t->p.mark & LOAD)
1067dd7cddfSDavid du Colombier 					if(conflict(t, (s+1)))
1077dd7cddfSDavid du Colombier 						goto no2;
1087dd7cddfSDavid du Colombier 				for(u=t+1; u<=s; u++)
1097dd7cddfSDavid du Colombier 					if(depend(u, t))
1107dd7cddfSDavid du Colombier 						goto no2;
1117dd7cddfSDavid du Colombier 				goto out2;
1127dd7cddfSDavid du Colombier 			no2:;
1137dd7cddfSDavid du Colombier 			}
1147dd7cddfSDavid du Colombier 			if(debug['X'])
1157dd7cddfSDavid du Colombier 				Bprint(&bso, "?l%P\n", &s->p);
1167dd7cddfSDavid du Colombier 			continue;
1177dd7cddfSDavid du Colombier 		out2:
1187dd7cddfSDavid du Colombier 			if(debug['X']) {
1197dd7cddfSDavid du Colombier 				Bprint(&bso, "!l%P\n", &t->p);
1207dd7cddfSDavid du Colombier 				Bprint(&bso, "%P\n", &s->p);
1217dd7cddfSDavid du Colombier 			}
1227dd7cddfSDavid du Colombier 			stmp = *t;
1237dd7cddfSDavid du Colombier 			memmove(t, t+1, (uchar*)s - (uchar*)t);
1247dd7cddfSDavid du Colombier 			*s = stmp;
1257dd7cddfSDavid du Colombier 			s--;
1267dd7cddfSDavid du Colombier 			continue;
1277dd7cddfSDavid du Colombier 		}
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier 		/*
1307dd7cddfSDavid du Colombier 		 * fop2 delay.
1317dd7cddfSDavid du Colombier 		 */
1327dd7cddfSDavid du Colombier 		if(s->p.mark & FCMP) {
133*375daca8SDavid du Colombier 			if(s >= se-1)
1347dd7cddfSDavid du Colombier 				continue;
1357dd7cddfSDavid du Colombier 			if(!((s+1)->p.mark & BRANCH))
1367dd7cddfSDavid du Colombier 				continue;
1377dd7cddfSDavid du Colombier 			/* t is the trial instruction to use */
1387dd7cddfSDavid du Colombier 			for(t=s-1; t>=sch; t--) {
1397dd7cddfSDavid du Colombier 				for(u=t+1; u<=s; u++)
1407dd7cddfSDavid du Colombier 					if(depend(u, t))
1417dd7cddfSDavid du Colombier 						goto no3;
1427dd7cddfSDavid du Colombier 				goto out3;
1437dd7cddfSDavid du Colombier 			no3:;
1447dd7cddfSDavid du Colombier 			}
1457dd7cddfSDavid du Colombier 			if(debug['X'])
1467dd7cddfSDavid du Colombier 				Bprint(&bso, "?f%P\n", &s->p);
1477dd7cddfSDavid du Colombier 			continue;
1487dd7cddfSDavid du Colombier 		out3:
1497dd7cddfSDavid du Colombier 			if(debug['X']) {
1507dd7cddfSDavid du Colombier 				Bprint(&bso, "!f%P\n", &t->p);
1517dd7cddfSDavid du Colombier 				Bprint(&bso, "%P\n", &s->p);
1527dd7cddfSDavid du Colombier 			}
1537dd7cddfSDavid du Colombier 			stmp = *t;
1547dd7cddfSDavid du Colombier 			memmove(t, t+1, (uchar*)s - (uchar*)t);
1557dd7cddfSDavid du Colombier 			*s = stmp;
1567dd7cddfSDavid du Colombier 			s--;
1577dd7cddfSDavid du Colombier 			continue;
1587dd7cddfSDavid du Colombier 		}
1597dd7cddfSDavid du Colombier 	}
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier 	/*
1627dd7cddfSDavid du Colombier 	 * put it all back
1637dd7cddfSDavid du Colombier 	 */
1647dd7cddfSDavid du Colombier 	for(s=sch, p=p0; s<se; s++, p=q) {
1657dd7cddfSDavid du Colombier 		q = p->link;
1667dd7cddfSDavid du Colombier 		if(q != s->p.link) {
1677dd7cddfSDavid du Colombier 			*p = s->p;
1687dd7cddfSDavid du Colombier 			p->link = q;
1697dd7cddfSDavid du Colombier 		}
1707dd7cddfSDavid du Colombier 	}
1717dd7cddfSDavid du Colombier 	if(debug['X'])
1727dd7cddfSDavid du Colombier 		Bprint(&bso, "\n");
1737dd7cddfSDavid du Colombier }
1747dd7cddfSDavid du Colombier 
1757dd7cddfSDavid du Colombier void
regused(Sch * s,Prog * realp)1767dd7cddfSDavid du Colombier regused(Sch *s, Prog *realp)
1777dd7cddfSDavid du Colombier {
178*375daca8SDavid du Colombier 	int c, ar, ad, ld, sz, nr, upd;
1797dd7cddfSDavid du Colombier 	ulong m;
1807dd7cddfSDavid du Colombier 	Prog *p;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier 	p = &s->p;
1837dd7cddfSDavid du Colombier 	s->comp = compound(p);
1847dd7cddfSDavid du Colombier 	if(s->comp) {
1857dd7cddfSDavid du Colombier 		s->set.ireg |= 1<<REGTMP;
1867dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGTMP;
1877dd7cddfSDavid du Colombier 	}
1887dd7cddfSDavid du Colombier 	ar = 0;		/* dest is really reference */
1897dd7cddfSDavid du Colombier 	ad = 0;		/* source/dest is really address */
1907dd7cddfSDavid du Colombier 	ld = 0;		/* opcode is load instruction */
191*375daca8SDavid du Colombier 	sz = 32*4;		/* size of load/store for overlap computation */
192*375daca8SDavid du Colombier 	nr = 0;	/* source/dest is not really reg */
193*375daca8SDavid du Colombier 	upd = 0;	/* move with update; changes reg */
1947dd7cddfSDavid du Colombier 
1957dd7cddfSDavid du Colombier /*
1967dd7cddfSDavid du Colombier  * flags based on opcode
1977dd7cddfSDavid du Colombier  */
1987dd7cddfSDavid du Colombier 	switch(p->as) {
1997dd7cddfSDavid du Colombier 	case ATEXT:
2007dd7cddfSDavid du Colombier 		curtext = realp;
2017dd7cddfSDavid du Colombier 		autosize = p->to.offset + 4;
2027dd7cddfSDavid du Colombier 		ad = 1;
2037dd7cddfSDavid du Colombier 		break;
2047dd7cddfSDavid du Colombier 	case ABL:
205*375daca8SDavid du Colombier 		s->set.cc |= E_LR;
2067dd7cddfSDavid du Colombier 		ar = 1;
2077dd7cddfSDavid du Colombier 		ad = 1;
2087dd7cddfSDavid du Colombier 		break;
2097dd7cddfSDavid du Colombier 	case ABR:
2107dd7cddfSDavid du Colombier 		ar = 1;
2117dd7cddfSDavid du Colombier 		ad = 1;
2127dd7cddfSDavid du Colombier 		break;
2137dd7cddfSDavid du Colombier 	case ACMP:
2147dd7cddfSDavid du Colombier 		s->set.cc |= E_ICC;
215*375daca8SDavid du Colombier 		if(p->reg == 0)
216*375daca8SDavid du Colombier 			s->set.cr |= E_CR0;
217*375daca8SDavid du Colombier 		else
218*375daca8SDavid du Colombier 			s->set.cr |= (0xF<<((p->reg&7)*4));
2197dd7cddfSDavid du Colombier 		ar = 1;
2207dd7cddfSDavid du Colombier 		break;
221*375daca8SDavid du Colombier 	case AFCMPO:
222*375daca8SDavid du Colombier 	case AFCMPU:
2237dd7cddfSDavid du Colombier 		s->set.cc |= E_FCC;
224*375daca8SDavid du Colombier 		if(p->reg == 0)
225*375daca8SDavid du Colombier 			s->set.cr |= E_CR0;
226*375daca8SDavid du Colombier 		else
227*375daca8SDavid du Colombier 			s->set.cr |= (0xF<<((p->reg&7)*4));
2287dd7cddfSDavid du Colombier 		ar = 1;
2297dd7cddfSDavid du Colombier 		break;
230*375daca8SDavid du Colombier 	case ACRAND:
231*375daca8SDavid du Colombier 	case ACRANDN:
232*375daca8SDavid du Colombier 	case ACREQV:
233*375daca8SDavid du Colombier 	case ACRNAND:
234*375daca8SDavid du Colombier 	case ACRNOR:
235*375daca8SDavid du Colombier 	case ACROR:
236*375daca8SDavid du Colombier 	case ACRORN:
237*375daca8SDavid du Colombier 	case ACRXOR:
238*375daca8SDavid du Colombier 		s->used.cr |= 1<<p->from.reg;
239*375daca8SDavid du Colombier 		s->set.cr |= 1<<p->to.reg;
240*375daca8SDavid du Colombier 		nr = 1;
241*375daca8SDavid du Colombier 		break;
242*375daca8SDavid du Colombier 	case ABCL:	/* tricky */
243*375daca8SDavid du Colombier 		s->used.cc |= E_FCC|E_ICC;
244*375daca8SDavid du Colombier 		s->used.cr = ALL;
245*375daca8SDavid du Colombier 		s->set.cc |= E_LR;
246*375daca8SDavid du Colombier 		ar = 1;
247*375daca8SDavid du Colombier 		break;
248*375daca8SDavid du Colombier 	case ABC:		/* tricky */
249*375daca8SDavid du Colombier 		s->used.cc |= E_FCC|E_ICC;
250*375daca8SDavid du Colombier 		s->used.cr = ALL;
251*375daca8SDavid du Colombier 		ar = 1;
252*375daca8SDavid du Colombier 		break;
253*375daca8SDavid du Colombier 	case ABEQ:
2547dd7cddfSDavid du Colombier 	case ABGE:
255*375daca8SDavid du Colombier 	case ABGT:
256*375daca8SDavid du Colombier 	case ABLE:
257*375daca8SDavid du Colombier 	case ABLT:
258*375daca8SDavid du Colombier 	case ABNE:
2597dd7cddfSDavid du Colombier 	case ABVC:
2607dd7cddfSDavid du Colombier 	case ABVS:
2617dd7cddfSDavid du Colombier 		s->used.cc |= E_ICC;
262*375daca8SDavid du Colombier 		s->used.cr |= E_CR0;
2637dd7cddfSDavid du Colombier 		ar = 1;
2647dd7cddfSDavid du Colombier 		break;
265*375daca8SDavid du Colombier 	case ALSW:
266*375daca8SDavid du Colombier 	case AMOVMW:
267*375daca8SDavid du Colombier 		/* could do better */
268*375daca8SDavid du Colombier 		sz = 32*4;
269*375daca8SDavid du Colombier 		ld = 1;
2707dd7cddfSDavid du Colombier 		break;
2717dd7cddfSDavid du Colombier 	case AMOVBU:
272*375daca8SDavid du Colombier 	case AMOVBZU:
273*375daca8SDavid du Colombier 		upd = 1;
2747dd7cddfSDavid du Colombier 		sz = 1;
2757dd7cddfSDavid du Colombier 		ld = 1;
2767dd7cddfSDavid du Colombier 		break;
277*375daca8SDavid du Colombier 	case AMOVB:
278*375daca8SDavid du Colombier 	case AMOVBZ:
279*375daca8SDavid du Colombier 		sz = 1;
280*375daca8SDavid du Colombier 		ld = 1;
281*375daca8SDavid du Colombier 		break;
2827dd7cddfSDavid du Colombier 	case AMOVHU:
283*375daca8SDavid du Colombier 	case AMOVHZU:
284*375daca8SDavid du Colombier 		upd = 1;
2857dd7cddfSDavid du Colombier 		sz = 2;
2867dd7cddfSDavid du Colombier 		ld = 1;
2877dd7cddfSDavid du Colombier 		break;
288*375daca8SDavid du Colombier 	case AMOVH:
289*375daca8SDavid du Colombier 	case AMOVHBR:
290*375daca8SDavid du Colombier 	case AMOVHZ:
291*375daca8SDavid du Colombier 		sz = 2;
292*375daca8SDavid du Colombier 		ld = 1;
293*375daca8SDavid du Colombier 		break;
294*375daca8SDavid du Colombier 	case AFMOVSU:
295*375daca8SDavid du Colombier 	case AMOVWU:
296*375daca8SDavid du Colombier 		upd = 1;
2977dd7cddfSDavid du Colombier 		sz = 4;
2987dd7cddfSDavid du Colombier 		ld = 1;
2997dd7cddfSDavid du Colombier 		break;
300*375daca8SDavid du Colombier 	case AFMOVS:
301*375daca8SDavid du Colombier 	case AMOVW:
302*375daca8SDavid du Colombier 	case AMOVWBR:
303*375daca8SDavid du Colombier 	case ALWAR:
304*375daca8SDavid du Colombier 		sz = 4;
305*375daca8SDavid du Colombier 		ld = 1;
306*375daca8SDavid du Colombier 		break;
307*375daca8SDavid du Colombier 	case AFMOVDU:
308*375daca8SDavid du Colombier 		upd = 1;
309*375daca8SDavid du Colombier 		sz = 8;
310*375daca8SDavid du Colombier 		ld = 1;
311*375daca8SDavid du Colombier 		break;
3127dd7cddfSDavid du Colombier 	case AFMOVD:
3137dd7cddfSDavid du Colombier 		sz = 8;
3147dd7cddfSDavid du Colombier 		ld = 1;
3157dd7cddfSDavid du Colombier 		break;
316*375daca8SDavid du Colombier 	case AFMOVDCC:
317*375daca8SDavid du Colombier 		sz = 8;
3187dd7cddfSDavid du Colombier 		ld = 1;
319*375daca8SDavid du Colombier 		s->set.cc |= E_FCC;
320*375daca8SDavid du Colombier 		s->set.cr |= E_CR1;
3217dd7cddfSDavid du Colombier 		break;
322*375daca8SDavid du Colombier 	case AMOVFL:
323*375daca8SDavid du Colombier 	case AMOVCRFS:
324*375daca8SDavid du Colombier 	case AMTFSB0:
325*375daca8SDavid du Colombier 	case AMTFSB0CC:
326*375daca8SDavid du Colombier 	case AMTFSB1:
327*375daca8SDavid du Colombier 	case AMTFSB1CC:
3287dd7cddfSDavid du Colombier 		s->set.ireg = ALL;
3297dd7cddfSDavid du Colombier 		s->set.freg = ALL;
3307dd7cddfSDavid du Colombier 		s->set.cc = ALL;
331*375daca8SDavid du Colombier 		s->set.cr = ALL;
332*375daca8SDavid du Colombier 		break;
333*375daca8SDavid du Colombier 	case AADDCC:
334*375daca8SDavid du Colombier 	case AADDVCC:
335*375daca8SDavid du Colombier 	case AADDCCC:
336*375daca8SDavid du Colombier 	case AADDCVCC:
337*375daca8SDavid du Colombier 	case AADDMECC:
338*375daca8SDavid du Colombier 	case AADDMEVCC:
339*375daca8SDavid du Colombier 	case AADDECC:
340*375daca8SDavid du Colombier 	case AADDEVCC:
341*375daca8SDavid du Colombier 	case AADDZECC:
342*375daca8SDavid du Colombier 	case AADDZEVCC:
343*375daca8SDavid du Colombier 	case AANDCC:
344*375daca8SDavid du Colombier 	case AANDNCC:
345*375daca8SDavid du Colombier 	case ACNTLZWCC:
346*375daca8SDavid du Colombier 	case ADIVWCC:
347*375daca8SDavid du Colombier 	case ADIVWVCC:
348*375daca8SDavid du Colombier 	case ADIVWUCC:
349*375daca8SDavid du Colombier 	case ADIVWUVCC:
350*375daca8SDavid du Colombier 	case AEQVCC:
351*375daca8SDavid du Colombier 	case AEXTSBCC:
352*375daca8SDavid du Colombier 	case AEXTSHCC:
353*375daca8SDavid du Colombier 	case AMULHWCC:
354*375daca8SDavid du Colombier 	case AMULHWUCC:
355*375daca8SDavid du Colombier 	case AMULLWCC:
356*375daca8SDavid du Colombier 	case AMULLWVCC:
357*375daca8SDavid du Colombier 	case ANANDCC:
358*375daca8SDavid du Colombier 	case ANEGCC:
359*375daca8SDavid du Colombier 	case ANEGVCC:
360*375daca8SDavid du Colombier 	case ANORCC:
361*375daca8SDavid du Colombier 	case AORCC:
362*375daca8SDavid du Colombier 	case AORNCC:
363*375daca8SDavid du Colombier 	case AREMCC:
364*375daca8SDavid du Colombier 	case AREMVCC:
365*375daca8SDavid du Colombier 	case AREMUCC:
366*375daca8SDavid du Colombier 	case AREMUVCC:
367*375daca8SDavid du Colombier 	case ARLWMICC:
368*375daca8SDavid du Colombier 	case ARLWNMCC:
369*375daca8SDavid du Colombier 	case ASLWCC:
370*375daca8SDavid du Colombier 	case ASRAWCC:
371*375daca8SDavid du Colombier 	case ASRWCC:
372*375daca8SDavid du Colombier 	case ASTWCCC:
373*375daca8SDavid du Colombier 	case ASUBCC:
374*375daca8SDavid du Colombier 	case ASUBVCC:
375*375daca8SDavid du Colombier 	case ASUBCCC:
376*375daca8SDavid du Colombier 	case ASUBCVCC:
377*375daca8SDavid du Colombier 	case ASUBMECC:
378*375daca8SDavid du Colombier 	case ASUBMEVCC:
379*375daca8SDavid du Colombier 	case ASUBECC:
380*375daca8SDavid du Colombier 	case ASUBEVCC:
381*375daca8SDavid du Colombier 	case ASUBZECC:
382*375daca8SDavid du Colombier 	case ASUBZEVCC:
383*375daca8SDavid du Colombier 	case AXORCC:
384*375daca8SDavid du Colombier 		s->set.cc |= E_ICC;
385*375daca8SDavid du Colombier 		s->set.cr |= E_CR0;
386*375daca8SDavid du Colombier 		break;
387*375daca8SDavid du Colombier 	case AFABSCC:
388*375daca8SDavid du Colombier 	case AFADDCC:
389*375daca8SDavid du Colombier 	case AFADDSCC:
390*375daca8SDavid du Colombier 	case AFCTIWCC:
391*375daca8SDavid du Colombier 	case AFCTIWZCC:
392*375daca8SDavid du Colombier 	case AFDIVCC:
393*375daca8SDavid du Colombier 	case AFDIVSCC:
394*375daca8SDavid du Colombier 	case AFMADDCC:
395*375daca8SDavid du Colombier 	case AFMADDSCC:
396*375daca8SDavid du Colombier 	case AFMSUBCC:
397*375daca8SDavid du Colombier 	case AFMSUBSCC:
398*375daca8SDavid du Colombier 	case AFMULCC:
399*375daca8SDavid du Colombier 	case AFMULSCC:
400*375daca8SDavid du Colombier 	case AFNABSCC:
401*375daca8SDavid du Colombier 	case AFNEGCC:
402*375daca8SDavid du Colombier 	case AFNMADDCC:
403*375daca8SDavid du Colombier 	case AFNMADDSCC:
404*375daca8SDavid du Colombier 	case AFNMSUBCC:
405*375daca8SDavid du Colombier 	case AFNMSUBSCC:
406*375daca8SDavid du Colombier 	case AFRSPCC:
407*375daca8SDavid du Colombier 	case AFSUBCC:
408*375daca8SDavid du Colombier 	case AFSUBSCC:
409*375daca8SDavid du Colombier 		s->set.cc |= E_FCC;
410*375daca8SDavid du Colombier 		s->set.cr |= E_CR1;
4117dd7cddfSDavid du Colombier 		break;
4127dd7cddfSDavid du Colombier 	}
4137dd7cddfSDavid du Colombier 
4147dd7cddfSDavid du Colombier /*
4157dd7cddfSDavid du Colombier  * flags based on 'to' field
4167dd7cddfSDavid du Colombier  */
4177dd7cddfSDavid du Colombier 	c = p->to.class;
4187dd7cddfSDavid du Colombier 	if(c == 0) {
4197dd7cddfSDavid du Colombier 		c = aclass(&p->to) + 1;
4207dd7cddfSDavid du Colombier 		p->to.class = c;
4217dd7cddfSDavid du Colombier 	}
4227dd7cddfSDavid du Colombier 	c--;
4237dd7cddfSDavid du Colombier 	switch(c) {
4247dd7cddfSDavid du Colombier 	default:
4257dd7cddfSDavid du Colombier 		print("unknown class %d %D\n", c, &p->to);
4267dd7cddfSDavid du Colombier 
427*375daca8SDavid du Colombier 	case C_NONE:
4287dd7cddfSDavid du Colombier 	case C_ZCON:
4297dd7cddfSDavid du Colombier 	case C_SCON:
4307dd7cddfSDavid du Colombier 	case C_UCON:
4317dd7cddfSDavid du Colombier 	case C_LCON:
432*375daca8SDavid du Colombier 	case C_ADDCON:
433*375daca8SDavid du Colombier 	case C_ANDCON:
4347dd7cddfSDavid du Colombier 	case C_SBRA:
4357dd7cddfSDavid du Colombier 	case C_LBRA:
4367dd7cddfSDavid du Colombier 		break;
4377dd7cddfSDavid du Colombier 	case C_CREG:
438*375daca8SDavid du Colombier 		c = p->to.reg;
439*375daca8SDavid du Colombier 		if(c == NREG)
440*375daca8SDavid du Colombier 			s->set.cr = ALL;
441*375daca8SDavid du Colombier 		else
442*375daca8SDavid du Colombier 			s->set.cr |= (0xF << ((p->from.reg&7)*4));
443*375daca8SDavid du Colombier 		s->set.cc = ALL;
444*375daca8SDavid du Colombier 		break;
445*375daca8SDavid du Colombier 	case C_SPR:
446*375daca8SDavid du Colombier 	case C_SREG:
447*375daca8SDavid du Colombier 	case C_FPSCR:
448*375daca8SDavid du Colombier 	case C_MSR:
449*375daca8SDavid du Colombier 	case C_XER:
4507dd7cddfSDavid du Colombier 		s->set.ireg = ALL;
4517dd7cddfSDavid du Colombier 		s->set.freg = ALL;
4527dd7cddfSDavid du Colombier 		s->set.cc = ALL;
453*375daca8SDavid du Colombier 		s->set.cr = ALL;
454*375daca8SDavid du Colombier 		break;
455*375daca8SDavid du Colombier 	case C_LR:
456*375daca8SDavid du Colombier 		s->set.cc |= E_LR;
457*375daca8SDavid du Colombier 		break;
458*375daca8SDavid du Colombier 	case C_CTR:
459*375daca8SDavid du Colombier 		s->set.cc |= E_CTR;
4607dd7cddfSDavid du Colombier 		break;
4617dd7cddfSDavid du Colombier 	case C_ZOREG:
4627dd7cddfSDavid du Colombier 	case C_SOREG:
4637dd7cddfSDavid du Colombier 	case C_LOREG:
4647dd7cddfSDavid du Colombier 		c = p->to.reg;
4657dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<c;
466*375daca8SDavid du Colombier 		if(upd)
467*375daca8SDavid du Colombier 			s->set.ireg |= 1<<c;
4687dd7cddfSDavid du Colombier 		if(ad)
4697dd7cddfSDavid du Colombier 			break;
4707dd7cddfSDavid du Colombier 		s->size = sz;
471*375daca8SDavid du Colombier 		s->soffset = regoff(&p->to);
4727dd7cddfSDavid du Colombier 
4737dd7cddfSDavid du Colombier 		m = ANYMEM;
4747dd7cddfSDavid du Colombier 		if(c == REGSB)
4757dd7cddfSDavid du Colombier 			m = E_MEMSB;
4767dd7cddfSDavid du Colombier 		if(c == REGSP)
4777dd7cddfSDavid du Colombier 			m = E_MEMSP;
4787dd7cddfSDavid du Colombier 
4797dd7cddfSDavid du Colombier 		if(ar)
4807dd7cddfSDavid du Colombier 			s->used.cc |= m;
4817dd7cddfSDavid du Colombier 		else
4827dd7cddfSDavid du Colombier 			s->set.cc |= m;
4837dd7cddfSDavid du Colombier 		break;
4847dd7cddfSDavid du Colombier 	case C_SACON:
4857dd7cddfSDavid du Colombier 	case C_LACON:
4867dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSP;
487*375daca8SDavid du Colombier 		if(upd)
488*375daca8SDavid du Colombier 			s->set.ireg |= 1<<c;
4897dd7cddfSDavid du Colombier 		break;
4907dd7cddfSDavid du Colombier 	case C_SECON:
4917dd7cddfSDavid du Colombier 	case C_LECON:
4927dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSB;
493*375daca8SDavid du Colombier 		if(upd)
494*375daca8SDavid du Colombier 			s->set.ireg |= 1<<c;
4957dd7cddfSDavid du Colombier 		break;
4967dd7cddfSDavid du Colombier 	case C_REG:
497*375daca8SDavid du Colombier 		if(nr)
498*375daca8SDavid du Colombier 			break;
4997dd7cddfSDavid du Colombier 		if(ar)
5007dd7cddfSDavid du Colombier 			s->used.ireg |= 1<<p->to.reg;
5017dd7cddfSDavid du Colombier 		else
5027dd7cddfSDavid du Colombier 			s->set.ireg |= 1<<p->to.reg;
5037dd7cddfSDavid du Colombier 		break;
5047dd7cddfSDavid du Colombier 	case C_FREG:
505*375daca8SDavid du Colombier 		if(ar)
5067dd7cddfSDavid du Colombier 			s->used.freg |= 1<<p->to.reg;
507*375daca8SDavid du Colombier 		else
5087dd7cddfSDavid du Colombier 			s->set.freg |= 1<<p->to.reg;
5097dd7cddfSDavid du Colombier 		break;
5107dd7cddfSDavid du Colombier 	case C_SAUTO:
5117dd7cddfSDavid du Colombier 	case C_LAUTO:
5127dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSP;
513*375daca8SDavid du Colombier 		if(upd)
514*375daca8SDavid du Colombier 			s->set.ireg |= 1<<c;
5157dd7cddfSDavid du Colombier 		if(ad)
5167dd7cddfSDavid du Colombier 			break;
5177dd7cddfSDavid du Colombier 		s->size = sz;
518*375daca8SDavid du Colombier 		s->soffset = regoff(&p->to);
5197dd7cddfSDavid du Colombier 
5207dd7cddfSDavid du Colombier 		if(ar)
5217dd7cddfSDavid du Colombier 			s->used.cc |= E_MEMSP;
5227dd7cddfSDavid du Colombier 		else
5237dd7cddfSDavid du Colombier 			s->set.cc |= E_MEMSP;
5247dd7cddfSDavid du Colombier 		break;
5257dd7cddfSDavid du Colombier 	case C_SEXT:
5267dd7cddfSDavid du Colombier 	case C_LEXT:
5277dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSB;
528*375daca8SDavid du Colombier 		if(upd)
529*375daca8SDavid du Colombier 			s->set.ireg |= 1<<c;
5307dd7cddfSDavid du Colombier 		if(ad)
5317dd7cddfSDavid du Colombier 			break;
5327dd7cddfSDavid du Colombier 		s->size = sz;
533*375daca8SDavid du Colombier 		s->soffset = regoff(&p->to);
5347dd7cddfSDavid du Colombier 
5357dd7cddfSDavid du Colombier 		if(ar)
5367dd7cddfSDavid du Colombier 			s->used.cc |= E_MEMSB;
5377dd7cddfSDavid du Colombier 		else
5387dd7cddfSDavid du Colombier 			s->set.cc |= E_MEMSB;
5397dd7cddfSDavid du Colombier 		break;
5407dd7cddfSDavid du Colombier 	}
5417dd7cddfSDavid du Colombier 
5427dd7cddfSDavid du Colombier /*
5437dd7cddfSDavid du Colombier  * flags based on 'from' field
5447dd7cddfSDavid du Colombier  */
5457dd7cddfSDavid du Colombier 	c = p->from.class;
5467dd7cddfSDavid du Colombier 	if(c == 0) {
5477dd7cddfSDavid du Colombier 		c = aclass(&p->from) + 1;
5487dd7cddfSDavid du Colombier 		p->from.class = c;
5497dd7cddfSDavid du Colombier 	}
5507dd7cddfSDavid du Colombier 	c--;
5517dd7cddfSDavid du Colombier 	switch(c) {
5527dd7cddfSDavid du Colombier 	default:
5537dd7cddfSDavid du Colombier 		print("unknown class %d %D\n", c, &p->from);
5547dd7cddfSDavid du Colombier 
555*375daca8SDavid du Colombier 	case C_NONE:
5567dd7cddfSDavid du Colombier 	case C_ZCON:
5577dd7cddfSDavid du Colombier 	case C_SCON:
5587dd7cddfSDavid du Colombier 	case C_UCON:
5597dd7cddfSDavid du Colombier 	case C_LCON:
560*375daca8SDavid du Colombier 	case C_ADDCON:
561*375daca8SDavid du Colombier 	case C_ANDCON:
5627dd7cddfSDavid du Colombier 	case C_SBRA:
5637dd7cddfSDavid du Colombier 	case C_LBRA:
5647dd7cddfSDavid du Colombier 		c = p->from.reg;
5657dd7cddfSDavid du Colombier 		if(c != NREG)
5667dd7cddfSDavid du Colombier 			s->used.ireg |= 1<<c;
5677dd7cddfSDavid du Colombier 		break;
5687dd7cddfSDavid du Colombier 	case C_CREG:
569*375daca8SDavid du Colombier 		c = p->from.reg;
570*375daca8SDavid du Colombier 		if(c == NREG)
571*375daca8SDavid du Colombier 			s->used.cr = ALL;
572*375daca8SDavid du Colombier 		else
573*375daca8SDavid du Colombier 			s->used.cr |= (0xF << ((p->from.reg&7)*4));
574*375daca8SDavid du Colombier 		s->used.cc = ALL;
575*375daca8SDavid du Colombier 		break;
576*375daca8SDavid du Colombier 	case C_SPR:
577*375daca8SDavid du Colombier 	case C_SREG:
578*375daca8SDavid du Colombier 	case C_FPSCR:
579*375daca8SDavid du Colombier 	case C_MSR:
580*375daca8SDavid du Colombier 	case C_XER:
5817dd7cddfSDavid du Colombier 		s->set.ireg = ALL;
5827dd7cddfSDavid du Colombier 		s->set.freg = ALL;
5837dd7cddfSDavid du Colombier 		s->set.cc = ALL;
584*375daca8SDavid du Colombier 		s->set.cr = ALL;
585*375daca8SDavid du Colombier 		break;
586*375daca8SDavid du Colombier 	case C_LR:
587*375daca8SDavid du Colombier 		s->used.cc |= E_LR;
588*375daca8SDavid du Colombier 		break;
589*375daca8SDavid du Colombier 	case C_CTR:
590*375daca8SDavid du Colombier 		s->used.cc |= E_CTR;
5917dd7cddfSDavid du Colombier 		break;
5927dd7cddfSDavid du Colombier 	case C_ZOREG:
5937dd7cddfSDavid du Colombier 	case C_SOREG:
5947dd7cddfSDavid du Colombier 	case C_LOREG:
5957dd7cddfSDavid du Colombier 		c = p->from.reg;
5967dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<c;
5977dd7cddfSDavid du Colombier 		if(ld)
5987dd7cddfSDavid du Colombier 			p->mark |= LOAD;
5997dd7cddfSDavid du Colombier 		if(ad)
6007dd7cddfSDavid du Colombier 			break;
6017dd7cddfSDavid du Colombier 		s->size = sz;
602*375daca8SDavid du Colombier 		s->soffset = regoff(&p->from);
6037dd7cddfSDavid du Colombier 
6047dd7cddfSDavid du Colombier 		m = ANYMEM;
6057dd7cddfSDavid du Colombier 		if(c == REGSB)
6067dd7cddfSDavid du Colombier 			m = E_MEMSB;
6077dd7cddfSDavid du Colombier 		if(c == REGSP)
6087dd7cddfSDavid du Colombier 			m = E_MEMSP;
6097dd7cddfSDavid du Colombier 
6107dd7cddfSDavid du Colombier 		s->used.cc |= m;
6117dd7cddfSDavid du Colombier 		break;
6127dd7cddfSDavid du Colombier 	case C_SACON:
6137dd7cddfSDavid du Colombier 	case C_LACON:
6147dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSP;
6157dd7cddfSDavid du Colombier 		break;
6167dd7cddfSDavid du Colombier 	case C_SECON:
6177dd7cddfSDavid du Colombier 	case C_LECON:
6187dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSB;
6197dd7cddfSDavid du Colombier 		break;
6207dd7cddfSDavid du Colombier 	case C_REG:
621*375daca8SDavid du Colombier 		if(nr)
622*375daca8SDavid du Colombier 			break;
6237dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<p->from.reg;
6247dd7cddfSDavid du Colombier 		break;
6257dd7cddfSDavid du Colombier 	case C_FREG:
6267dd7cddfSDavid du Colombier 		s->used.freg |= 1<<p->from.reg;
6277dd7cddfSDavid du Colombier 		break;
6287dd7cddfSDavid du Colombier 	case C_SAUTO:
6297dd7cddfSDavid du Colombier 	case C_LAUTO:
6307dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSP;
6317dd7cddfSDavid du Colombier 		if(ld)
6327dd7cddfSDavid du Colombier 			p->mark |= LOAD;
6337dd7cddfSDavid du Colombier 		if(ad)
6347dd7cddfSDavid du Colombier 			break;
6357dd7cddfSDavid du Colombier 		s->size = sz;
636*375daca8SDavid du Colombier 		s->soffset = regoff(&p->from);
6377dd7cddfSDavid du Colombier 
6387dd7cddfSDavid du Colombier 		s->used.cc |= E_MEMSP;
6397dd7cddfSDavid du Colombier 		break;
6407dd7cddfSDavid du Colombier 	case C_SEXT:
6417dd7cddfSDavid du Colombier 	case C_LEXT:
6427dd7cddfSDavid du Colombier 		s->used.ireg |= 1<<REGSB;
6437dd7cddfSDavid du Colombier 		if(ld)
6447dd7cddfSDavid du Colombier 			p->mark |= LOAD;
6457dd7cddfSDavid du Colombier 		if(ad)
6467dd7cddfSDavid du Colombier 			break;
6477dd7cddfSDavid du Colombier 		s->size = sz;
648*375daca8SDavid du Colombier 		s->soffset = regoff(&p->from);
6497dd7cddfSDavid du Colombier 
6507dd7cddfSDavid du Colombier 		s->used.cc |= E_MEMSB;
6517dd7cddfSDavid du Colombier 		break;
6527dd7cddfSDavid du Colombier 	}
6537dd7cddfSDavid du Colombier 
6547dd7cddfSDavid du Colombier 	c = p->reg;
6557dd7cddfSDavid du Colombier 	if(c != NREG) {
656*375daca8SDavid du Colombier 		if(p->from.type == D_FREG || p->to.type == D_FREG)
6577dd7cddfSDavid du Colombier 			s->used.freg |= 1<<c;
658*375daca8SDavid du Colombier 		else
6597dd7cddfSDavid du Colombier 			s->used.ireg |= 1<<c;
6607dd7cddfSDavid du Colombier 	}
6617dd7cddfSDavid du Colombier }
6627dd7cddfSDavid du Colombier 
6637dd7cddfSDavid du Colombier /*
6647dd7cddfSDavid du Colombier  * test to see if 2 instrictions can be
6657dd7cddfSDavid du Colombier  * interchanged without changing semantics
6667dd7cddfSDavid du Colombier  */
6677dd7cddfSDavid du Colombier int
depend(Sch * sa,Sch * sb)6687dd7cddfSDavid du Colombier depend(Sch *sa, Sch *sb)
6697dd7cddfSDavid du Colombier {
6707dd7cddfSDavid du Colombier 	ulong x;
6717dd7cddfSDavid du Colombier 
6727dd7cddfSDavid du Colombier 	if(sa->set.ireg & (sb->set.ireg|sb->used.ireg))
6737dd7cddfSDavid du Colombier 		return 1;
6747dd7cddfSDavid du Colombier 	if(sb->set.ireg & sa->used.ireg)
6757dd7cddfSDavid du Colombier 		return 1;
6767dd7cddfSDavid du Colombier 
6777dd7cddfSDavid du Colombier 	if(sa->set.freg & (sb->set.freg|sb->used.freg))
6787dd7cddfSDavid du Colombier 		return 1;
6797dd7cddfSDavid du Colombier 	if(sb->set.freg & sa->used.freg)
6807dd7cddfSDavid du Colombier 		return 1;
6817dd7cddfSDavid du Colombier 
682*375daca8SDavid du Colombier 	if(sa->set.cr & (sb->set.cr|sb->used.cr))
683*375daca8SDavid du Colombier 		return 1;
684*375daca8SDavid du Colombier 	if(sb->set.cr & sa->used.cr)
685*375daca8SDavid du Colombier 		return 1;
686*375daca8SDavid du Colombier 
687*375daca8SDavid du Colombier 
6887dd7cddfSDavid du Colombier 	x = (sa->set.cc & (sb->set.cc|sb->used.cc)) |
6897dd7cddfSDavid du Colombier 		(sb->set.cc & sa->used.cc);
6907dd7cddfSDavid du Colombier 	if(x) {
6917dd7cddfSDavid du Colombier 		/*
6927dd7cddfSDavid du Colombier 		 * allow SB and SP to pass each other.
6937dd7cddfSDavid du Colombier 		 * allow SB to pass SB iff doffsets are ok
6947dd7cddfSDavid du Colombier 		 * anything else conflicts
6957dd7cddfSDavid du Colombier 		 */
6967dd7cddfSDavid du Colombier 		if(x != E_MEMSP && x != E_MEMSB)
6977dd7cddfSDavid du Colombier 			return 1;
6987dd7cddfSDavid du Colombier 		x = sa->set.cc | sb->set.cc |
6997dd7cddfSDavid du Colombier 			sa->used.cc | sb->used.cc;
7007dd7cddfSDavid du Colombier 		if(x & E_MEM)
7017dd7cddfSDavid du Colombier 			return 1;
7027dd7cddfSDavid du Colombier 		if(offoverlap(sa, sb))
7037dd7cddfSDavid du Colombier 			return 1;
7047dd7cddfSDavid du Colombier 	}
7057dd7cddfSDavid du Colombier 
7067dd7cddfSDavid du Colombier 	return 0;
7077dd7cddfSDavid du Colombier }
7087dd7cddfSDavid du Colombier 
7097dd7cddfSDavid du Colombier int
offoverlap(Sch * sa,Sch * sb)7107dd7cddfSDavid du Colombier offoverlap(Sch *sa, Sch *sb)
7117dd7cddfSDavid du Colombier {
7127dd7cddfSDavid du Colombier 
713*375daca8SDavid du Colombier 	if(sa->soffset < sb->soffset) {
714*375daca8SDavid du Colombier 		if(sa->soffset+sa->size > sb->soffset)
7157dd7cddfSDavid du Colombier 			return 1;
7167dd7cddfSDavid du Colombier 		return 0;
7177dd7cddfSDavid du Colombier 	}
718*375daca8SDavid du Colombier 	if(sb->soffset+sb->size > sa->soffset)
7197dd7cddfSDavid du Colombier 		return 1;
7207dd7cddfSDavid du Colombier 	return 0;
7217dd7cddfSDavid du Colombier }
7227dd7cddfSDavid du Colombier 
7237dd7cddfSDavid du Colombier /*
7247dd7cddfSDavid du Colombier  * test 2 adjacent instructions
7257dd7cddfSDavid du Colombier  * and find out if inserted instructions
7267dd7cddfSDavid du Colombier  * are desired to prevent stalls.
7277dd7cddfSDavid du Colombier  * first instruction is a load instruction.
7287dd7cddfSDavid du Colombier  */
7297dd7cddfSDavid du Colombier int
conflict(Sch * sa,Sch * sb)7307dd7cddfSDavid du Colombier conflict(Sch *sa, Sch *sb)
7317dd7cddfSDavid du Colombier {
7327dd7cddfSDavid du Colombier 
7337dd7cddfSDavid du Colombier 	if(sa->set.ireg & sb->used.ireg)
7347dd7cddfSDavid du Colombier 		return 1;
7357dd7cddfSDavid du Colombier 	if(sa->set.freg & sb->used.freg)
7367dd7cddfSDavid du Colombier 		return 1;
737*375daca8SDavid du Colombier 	if(sa->set.cr & sb->used.cr)
738*375daca8SDavid du Colombier 		return 1;
7397dd7cddfSDavid du Colombier 	return 0;
7407dd7cddfSDavid du Colombier }
7417dd7cddfSDavid du Colombier 
7427dd7cddfSDavid du Colombier int
compound(Prog * p)7437dd7cddfSDavid du Colombier compound(Prog *p)
7447dd7cddfSDavid du Colombier {
7457dd7cddfSDavid du Colombier 	Optab *o;
7467dd7cddfSDavid du Colombier 
7477dd7cddfSDavid du Colombier 	o = oplook(p);
7487dd7cddfSDavid du Colombier 	if(o->size != 4)
7497dd7cddfSDavid du Colombier 		return 1;
7507dd7cddfSDavid du Colombier 	if(p->to.type == D_REG && p->to.reg == REGSB)
7517dd7cddfSDavid du Colombier 		return 1;
7527dd7cddfSDavid du Colombier 	return 0;
7537dd7cddfSDavid du Colombier }
7547dd7cddfSDavid du Colombier 
7557dd7cddfSDavid du Colombier void
dumpbits(Sch * s,Dep * d)7567dd7cddfSDavid du Colombier dumpbits(Sch *s, Dep *d)
7577dd7cddfSDavid du Colombier {
7587dd7cddfSDavid du Colombier 	int i;
7597dd7cddfSDavid du Colombier 
7607dd7cddfSDavid du Colombier 	for(i=0; i<32; i++)
7617dd7cddfSDavid du Colombier 		if(d->ireg & (1<<i))
7627dd7cddfSDavid du Colombier 			Bprint(&bso, " R%d", i);
7637dd7cddfSDavid du Colombier 	for(i=0; i<32; i++)
7647dd7cddfSDavid du Colombier 		if(d->freg & (1<<i))
7657dd7cddfSDavid du Colombier 			Bprint(&bso, " F%d", i);
7667dd7cddfSDavid du Colombier 	for(i=0; i<32; i++)
767*375daca8SDavid du Colombier 		if(d->cr & (1<<i))
768*375daca8SDavid du Colombier 			Bprint(&bso, " C%d", i);
769*375daca8SDavid du Colombier 	for(i=0; i<32; i++)
7707dd7cddfSDavid du Colombier 		switch(d->cc & (1<<i)) {
7717dd7cddfSDavid du Colombier 		default:
7727dd7cddfSDavid du Colombier 			break;
7737dd7cddfSDavid du Colombier 		case E_ICC:
7747dd7cddfSDavid du Colombier 			Bprint(&bso, " ICC");
7757dd7cddfSDavid du Colombier 			break;
7767dd7cddfSDavid du Colombier 		case E_FCC:
7777dd7cddfSDavid du Colombier 			Bprint(&bso, " FCC");
7787dd7cddfSDavid du Colombier 			break;
779*375daca8SDavid du Colombier 		case E_LR:
780*375daca8SDavid du Colombier 			Bprint(&bso, " LR");
781*375daca8SDavid du Colombier 			break;
782*375daca8SDavid du Colombier 		case E_CR:
783*375daca8SDavid du Colombier 			Bprint(&bso, " CR");
784*375daca8SDavid du Colombier 			break;
785*375daca8SDavid du Colombier 		case E_CTR:
786*375daca8SDavid du Colombier 			Bprint(&bso, " CTR");
787*375daca8SDavid du Colombier 			break;
788*375daca8SDavid du Colombier 		case E_XER:
789*375daca8SDavid du Colombier 			Bprint(&bso, " XER");
790*375daca8SDavid du Colombier 			break;
7917dd7cddfSDavid du Colombier 		case E_MEM:
7927dd7cddfSDavid du Colombier 			Bprint(&bso, " MEM%d", s->size);
7937dd7cddfSDavid du Colombier 			break;
7947dd7cddfSDavid du Colombier 		case E_MEMSB:
7957dd7cddfSDavid du Colombier 			Bprint(&bso, " SB%d", s->size);
7967dd7cddfSDavid du Colombier 			break;
7977dd7cddfSDavid du Colombier 		case E_MEMSP:
7987dd7cddfSDavid du Colombier 			Bprint(&bso, " SP%d", s->size);
7997dd7cddfSDavid du Colombier 			break;
8007dd7cddfSDavid du Colombier 		}
8017dd7cddfSDavid du Colombier }
802