xref: /inferno-os/utils/vl/noop.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include	"l.h"
2*74a4d8c2SCharles.Forsyth 
3*74a4d8c2SCharles.Forsyth void
noops(void)4*74a4d8c2SCharles.Forsyth noops(void)
5*74a4d8c2SCharles.Forsyth {
6*74a4d8c2SCharles.Forsyth 	Prog *p, *p1, *q, *q1;
7*74a4d8c2SCharles.Forsyth 	int o, curframe, curbecome, maxbecome;
8*74a4d8c2SCharles.Forsyth 
9*74a4d8c2SCharles.Forsyth 	/*
10*74a4d8c2SCharles.Forsyth 	 * find leaf subroutines
11*74a4d8c2SCharles.Forsyth 	 * become sizes
12*74a4d8c2SCharles.Forsyth 	 * frame sizes
13*74a4d8c2SCharles.Forsyth 	 * strip NOPs
14*74a4d8c2SCharles.Forsyth 	 * expand RET
15*74a4d8c2SCharles.Forsyth 	 * expand BECOME pseudo
16*74a4d8c2SCharles.Forsyth 	 */
17*74a4d8c2SCharles.Forsyth 
18*74a4d8c2SCharles.Forsyth 	if(debug['v'])
19*74a4d8c2SCharles.Forsyth 		Bprint(&bso, "%5.2f noops\n", cputime());
20*74a4d8c2SCharles.Forsyth 	Bflush(&bso);
21*74a4d8c2SCharles.Forsyth 
22*74a4d8c2SCharles.Forsyth 	curframe = 0;
23*74a4d8c2SCharles.Forsyth 	curbecome = 0;
24*74a4d8c2SCharles.Forsyth 	maxbecome = 0;
25*74a4d8c2SCharles.Forsyth 	curtext = 0;
26*74a4d8c2SCharles.Forsyth 
27*74a4d8c2SCharles.Forsyth 	q = P;
28*74a4d8c2SCharles.Forsyth 	for(p = firstp; p != P; p = p->link) {
29*74a4d8c2SCharles.Forsyth 
30*74a4d8c2SCharles.Forsyth 		/* find out how much arg space is used in this TEXT */
31*74a4d8c2SCharles.Forsyth 		if(p->to.type == D_OREG && p->to.reg == REGSP)
32*74a4d8c2SCharles.Forsyth 			if(p->to.offset > curframe)
33*74a4d8c2SCharles.Forsyth 				curframe = p->to.offset;
34*74a4d8c2SCharles.Forsyth 
35*74a4d8c2SCharles.Forsyth 		switch(p->as) {
36*74a4d8c2SCharles.Forsyth 		case ATEXT:
37*74a4d8c2SCharles.Forsyth 			if(curtext && curtext->from.sym) {
38*74a4d8c2SCharles.Forsyth 				curtext->from.sym->frame = curframe;
39*74a4d8c2SCharles.Forsyth 				curtext->from.sym->become = curbecome;
40*74a4d8c2SCharles.Forsyth 				if(curbecome > maxbecome)
41*74a4d8c2SCharles.Forsyth 					maxbecome = curbecome;
42*74a4d8c2SCharles.Forsyth 			}
43*74a4d8c2SCharles.Forsyth 			curframe = 0;
44*74a4d8c2SCharles.Forsyth 			curbecome = 0;
45*74a4d8c2SCharles.Forsyth 
46*74a4d8c2SCharles.Forsyth 			p->mark |= LABEL|LEAF|SYNC;
47*74a4d8c2SCharles.Forsyth 			if(p->link)
48*74a4d8c2SCharles.Forsyth 				p->link->mark |= LABEL;
49*74a4d8c2SCharles.Forsyth 			curtext = p;
50*74a4d8c2SCharles.Forsyth 			break;
51*74a4d8c2SCharles.Forsyth 
52*74a4d8c2SCharles.Forsyth 		/* too hard, just leave alone */
53*74a4d8c2SCharles.Forsyth 		case AMOVW:
54*74a4d8c2SCharles.Forsyth 			if(p->to.type == D_FCREG ||
55*74a4d8c2SCharles.Forsyth 			   p->to.type == D_MREG) {
56*74a4d8c2SCharles.Forsyth 				p->mark |= LABEL|SYNC;
57*74a4d8c2SCharles.Forsyth 				break;
58*74a4d8c2SCharles.Forsyth 			}
59*74a4d8c2SCharles.Forsyth 			if(p->from.type == D_FCREG ||
60*74a4d8c2SCharles.Forsyth 			   p->from.type == D_MREG) {
61*74a4d8c2SCharles.Forsyth 				p->mark |= LABEL|SYNC;
62*74a4d8c2SCharles.Forsyth 				addnop(p);
63*74a4d8c2SCharles.Forsyth 				addnop(p);
64*74a4d8c2SCharles.Forsyth 				nop.mfrom.count += 2;
65*74a4d8c2SCharles.Forsyth 				nop.mfrom.outof += 2;
66*74a4d8c2SCharles.Forsyth 				break;
67*74a4d8c2SCharles.Forsyth 			}
68*74a4d8c2SCharles.Forsyth 			break;
69*74a4d8c2SCharles.Forsyth 
70*74a4d8c2SCharles.Forsyth 		/* too hard, just leave alone */
71*74a4d8c2SCharles.Forsyth 		case ACASE:
72*74a4d8c2SCharles.Forsyth 		case ASYSCALL:
73*74a4d8c2SCharles.Forsyth 		case AWORD:
74*74a4d8c2SCharles.Forsyth 		case ATLBWR:
75*74a4d8c2SCharles.Forsyth 		case ATLBWI:
76*74a4d8c2SCharles.Forsyth 		case ATLBP:
77*74a4d8c2SCharles.Forsyth 		case ATLBR:
78*74a4d8c2SCharles.Forsyth 			p->mark |= LABEL|SYNC;
79*74a4d8c2SCharles.Forsyth 			break;
80*74a4d8c2SCharles.Forsyth 
81*74a4d8c2SCharles.Forsyth 		case ANOR:
82*74a4d8c2SCharles.Forsyth 			if(p->to.type == D_REG && p->to.reg == REGZERO)
83*74a4d8c2SCharles.Forsyth 				p->mark |= LABEL|SYNC;
84*74a4d8c2SCharles.Forsyth 			break;
85*74a4d8c2SCharles.Forsyth 
86*74a4d8c2SCharles.Forsyth 		case ARET:
87*74a4d8c2SCharles.Forsyth 			/* special form of RET is BECOME */
88*74a4d8c2SCharles.Forsyth 			if(p->from.type == D_CONST)
89*74a4d8c2SCharles.Forsyth 				if(p->from.offset > curbecome)
90*74a4d8c2SCharles.Forsyth 					curbecome = p->from.offset;
91*74a4d8c2SCharles.Forsyth 
92*74a4d8c2SCharles.Forsyth 			if(p->link != P)
93*74a4d8c2SCharles.Forsyth 				p->link->mark |= LABEL;
94*74a4d8c2SCharles.Forsyth 			break;
95*74a4d8c2SCharles.Forsyth 
96*74a4d8c2SCharles.Forsyth 		case ANOP:
97*74a4d8c2SCharles.Forsyth 			q1 = p->link;
98*74a4d8c2SCharles.Forsyth 			q->link = q1;		/* q is non-nop */
99*74a4d8c2SCharles.Forsyth 			q1->mark |= p->mark;
100*74a4d8c2SCharles.Forsyth 			continue;
101*74a4d8c2SCharles.Forsyth 
102*74a4d8c2SCharles.Forsyth 		case ABCASE:
103*74a4d8c2SCharles.Forsyth 			p->mark |= LABEL|SYNC;
104*74a4d8c2SCharles.Forsyth 			goto dstlab;
105*74a4d8c2SCharles.Forsyth 
106*74a4d8c2SCharles.Forsyth 		case ABGEZAL:
107*74a4d8c2SCharles.Forsyth 		case ABLTZAL:
108*74a4d8c2SCharles.Forsyth 		case AJAL:
109*74a4d8c2SCharles.Forsyth 			if(curtext != P)
110*74a4d8c2SCharles.Forsyth 				curtext->mark &= ~LEAF;
111*74a4d8c2SCharles.Forsyth 
112*74a4d8c2SCharles.Forsyth 		case AJMP:
113*74a4d8c2SCharles.Forsyth 		case ABEQ:
114*74a4d8c2SCharles.Forsyth 		case ABGEZ:
115*74a4d8c2SCharles.Forsyth 		case ABGTZ:
116*74a4d8c2SCharles.Forsyth 		case ABLEZ:
117*74a4d8c2SCharles.Forsyth 		case ABLTZ:
118*74a4d8c2SCharles.Forsyth 		case ABNE:
119*74a4d8c2SCharles.Forsyth 		case ABFPT:
120*74a4d8c2SCharles.Forsyth 		case ABFPF:
121*74a4d8c2SCharles.Forsyth 			p->mark |= BRANCH;
122*74a4d8c2SCharles.Forsyth 
123*74a4d8c2SCharles.Forsyth 		dstlab:
124*74a4d8c2SCharles.Forsyth 			q1 = p->cond;
125*74a4d8c2SCharles.Forsyth 			if(q1 != P) {
126*74a4d8c2SCharles.Forsyth 				while(q1->as == ANOP) {
127*74a4d8c2SCharles.Forsyth 					q1 = q1->link;
128*74a4d8c2SCharles.Forsyth 					p->cond = q1;
129*74a4d8c2SCharles.Forsyth 				}
130*74a4d8c2SCharles.Forsyth 				if(!(q1->mark & LEAF))
131*74a4d8c2SCharles.Forsyth 					q1->mark |= LABEL;
132*74a4d8c2SCharles.Forsyth 			} else
133*74a4d8c2SCharles.Forsyth 				p->mark |= LABEL;
134*74a4d8c2SCharles.Forsyth 			q1 = p->link;
135*74a4d8c2SCharles.Forsyth 			if(q1 != P)
136*74a4d8c2SCharles.Forsyth 				q1->mark |= LABEL;
137*74a4d8c2SCharles.Forsyth 			break;
138*74a4d8c2SCharles.Forsyth 		}
139*74a4d8c2SCharles.Forsyth 		q = p;
140*74a4d8c2SCharles.Forsyth 	}
141*74a4d8c2SCharles.Forsyth 
142*74a4d8c2SCharles.Forsyth 	if(curtext && curtext->from.sym) {
143*74a4d8c2SCharles.Forsyth 		curtext->from.sym->frame = curframe;
144*74a4d8c2SCharles.Forsyth 		curtext->from.sym->become = curbecome;
145*74a4d8c2SCharles.Forsyth 		if(curbecome > maxbecome)
146*74a4d8c2SCharles.Forsyth 			maxbecome = curbecome;
147*74a4d8c2SCharles.Forsyth 	}
148*74a4d8c2SCharles.Forsyth 
149*74a4d8c2SCharles.Forsyth 	if(debug['b'])
150*74a4d8c2SCharles.Forsyth 		print("max become = %d\n", maxbecome);
151*74a4d8c2SCharles.Forsyth 	xdefine("ALEFbecome", STEXT, maxbecome);
152*74a4d8c2SCharles.Forsyth 
153*74a4d8c2SCharles.Forsyth 	curtext = 0;
154*74a4d8c2SCharles.Forsyth 	for(p = firstp; p != P; p = p->link) {
155*74a4d8c2SCharles.Forsyth 		switch(p->as) {
156*74a4d8c2SCharles.Forsyth 		case ATEXT:
157*74a4d8c2SCharles.Forsyth 			curtext = p;
158*74a4d8c2SCharles.Forsyth 			break;
159*74a4d8c2SCharles.Forsyth 		case AJAL:
160*74a4d8c2SCharles.Forsyth 			if(curtext != P && curtext->from.sym != S && curtext->to.offset >= 0) {
161*74a4d8c2SCharles.Forsyth 				o = maxbecome - curtext->from.sym->frame;
162*74a4d8c2SCharles.Forsyth 				if(o <= 0)
163*74a4d8c2SCharles.Forsyth 					break;
164*74a4d8c2SCharles.Forsyth 				/* calling a become or calling a variable */
165*74a4d8c2SCharles.Forsyth 				if(p->to.sym == S || p->to.sym->become) {
166*74a4d8c2SCharles.Forsyth 					curtext->to.offset += o;
167*74a4d8c2SCharles.Forsyth 					if(debug['b']) {
168*74a4d8c2SCharles.Forsyth 						curp = p;
169*74a4d8c2SCharles.Forsyth 						print("%D calling %D increase %d\n",
170*74a4d8c2SCharles.Forsyth 							&curtext->from, &p->to, o);
171*74a4d8c2SCharles.Forsyth 					}
172*74a4d8c2SCharles.Forsyth 				}
173*74a4d8c2SCharles.Forsyth 			}
174*74a4d8c2SCharles.Forsyth 			break;
175*74a4d8c2SCharles.Forsyth 		}
176*74a4d8c2SCharles.Forsyth 	}
177*74a4d8c2SCharles.Forsyth 
178*74a4d8c2SCharles.Forsyth 	for(p = firstp; p != P; p = p->link) {
179*74a4d8c2SCharles.Forsyth 		o = p->as;
180*74a4d8c2SCharles.Forsyth 		switch(o) {
181*74a4d8c2SCharles.Forsyth 		case ATEXT:
182*74a4d8c2SCharles.Forsyth 			curtext = p;
183*74a4d8c2SCharles.Forsyth 			autosize = p->to.offset + 4;
184*74a4d8c2SCharles.Forsyth 			if(autosize <= 4)
185*74a4d8c2SCharles.Forsyth 			if(curtext->mark & LEAF) {
186*74a4d8c2SCharles.Forsyth 				p->to.offset = -4;
187*74a4d8c2SCharles.Forsyth 				autosize = 0;
188*74a4d8c2SCharles.Forsyth 			}
189*74a4d8c2SCharles.Forsyth 
190*74a4d8c2SCharles.Forsyth 			q = p;
191*74a4d8c2SCharles.Forsyth 			if(autosize) {
192*74a4d8c2SCharles.Forsyth 				q = prg();
193*74a4d8c2SCharles.Forsyth 				q->as = AADD;
194*74a4d8c2SCharles.Forsyth 				q->line = p->line;
195*74a4d8c2SCharles.Forsyth 				q->from.type = D_CONST;
196*74a4d8c2SCharles.Forsyth 				q->from.offset = -autosize;
197*74a4d8c2SCharles.Forsyth 				q->to.type = D_REG;
198*74a4d8c2SCharles.Forsyth 				q->to.reg = REGSP;
199*74a4d8c2SCharles.Forsyth 
200*74a4d8c2SCharles.Forsyth 				q->link = p->link;
201*74a4d8c2SCharles.Forsyth 				p->link = q;
202*74a4d8c2SCharles.Forsyth 			} else
203*74a4d8c2SCharles.Forsyth 			if(!(curtext->mark & LEAF)) {
204*74a4d8c2SCharles.Forsyth 				if(debug['v'])
205*74a4d8c2SCharles.Forsyth 					Bprint(&bso, "save suppressed in: %s\n",
206*74a4d8c2SCharles.Forsyth 						curtext->from.sym->name);
207*74a4d8c2SCharles.Forsyth 				Bflush(&bso);
208*74a4d8c2SCharles.Forsyth 				curtext->mark |= LEAF;
209*74a4d8c2SCharles.Forsyth 			}
210*74a4d8c2SCharles.Forsyth 
211*74a4d8c2SCharles.Forsyth 			if(curtext->mark & LEAF) {
212*74a4d8c2SCharles.Forsyth 				if(curtext->from.sym)
213*74a4d8c2SCharles.Forsyth 					curtext->from.sym->type = SLEAF;
214*74a4d8c2SCharles.Forsyth 				break;
215*74a4d8c2SCharles.Forsyth 			}
216*74a4d8c2SCharles.Forsyth 
217*74a4d8c2SCharles.Forsyth 			q1 = prg();
218*74a4d8c2SCharles.Forsyth 			q1->as = AMOVW;
219*74a4d8c2SCharles.Forsyth 			q1->line = p->line;
220*74a4d8c2SCharles.Forsyth 			q1->from.type = D_REG;
221*74a4d8c2SCharles.Forsyth 			q1->from.reg = REGLINK;
222*74a4d8c2SCharles.Forsyth 			q1->to.type = D_OREG;
223*74a4d8c2SCharles.Forsyth 			q1->from.offset = 0;
224*74a4d8c2SCharles.Forsyth 			q1->to.reg = REGSP;
225*74a4d8c2SCharles.Forsyth 
226*74a4d8c2SCharles.Forsyth 			q1->link = q->link;
227*74a4d8c2SCharles.Forsyth 			q->link = q1;
228*74a4d8c2SCharles.Forsyth 			break;
229*74a4d8c2SCharles.Forsyth 
230*74a4d8c2SCharles.Forsyth 		case ARET:
231*74a4d8c2SCharles.Forsyth 			nocache(p);
232*74a4d8c2SCharles.Forsyth 			if(p->from.type == D_CONST)
233*74a4d8c2SCharles.Forsyth 				goto become;
234*74a4d8c2SCharles.Forsyth 			if(curtext->mark & LEAF) {
235*74a4d8c2SCharles.Forsyth 				if(!autosize) {
236*74a4d8c2SCharles.Forsyth 					p->as = AJMP;
237*74a4d8c2SCharles.Forsyth 					p->from = zprg.from;
238*74a4d8c2SCharles.Forsyth 					p->to.type = D_OREG;
239*74a4d8c2SCharles.Forsyth 					p->to.offset = 0;
240*74a4d8c2SCharles.Forsyth 					p->to.reg = REGLINK;
241*74a4d8c2SCharles.Forsyth 					p->mark |= BRANCH;
242*74a4d8c2SCharles.Forsyth 					break;
243*74a4d8c2SCharles.Forsyth 				}
244*74a4d8c2SCharles.Forsyth 
245*74a4d8c2SCharles.Forsyth 				p->as = AADD;
246*74a4d8c2SCharles.Forsyth 				p->from.type = D_CONST;
247*74a4d8c2SCharles.Forsyth 				p->from.offset = autosize;
248*74a4d8c2SCharles.Forsyth 				p->to.type = D_REG;
249*74a4d8c2SCharles.Forsyth 				p->to.reg = REGSP;
250*74a4d8c2SCharles.Forsyth 
251*74a4d8c2SCharles.Forsyth 				q = prg();
252*74a4d8c2SCharles.Forsyth 				q->as = AJMP;
253*74a4d8c2SCharles.Forsyth 				q->line = p->line;
254*74a4d8c2SCharles.Forsyth 				q->to.type = D_OREG;
255*74a4d8c2SCharles.Forsyth 				q->to.offset = 0;
256*74a4d8c2SCharles.Forsyth 				q->to.reg = REGLINK;
257*74a4d8c2SCharles.Forsyth 				q->mark |= BRANCH;
258*74a4d8c2SCharles.Forsyth 
259*74a4d8c2SCharles.Forsyth 				q->link = p->link;
260*74a4d8c2SCharles.Forsyth 				p->link = q;
261*74a4d8c2SCharles.Forsyth 				break;
262*74a4d8c2SCharles.Forsyth 			}
263*74a4d8c2SCharles.Forsyth 			p->as = AMOVW;
264*74a4d8c2SCharles.Forsyth 			p->from.type = D_OREG;
265*74a4d8c2SCharles.Forsyth 			p->from.offset = 0;
266*74a4d8c2SCharles.Forsyth 			p->from.reg = REGSP;
267*74a4d8c2SCharles.Forsyth 			p->to.type = D_REG;
268*74a4d8c2SCharles.Forsyth 			p->to.reg = 2;
269*74a4d8c2SCharles.Forsyth 
270*74a4d8c2SCharles.Forsyth 			q = p;
271*74a4d8c2SCharles.Forsyth 			if(autosize) {
272*74a4d8c2SCharles.Forsyth 				q = prg();
273*74a4d8c2SCharles.Forsyth 				q->as = AADD;
274*74a4d8c2SCharles.Forsyth 				q->line = p->line;
275*74a4d8c2SCharles.Forsyth 				q->from.type = D_CONST;
276*74a4d8c2SCharles.Forsyth 				q->from.offset = autosize;
277*74a4d8c2SCharles.Forsyth 				q->to.type = D_REG;
278*74a4d8c2SCharles.Forsyth 				q->to.reg = REGSP;
279*74a4d8c2SCharles.Forsyth 
280*74a4d8c2SCharles.Forsyth 				q->link = p->link;
281*74a4d8c2SCharles.Forsyth 				p->link = q;
282*74a4d8c2SCharles.Forsyth 			}
283*74a4d8c2SCharles.Forsyth 
284*74a4d8c2SCharles.Forsyth 			q1 = prg();
285*74a4d8c2SCharles.Forsyth 			q1->as = AJMP;
286*74a4d8c2SCharles.Forsyth 			q1->line = p->line;
287*74a4d8c2SCharles.Forsyth 			q1->to.type = D_OREG;
288*74a4d8c2SCharles.Forsyth 			q1->to.offset = 0;
289*74a4d8c2SCharles.Forsyth 			q1->to.reg = 2;
290*74a4d8c2SCharles.Forsyth 			q1->mark |= BRANCH;
291*74a4d8c2SCharles.Forsyth 
292*74a4d8c2SCharles.Forsyth 			q1->link = q->link;
293*74a4d8c2SCharles.Forsyth 			q->link = q1;
294*74a4d8c2SCharles.Forsyth 			break;
295*74a4d8c2SCharles.Forsyth 
296*74a4d8c2SCharles.Forsyth 		become:
297*74a4d8c2SCharles.Forsyth 			if(curtext->mark & LEAF) {
298*74a4d8c2SCharles.Forsyth 
299*74a4d8c2SCharles.Forsyth 				q = prg();
300*74a4d8c2SCharles.Forsyth 				q->line = p->line;
301*74a4d8c2SCharles.Forsyth 				q->as = AJMP;
302*74a4d8c2SCharles.Forsyth 				q->from = zprg.from;
303*74a4d8c2SCharles.Forsyth 				q->to = p->to;
304*74a4d8c2SCharles.Forsyth 				q->cond = p->cond;
305*74a4d8c2SCharles.Forsyth 				q->link = p->link;
306*74a4d8c2SCharles.Forsyth 				q->mark |= BRANCH;
307*74a4d8c2SCharles.Forsyth 				p->link = q;
308*74a4d8c2SCharles.Forsyth 
309*74a4d8c2SCharles.Forsyth 				p->as = AADD;
310*74a4d8c2SCharles.Forsyth 				p->from = zprg.from;
311*74a4d8c2SCharles.Forsyth 				p->from.type = D_CONST;
312*74a4d8c2SCharles.Forsyth 				p->from.offset = autosize;
313*74a4d8c2SCharles.Forsyth 				p->to = zprg.to;
314*74a4d8c2SCharles.Forsyth 				p->to.type = D_REG;
315*74a4d8c2SCharles.Forsyth 				p->to.reg = REGSP;
316*74a4d8c2SCharles.Forsyth 
317*74a4d8c2SCharles.Forsyth 				break;
318*74a4d8c2SCharles.Forsyth 			}
319*74a4d8c2SCharles.Forsyth 			q = prg();
320*74a4d8c2SCharles.Forsyth 			q->line = p->line;
321*74a4d8c2SCharles.Forsyth 			q->as = AJMP;
322*74a4d8c2SCharles.Forsyth 			q->from = zprg.from;
323*74a4d8c2SCharles.Forsyth 			q->to = p->to;
324*74a4d8c2SCharles.Forsyth 			q->cond = p->cond;
325*74a4d8c2SCharles.Forsyth 			q->link = p->link;
326*74a4d8c2SCharles.Forsyth 			q->mark |= BRANCH;
327*74a4d8c2SCharles.Forsyth 			p->link = q;
328*74a4d8c2SCharles.Forsyth 
329*74a4d8c2SCharles.Forsyth 			q = prg();
330*74a4d8c2SCharles.Forsyth 			q->line = p->line;
331*74a4d8c2SCharles.Forsyth 			q->as = AADD;
332*74a4d8c2SCharles.Forsyth 			q->from.type = D_CONST;
333*74a4d8c2SCharles.Forsyth 			q->from.offset = autosize;
334*74a4d8c2SCharles.Forsyth 			q->to.type = D_REG;
335*74a4d8c2SCharles.Forsyth 			q->to.reg = REGSP;
336*74a4d8c2SCharles.Forsyth 			q->link = p->link;
337*74a4d8c2SCharles.Forsyth 			p->link = q;
338*74a4d8c2SCharles.Forsyth 
339*74a4d8c2SCharles.Forsyth 			p->as = AMOVW;
340*74a4d8c2SCharles.Forsyth 			p->from = zprg.from;
341*74a4d8c2SCharles.Forsyth 			p->from.type = D_OREG;
342*74a4d8c2SCharles.Forsyth 			p->from.offset = 0;
343*74a4d8c2SCharles.Forsyth 			p->from.reg = REGSP;
344*74a4d8c2SCharles.Forsyth 			p->to = zprg.to;
345*74a4d8c2SCharles.Forsyth 			p->to.type = D_REG;
346*74a4d8c2SCharles.Forsyth 			p->to.reg = REGLINK;
347*74a4d8c2SCharles.Forsyth 
348*74a4d8c2SCharles.Forsyth 			break;
349*74a4d8c2SCharles.Forsyth 		}
350*74a4d8c2SCharles.Forsyth 	}
351*74a4d8c2SCharles.Forsyth 
352*74a4d8c2SCharles.Forsyth 	curtext = P;
353*74a4d8c2SCharles.Forsyth 	q = P;		/* p - 1 */
354*74a4d8c2SCharles.Forsyth 	q1 = firstp;	/* top of block */
355*74a4d8c2SCharles.Forsyth 	o = 0;		/* count of instructions */
356*74a4d8c2SCharles.Forsyth 	for(p = firstp; p != P; p = p1) {
357*74a4d8c2SCharles.Forsyth 		p1 = p->link;
358*74a4d8c2SCharles.Forsyth 		o++;
359*74a4d8c2SCharles.Forsyth 		if(p->mark & NOSCHED){
360*74a4d8c2SCharles.Forsyth 			if(q1 != p){
361*74a4d8c2SCharles.Forsyth 				sched(q1, q);
362*74a4d8c2SCharles.Forsyth 			}
363*74a4d8c2SCharles.Forsyth 			for(; p != P; p = p->link){
364*74a4d8c2SCharles.Forsyth 				if(!(p->mark & NOSCHED))
365*74a4d8c2SCharles.Forsyth 					break;
366*74a4d8c2SCharles.Forsyth 				q = p;
367*74a4d8c2SCharles.Forsyth 			}
368*74a4d8c2SCharles.Forsyth 			p1 = p;
369*74a4d8c2SCharles.Forsyth 			q1 = p;
370*74a4d8c2SCharles.Forsyth 			o = 0;
371*74a4d8c2SCharles.Forsyth 			continue;
372*74a4d8c2SCharles.Forsyth 		}
373*74a4d8c2SCharles.Forsyth 		if(p->mark & (LABEL|SYNC)) {
374*74a4d8c2SCharles.Forsyth 			if(q1 != p)
375*74a4d8c2SCharles.Forsyth 				sched(q1, q);
376*74a4d8c2SCharles.Forsyth 			q1 = p;
377*74a4d8c2SCharles.Forsyth 			o = 1;
378*74a4d8c2SCharles.Forsyth 		}
379*74a4d8c2SCharles.Forsyth 		if(p->mark & (BRANCH|SYNC)) {
380*74a4d8c2SCharles.Forsyth 			sched(q1, p);
381*74a4d8c2SCharles.Forsyth 			q1 = p1;
382*74a4d8c2SCharles.Forsyth 			o = 0;
383*74a4d8c2SCharles.Forsyth 		}
384*74a4d8c2SCharles.Forsyth 		if(o >= NSCHED) {
385*74a4d8c2SCharles.Forsyth 			sched(q1, p);
386*74a4d8c2SCharles.Forsyth 			q1 = p1;
387*74a4d8c2SCharles.Forsyth 			o = 0;
388*74a4d8c2SCharles.Forsyth 		}
389*74a4d8c2SCharles.Forsyth 		q = p;
390*74a4d8c2SCharles.Forsyth 	}
391*74a4d8c2SCharles.Forsyth }
392*74a4d8c2SCharles.Forsyth 
393*74a4d8c2SCharles.Forsyth void
addnop(Prog * p)394*74a4d8c2SCharles.Forsyth addnop(Prog *p)
395*74a4d8c2SCharles.Forsyth {
396*74a4d8c2SCharles.Forsyth 	Prog *q;
397*74a4d8c2SCharles.Forsyth 
398*74a4d8c2SCharles.Forsyth 	q = prg();
399*74a4d8c2SCharles.Forsyth 	q->as = ANOR;
400*74a4d8c2SCharles.Forsyth 	q->line = p->line;
401*74a4d8c2SCharles.Forsyth 	q->from.type = D_REG;
402*74a4d8c2SCharles.Forsyth 	q->from.reg = REGZERO;
403*74a4d8c2SCharles.Forsyth 	q->to.type = D_REG;
404*74a4d8c2SCharles.Forsyth 	q->to.reg = REGZERO;
405*74a4d8c2SCharles.Forsyth 
406*74a4d8c2SCharles.Forsyth 	q->link = p->link;
407*74a4d8c2SCharles.Forsyth 	p->link = q;
408*74a4d8c2SCharles.Forsyth }
409*74a4d8c2SCharles.Forsyth 
410*74a4d8c2SCharles.Forsyth void
nocache(Prog * p)411*74a4d8c2SCharles.Forsyth nocache(Prog *p)
412*74a4d8c2SCharles.Forsyth {
413*74a4d8c2SCharles.Forsyth 	p->optab = 0;
414*74a4d8c2SCharles.Forsyth 	p->from.class = 0;
415*74a4d8c2SCharles.Forsyth 	p->to.class = 0;
416*74a4d8c2SCharles.Forsyth }
417