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