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