xref: /plan9/sys/src/cmd/ql/noop.c (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
17dd7cddfSDavid du Colombier #include	"l.h"
27dd7cddfSDavid du Colombier 
37dd7cddfSDavid du Colombier void
noops(void)47dd7cddfSDavid du Colombier noops(void)
57dd7cddfSDavid du Colombier {
67dd7cddfSDavid du Colombier 	Prog *p, *p1, *q, *q1;
7*375daca8SDavid du Colombier 	int o, mov, aoffset, curframe, curbecome, maxbecome;
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier 	/*
107dd7cddfSDavid du Colombier 	 * find leaf subroutines
117dd7cddfSDavid du Colombier 	 * become sizes
127dd7cddfSDavid du Colombier 	 * frame sizes
137dd7cddfSDavid du Colombier 	 * strip NOPs
147dd7cddfSDavid du Colombier 	 * expand RET
157dd7cddfSDavid du Colombier 	 * expand BECOME pseudo
167dd7cddfSDavid du Colombier 	 */
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier 	if(debug['v'])
197dd7cddfSDavid du Colombier 		Bprint(&bso, "%5.2f noops\n", cputime());
207dd7cddfSDavid du Colombier 	Bflush(&bso);
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier 	curframe = 0;
237dd7cddfSDavid du Colombier 	curbecome = 0;
247dd7cddfSDavid du Colombier 	maxbecome = 0;
257dd7cddfSDavid du Colombier 	curtext = 0;
267dd7cddfSDavid du Colombier 	q = P;
277dd7cddfSDavid du Colombier 	for(p = firstp; p != P; p = p->link) {
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier 		/* find out how much arg space is used in this TEXT */
307dd7cddfSDavid du Colombier 		if(p->to.type == D_OREG && p->to.reg == REGSP)
317dd7cddfSDavid du Colombier 			if(p->to.offset > curframe)
327dd7cddfSDavid du Colombier 				curframe = p->to.offset;
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier 		switch(p->as) {
357dd7cddfSDavid du Colombier 		/* too hard, just leave alone */
367dd7cddfSDavid du Colombier 		case ATEXT:
377dd7cddfSDavid du Colombier 			if(curtext && curtext->from.sym) {
387dd7cddfSDavid du Colombier 				curtext->from.sym->frame = curframe;
397dd7cddfSDavid du Colombier 				curtext->from.sym->become = curbecome;
407dd7cddfSDavid du Colombier 				if(curbecome > maxbecome)
417dd7cddfSDavid du Colombier 					maxbecome = curbecome;
427dd7cddfSDavid du Colombier 			}
437dd7cddfSDavid du Colombier 			curframe = 0;
447dd7cddfSDavid du Colombier 			curbecome = 0;
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier 			q = p;
477dd7cddfSDavid du Colombier 			p->mark |= LABEL|LEAF|SYNC;
487dd7cddfSDavid du Colombier 			if(p->link)
497dd7cddfSDavid du Colombier 				p->link->mark |= LABEL;
507dd7cddfSDavid du Colombier 			curtext = p;
517dd7cddfSDavid du Colombier 			break;
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier 		case ANOR:
547dd7cddfSDavid du Colombier 			q = p;
557dd7cddfSDavid du Colombier 			if(p->to.type == D_REG)
567dd7cddfSDavid du Colombier 				if(p->to.reg == REGZERO)
577dd7cddfSDavid du Colombier 					p->mark |= LABEL|SYNC;
587dd7cddfSDavid du Colombier 			break;
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier 		case ALWAR:
617dd7cddfSDavid du Colombier 		case ASTWCCC:
627dd7cddfSDavid du Colombier 		case AECIWX:
637dd7cddfSDavid du Colombier 		case AECOWX:
647dd7cddfSDavid du Colombier 		case AEIEIO:
657dd7cddfSDavid du Colombier 		case AICBI:
667dd7cddfSDavid du Colombier 		case AISYNC:
677dd7cddfSDavid du Colombier 		case ATLBIE:
687dd7cddfSDavid du Colombier 		case ADCBF:
697dd7cddfSDavid du Colombier 		case ADCBI:
707dd7cddfSDavid du Colombier 		case ADCBST:
717dd7cddfSDavid du Colombier 		case ADCBT:
727dd7cddfSDavid du Colombier 		case ADCBTST:
737dd7cddfSDavid du Colombier 		case ADCBZ:
747dd7cddfSDavid du Colombier 		case ASYNC:
757dd7cddfSDavid du Colombier 		case ATW:
767dd7cddfSDavid du Colombier 		case AWORD:
77*375daca8SDavid du Colombier 		case ARFI:
78*375daca8SDavid du Colombier 		case ARFCI:
797dd7cddfSDavid du Colombier 			q = p;
807dd7cddfSDavid du Colombier 			p->mark |= LABEL|SYNC;
817dd7cddfSDavid du Colombier 			continue;
827dd7cddfSDavid du Colombier 
83*375daca8SDavid du Colombier 		case AMOVW:
84*375daca8SDavid du Colombier 			q = p;
85*375daca8SDavid du Colombier 			switch(p->from.type) {
86*375daca8SDavid du Colombier 			case D_MSR:
87*375daca8SDavid du Colombier 			case D_SREG:
88*375daca8SDavid du Colombier 			case D_SPR:
89*375daca8SDavid du Colombier 			case D_FPSCR:
90*375daca8SDavid du Colombier 			case D_CREG:
91*375daca8SDavid du Colombier 			case D_DCR:
92*375daca8SDavid du Colombier 				p->mark |= LABEL|SYNC;
93*375daca8SDavid du Colombier 			}
94*375daca8SDavid du Colombier 			switch(p->to.type) {
95*375daca8SDavid du Colombier 			case D_MSR:
96*375daca8SDavid du Colombier 			case D_SREG:
97*375daca8SDavid du Colombier 			case D_SPR:
98*375daca8SDavid du Colombier 			case D_FPSCR:
99*375daca8SDavid du Colombier 			case D_CREG:
100*375daca8SDavid du Colombier 			case D_DCR:
101*375daca8SDavid du Colombier 				p->mark |= LABEL|SYNC;
102*375daca8SDavid du Colombier 			}
103*375daca8SDavid du Colombier 			continue;
104*375daca8SDavid du Colombier 
1057dd7cddfSDavid du Colombier 		case AFABS:
1067dd7cddfSDavid du Colombier 		case AFABSCC:
1077dd7cddfSDavid du Colombier 		case AFADD:
1087dd7cddfSDavid du Colombier 		case AFADDCC:
1097dd7cddfSDavid du Colombier 		case AFCTIW:
1107dd7cddfSDavid du Colombier 		case AFCTIWCC:
1117dd7cddfSDavid du Colombier 		case AFCTIWZ:
1127dd7cddfSDavid du Colombier 		case AFCTIWZCC:
1137dd7cddfSDavid du Colombier 		case AFDIV:
1147dd7cddfSDavid du Colombier 		case AFDIVCC:
1157dd7cddfSDavid du Colombier 		case AFMADD:
1167dd7cddfSDavid du Colombier 		case AFMADDCC:
1177dd7cddfSDavid du Colombier 		case AFMOVD:
1187dd7cddfSDavid du Colombier 		case AFMOVDU:
1197dd7cddfSDavid du Colombier 		/* case AFMOVDS: */
1207dd7cddfSDavid du Colombier 		case AFMOVS:
1217dd7cddfSDavid du Colombier 		case AFMOVSU:
1227dd7cddfSDavid du Colombier 		/* case AFMOVSD: */
1237dd7cddfSDavid du Colombier 		case AFMSUB:
1247dd7cddfSDavid du Colombier 		case AFMSUBCC:
1257dd7cddfSDavid du Colombier 		case AFMUL:
1267dd7cddfSDavid du Colombier 		case AFMULCC:
1277dd7cddfSDavid du Colombier 		case AFNABS:
1287dd7cddfSDavid du Colombier 		case AFNABSCC:
1297dd7cddfSDavid du Colombier 		case AFNEG:
1307dd7cddfSDavid du Colombier 		case AFNEGCC:
1317dd7cddfSDavid du Colombier 		case AFNMADD:
1327dd7cddfSDavid du Colombier 		case AFNMADDCC:
1337dd7cddfSDavid du Colombier 		case AFNMSUB:
1347dd7cddfSDavid du Colombier 		case AFNMSUBCC:
1357dd7cddfSDavid du Colombier 		case AFRSP:
1367dd7cddfSDavid du Colombier 		case AFRSPCC:
1377dd7cddfSDavid du Colombier 		case AFSUB:
1387dd7cddfSDavid du Colombier 		case AFSUBCC:
1397dd7cddfSDavid du Colombier 			q = p;
1407dd7cddfSDavid du Colombier 			p->mark |= FLOAT;
1417dd7cddfSDavid du Colombier 			continue;
1427dd7cddfSDavid du Colombier 
1437dd7cddfSDavid du Colombier 		case ABL:
1447dd7cddfSDavid du Colombier 		case ABCL:
1457dd7cddfSDavid du Colombier 			if(curtext != P)
1467dd7cddfSDavid du Colombier 				curtext->mark &= ~LEAF;
1477dd7cddfSDavid du Colombier 
1487dd7cddfSDavid du Colombier 		case ABC:
1497dd7cddfSDavid du Colombier 		case ABEQ:
1507dd7cddfSDavid du Colombier 		case ABGE:
1517dd7cddfSDavid du Colombier 		case ABGT:
1527dd7cddfSDavid du Colombier 		case ABLE:
1537dd7cddfSDavid du Colombier 		case ABLT:
1547dd7cddfSDavid du Colombier 		case ABNE:
1557dd7cddfSDavid du Colombier 		case ABR:
1567dd7cddfSDavid du Colombier 		case ABVC:
1577dd7cddfSDavid du Colombier 		case ABVS:
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier 			p->mark |= BRANCH;
1607dd7cddfSDavid du Colombier 			q = p;
1617dd7cddfSDavid du Colombier 			q1 = p->cond;
1627dd7cddfSDavid du Colombier 			if(q1 != P) {
1637dd7cddfSDavid du Colombier 				while(q1->as == ANOP) {
1647dd7cddfSDavid du Colombier 					q1 = q1->link;
1657dd7cddfSDavid du Colombier 					p->cond = q1;
1667dd7cddfSDavid du Colombier 				}
1677dd7cddfSDavid du Colombier 				if(!(q1->mark & LEAF))
1687dd7cddfSDavid du Colombier 					q1->mark |= LABEL;
1697dd7cddfSDavid du Colombier 			} else
1707dd7cddfSDavid du Colombier 				p->mark |= LABEL;
1717dd7cddfSDavid du Colombier 			q1 = p->link;
1727dd7cddfSDavid du Colombier 			if(q1 != P)
1737dd7cddfSDavid du Colombier 				q1->mark |= LABEL;
1747dd7cddfSDavid du Colombier 			continue;
1757dd7cddfSDavid du Colombier 
1767dd7cddfSDavid du Colombier 		case AFCMPO:
1777dd7cddfSDavid du Colombier 		case AFCMPU:
1787dd7cddfSDavid du Colombier 			q = p;
1797dd7cddfSDavid du Colombier 			p->mark |= FCMP|FLOAT;
1807dd7cddfSDavid du Colombier 			continue;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier 		case ARETURN:
1837dd7cddfSDavid du Colombier 			/* special form of RETURN is BECOME */
1847dd7cddfSDavid du Colombier 			if(p->from.type == D_CONST)
1857dd7cddfSDavid du Colombier 				if(p->from.offset > curbecome)
1867dd7cddfSDavid du Colombier 					curbecome = p->from.offset;
1877dd7cddfSDavid du Colombier 
1887dd7cddfSDavid du Colombier 			q = p;
1897dd7cddfSDavid du Colombier 			if(p->link != P)
1907dd7cddfSDavid du Colombier 				p->link->mark |= LABEL;
1917dd7cddfSDavid du Colombier 			continue;
1927dd7cddfSDavid du Colombier 
1937dd7cddfSDavid du Colombier 		case ANOP:
1947dd7cddfSDavid du Colombier 			q1 = p->link;
1957dd7cddfSDavid du Colombier 			q->link = q1;		/* q is non-nop */
1967dd7cddfSDavid du Colombier 			q1->mark |= p->mark;
1977dd7cddfSDavid du Colombier 			continue;
1987dd7cddfSDavid du Colombier 
1997dd7cddfSDavid du Colombier 		default:
2007dd7cddfSDavid du Colombier 			q = p;
2017dd7cddfSDavid du Colombier 			continue;
2027dd7cddfSDavid du Colombier 		}
2037dd7cddfSDavid du Colombier 	}
2047dd7cddfSDavid du Colombier 	if(curtext && curtext->from.sym) {
2057dd7cddfSDavid du Colombier 		curtext->from.sym->frame = curframe;
2067dd7cddfSDavid du Colombier 		curtext->from.sym->become = curbecome;
2077dd7cddfSDavid du Colombier 		if(curbecome > maxbecome)
2087dd7cddfSDavid du Colombier 			maxbecome = curbecome;
2097dd7cddfSDavid du Colombier 	}
2107dd7cddfSDavid du Colombier 
2117dd7cddfSDavid du Colombier 	if(debug['b'])
2127dd7cddfSDavid du Colombier 		print("max become = %d\n", maxbecome);
2137dd7cddfSDavid du Colombier 	xdefine("ALEFbecome", STEXT, maxbecome);
2147dd7cddfSDavid du Colombier 
2157dd7cddfSDavid du Colombier 	curtext = 0;
2167dd7cddfSDavid du Colombier 	for(p = firstp; p != P; p = p->link) {
2177dd7cddfSDavid du Colombier 		switch(p->as) {
2187dd7cddfSDavid du Colombier 		case ATEXT:
2197dd7cddfSDavid du Colombier 			curtext = p;
2207dd7cddfSDavid du Colombier 			break;
2217dd7cddfSDavid du Colombier 
2227dd7cddfSDavid du Colombier 		case ABL:	/* ABCL? */
2237dd7cddfSDavid du Colombier 			if(curtext != P && curtext->from.sym != S && curtext->to.offset >= 0) {
2247dd7cddfSDavid du Colombier 				o = maxbecome - curtext->from.sym->frame;
2257dd7cddfSDavid du Colombier 				if(o <= 0)
2267dd7cddfSDavid du Colombier 					break;
2277dd7cddfSDavid du Colombier 				/* calling a become or calling a variable */
2287dd7cddfSDavid du Colombier 				if(p->to.sym == S || p->to.sym->become) {
2297dd7cddfSDavid du Colombier 					curtext->to.offset += o;
2307dd7cddfSDavid du Colombier 					if(debug['b']) {
2317dd7cddfSDavid du Colombier 						curp = p;
2327dd7cddfSDavid du Colombier 						print("%D calling %D increase %d\n",
2337dd7cddfSDavid du Colombier 							&curtext->from, &p->to, o);
2347dd7cddfSDavid du Colombier 					}
2357dd7cddfSDavid du Colombier 				}
2367dd7cddfSDavid du Colombier 			}
2377dd7cddfSDavid du Colombier 			break;
2387dd7cddfSDavid du Colombier 		}
2397dd7cddfSDavid du Colombier 	}
2407dd7cddfSDavid du Colombier 
2417dd7cddfSDavid du Colombier 	curtext = P;
2427dd7cddfSDavid du Colombier 	for(p = firstp; p != P; p = p->link) {
2437dd7cddfSDavid du Colombier 		o = p->as;
2447dd7cddfSDavid du Colombier 		switch(o) {
2457dd7cddfSDavid du Colombier 		case ATEXT:
246*375daca8SDavid du Colombier 			mov = AMOVW;
247*375daca8SDavid du Colombier 			aoffset = 0;
2487dd7cddfSDavid du Colombier 			curtext = p;
2497dd7cddfSDavid du Colombier 			autosize = p->to.offset + 4;
2507dd7cddfSDavid du Colombier 			if((p->mark & LEAF) && autosize <= 4)
2517dd7cddfSDavid du Colombier 				autosize = 0;
2527dd7cddfSDavid du Colombier 			else
2537dd7cddfSDavid du Colombier 				if(autosize & 4)
2547dd7cddfSDavid du Colombier 					autosize += 4;
2557dd7cddfSDavid du Colombier 			p->to.offset = autosize - 4;
2567dd7cddfSDavid du Colombier 
2577dd7cddfSDavid du Colombier 			q = p;
2587dd7cddfSDavid du Colombier 			if(autosize) {
259*375daca8SDavid du Colombier 				/* use MOVWU to adjust R1 when saving R31, if autosize is small */
260*375daca8SDavid du Colombier 				if(!(curtext->mark & LEAF) && autosize >= -BIG && autosize <= BIG) {
261*375daca8SDavid du Colombier 					mov = AMOVWU;
262*375daca8SDavid du Colombier 					aoffset = -autosize;
263*375daca8SDavid du Colombier 				} else {
2647dd7cddfSDavid du Colombier 					q = prg();
2657dd7cddfSDavid du Colombier 					q->as = AADD;
2667dd7cddfSDavid du Colombier 					q->line = p->line;
2677dd7cddfSDavid du Colombier 					q->from.type = D_CONST;
2687dd7cddfSDavid du Colombier 					q->from.offset = -autosize;
2697dd7cddfSDavid du Colombier 					q->to.type = D_REG;
2707dd7cddfSDavid du Colombier 					q->to.reg = REGSP;
2717dd7cddfSDavid du Colombier 
2727dd7cddfSDavid du Colombier 					q->link = p->link;
2737dd7cddfSDavid du Colombier 					p->link = q;
274*375daca8SDavid du Colombier 				}
2757dd7cddfSDavid du Colombier 			} else
2767dd7cddfSDavid du Colombier 			if(!(curtext->mark & LEAF)) {
2777dd7cddfSDavid du Colombier 				if(debug['v'])
2787dd7cddfSDavid du Colombier 					Bprint(&bso, "save suppressed in: %s\n",
2797dd7cddfSDavid du Colombier 						curtext->from.sym->name);
2807dd7cddfSDavid du Colombier 				curtext->mark |= LEAF;
2817dd7cddfSDavid du Colombier 			}
2827dd7cddfSDavid du Colombier 
2837dd7cddfSDavid du Colombier 			if(curtext->mark & LEAF) {
2847dd7cddfSDavid du Colombier 				if(curtext->from.sym)
2857dd7cddfSDavid du Colombier 					curtext->from.sym->type = SLEAF;
2867dd7cddfSDavid du Colombier 				break;
2877dd7cddfSDavid du Colombier 			}
2887dd7cddfSDavid du Colombier 
2897dd7cddfSDavid du Colombier 			q1 = prg();
290*375daca8SDavid du Colombier 			q1->as = mov;
2917dd7cddfSDavid du Colombier 			q1->line = p->line;
2927dd7cddfSDavid du Colombier 			q1->from.type = D_REG;
2937dd7cddfSDavid du Colombier 			q1->from.reg = REGTMP;
2947dd7cddfSDavid du Colombier 			q1->to.type = D_OREG;
295*375daca8SDavid du Colombier 			q1->to.offset = aoffset;
2967dd7cddfSDavid du Colombier 			q1->to.reg = REGSP;
2977dd7cddfSDavid du Colombier 
2987dd7cddfSDavid du Colombier 			q1->link = q->link;
2997dd7cddfSDavid du Colombier 			q->link = q1;
3007dd7cddfSDavid du Colombier 
3017dd7cddfSDavid du Colombier 			q1 = prg();
3027dd7cddfSDavid du Colombier 			q1->as = AMOVW;
3037dd7cddfSDavid du Colombier 			q1->line = p->line;
3047dd7cddfSDavid du Colombier 			q1->from.type = D_SPR;
3057dd7cddfSDavid du Colombier 			q1->from.offset = D_LR;
3067dd7cddfSDavid du Colombier 			q1->to.type = D_REG;
3077dd7cddfSDavid du Colombier 			q1->to.reg = REGTMP;
3087dd7cddfSDavid du Colombier 
3097dd7cddfSDavid du Colombier 			q1->link = q->link;
3107dd7cddfSDavid du Colombier 			q->link = q1;
3117dd7cddfSDavid du Colombier 			break;
3127dd7cddfSDavid du Colombier 
3137dd7cddfSDavid du Colombier 		case ARETURN:
3147dd7cddfSDavid du Colombier 			if(p->from.type == D_CONST)
3157dd7cddfSDavid du Colombier 				goto become;
3167dd7cddfSDavid du Colombier 			if(curtext->mark & LEAF) {
3177dd7cddfSDavid du Colombier 				if(!autosize) {
3187dd7cddfSDavid du Colombier 					p->as = ABR;
3197dd7cddfSDavid du Colombier 					p->from = zprg.from;
3207dd7cddfSDavid du Colombier 					p->to.type = D_SPR;
3217dd7cddfSDavid du Colombier 					p->to.offset = D_LR;
3227dd7cddfSDavid du Colombier 					p->mark |= BRANCH;
3237dd7cddfSDavid du Colombier 					break;
3247dd7cddfSDavid du Colombier 				}
3257dd7cddfSDavid du Colombier 
3267dd7cddfSDavid du Colombier 				p->as = AADD;
3277dd7cddfSDavid du Colombier 				p->from.type = D_CONST;
3287dd7cddfSDavid du Colombier 				p->from.offset = autosize;
3297dd7cddfSDavid du Colombier 				p->to.type = D_REG;
3307dd7cddfSDavid du Colombier 				p->to.reg = REGSP;
3317dd7cddfSDavid du Colombier 
3327dd7cddfSDavid du Colombier 				q = prg();
3337dd7cddfSDavid du Colombier 				q->as = ABR;
3347dd7cddfSDavid du Colombier 				q->line = p->line;
3357dd7cddfSDavid du Colombier 				q->to.type = D_SPR;
3367dd7cddfSDavid du Colombier 				q->to.offset = D_LR;
3377dd7cddfSDavid du Colombier 				q->mark |= BRANCH;
3387dd7cddfSDavid du Colombier 
3397dd7cddfSDavid du Colombier 				q->link = p->link;
3407dd7cddfSDavid du Colombier 				p->link = q;
3417dd7cddfSDavid du Colombier 				break;
3427dd7cddfSDavid du Colombier 			}
3437dd7cddfSDavid du Colombier 
3447dd7cddfSDavid du Colombier 			p->as = AMOVW;
3457dd7cddfSDavid du Colombier 			p->from.type = D_OREG;
3467dd7cddfSDavid du Colombier 			p->from.offset = 0;
3477dd7cddfSDavid du Colombier 			p->from.reg = REGSP;
3487dd7cddfSDavid du Colombier 			p->to.type = D_REG;
3497dd7cddfSDavid du Colombier 			p->to.reg = REGTMP;
3507dd7cddfSDavid du Colombier 
3517dd7cddfSDavid du Colombier 			q = prg();
3527dd7cddfSDavid du Colombier 			q->as = AMOVW;
3537dd7cddfSDavid du Colombier 			q->line = p->line;
3547dd7cddfSDavid du Colombier 			q->from.type = D_REG;
3557dd7cddfSDavid du Colombier 			q->from.reg = REGTMP;
3567dd7cddfSDavid du Colombier 			q->to.type = D_SPR;
3577dd7cddfSDavid du Colombier 			q->to.offset = D_LR;
3587dd7cddfSDavid du Colombier 
3597dd7cddfSDavid du Colombier 			q->link = p->link;
3607dd7cddfSDavid du Colombier 			p->link = q;
3617dd7cddfSDavid du Colombier 			p = q;
3627dd7cddfSDavid du Colombier 
3637dd7cddfSDavid du Colombier 			if(autosize) {
3647dd7cddfSDavid du Colombier 				q = prg();
3657dd7cddfSDavid du Colombier 				q->as = AADD;
3667dd7cddfSDavid du Colombier 				q->line = p->line;
3677dd7cddfSDavid du Colombier 				q->from.type = D_CONST;
3687dd7cddfSDavid du Colombier 				q->from.offset = autosize;
3697dd7cddfSDavid du Colombier 				q->to.type = D_REG;
3707dd7cddfSDavid du Colombier 				q->to.reg = REGSP;
3717dd7cddfSDavid du Colombier 
3727dd7cddfSDavid du Colombier 				q->link = p->link;
3737dd7cddfSDavid du Colombier 				p->link = q;
3747dd7cddfSDavid du Colombier 			}
3757dd7cddfSDavid du Colombier 
376*375daca8SDavid du Colombier 			q1 = prg();
377*375daca8SDavid du Colombier 			q1->as = ABR;
378*375daca8SDavid du Colombier 			q1->line = p->line;
379*375daca8SDavid du Colombier 			q1->to.type = D_SPR;
380*375daca8SDavid du Colombier 			q1->to.offset = D_LR;
381*375daca8SDavid du Colombier 			q1->mark |= BRANCH;
3827dd7cddfSDavid du Colombier 
383*375daca8SDavid du Colombier 			q1->link = q->link;
384*375daca8SDavid du Colombier 			q->link = q1;
3857dd7cddfSDavid du Colombier 			break;
3867dd7cddfSDavid du Colombier 
3877dd7cddfSDavid du Colombier 		become:
3887dd7cddfSDavid du Colombier 			if(curtext->mark & LEAF) {
3897dd7cddfSDavid du Colombier 
3907dd7cddfSDavid du Colombier 				q = prg();
3917dd7cddfSDavid du Colombier 				q->line = p->line;
3927dd7cddfSDavid du Colombier 				q->as = ABR;
3937dd7cddfSDavid du Colombier 				q->from = zprg.from;
3947dd7cddfSDavid du Colombier 				q->to = p->to;
3957dd7cddfSDavid du Colombier 				q->cond = p->cond;
3967dd7cddfSDavid du Colombier 				q->link = p->link;
3977dd7cddfSDavid du Colombier 				q->mark |= BRANCH;
3987dd7cddfSDavid du Colombier 				p->link = q;
3997dd7cddfSDavid du Colombier 
4007dd7cddfSDavid du Colombier 				p->as = AADD;
4017dd7cddfSDavid du Colombier 				p->from = zprg.from;
4027dd7cddfSDavid du Colombier 				p->from.type = D_CONST;
4037dd7cddfSDavid du Colombier 				p->from.offset = autosize;
4047dd7cddfSDavid du Colombier 				p->to = zprg.to;
4057dd7cddfSDavid du Colombier 				p->to.type = D_REG;
4067dd7cddfSDavid du Colombier 				p->to.reg = REGSP;
4077dd7cddfSDavid du Colombier 
4087dd7cddfSDavid du Colombier 				break;
4097dd7cddfSDavid du Colombier 			}
4107dd7cddfSDavid du Colombier 			q = prg();
4117dd7cddfSDavid du Colombier 			q->line = p->line;
4127dd7cddfSDavid du Colombier 			q->as = ABR;
4137dd7cddfSDavid du Colombier 			q->from = zprg.from;
4147dd7cddfSDavid du Colombier 			q->to = p->to;
4157dd7cddfSDavid du Colombier 			q->cond = p->cond;
4167dd7cddfSDavid du Colombier 			q->mark |= BRANCH;
4177dd7cddfSDavid du Colombier 			q->link = p->link;
4187dd7cddfSDavid du Colombier 			p->link = q;
4197dd7cddfSDavid du Colombier 
4207dd7cddfSDavid du Colombier 			q = prg();
4217dd7cddfSDavid du Colombier 			q->line = p->line;
4227dd7cddfSDavid du Colombier 			q->as = AADD;
4237dd7cddfSDavid du Colombier 			q->from.type = D_CONST;
4247dd7cddfSDavid du Colombier 			q->from.offset = autosize;
4257dd7cddfSDavid du Colombier 			q->to.type = D_REG;
4267dd7cddfSDavid du Colombier 			q->to.reg = REGSP;
4277dd7cddfSDavid du Colombier 			q->link = p->link;
4287dd7cddfSDavid du Colombier 			p->link = q;
4297dd7cddfSDavid du Colombier 
430*375daca8SDavid du Colombier 			q = prg();
431*375daca8SDavid du Colombier 			q->line = p->line;
432*375daca8SDavid du Colombier 			q->as = AMOVW;
433*375daca8SDavid du Colombier 			q->line = p->line;
434*375daca8SDavid du Colombier 			q->from.type = D_REG;
435*375daca8SDavid du Colombier 			q->from.reg = REGTMP;
436*375daca8SDavid du Colombier 			q->to.type = D_SPR;
437*375daca8SDavid du Colombier 			q->to.offset = D_LR;
438*375daca8SDavid du Colombier 			q->link = p->link;
439*375daca8SDavid du Colombier 			p->link = q;
440*375daca8SDavid du Colombier 
4417dd7cddfSDavid du Colombier 			p->as = AMOVW;
4427dd7cddfSDavid du Colombier 			p->from = zprg.from;
4437dd7cddfSDavid du Colombier 			p->from.type = D_OREG;
4447dd7cddfSDavid du Colombier 			p->from.offset = 0;
4457dd7cddfSDavid du Colombier 			p->from.reg = REGSP;
4467dd7cddfSDavid du Colombier 			p->to = zprg.to;
4477dd7cddfSDavid du Colombier 			p->to.type = D_REG;
4487dd7cddfSDavid du Colombier 			p->to.reg = REGTMP;
4497dd7cddfSDavid du Colombier 
4507dd7cddfSDavid du Colombier 			break;
4517dd7cddfSDavid du Colombier 		}
4527dd7cddfSDavid du Colombier 	}
4537dd7cddfSDavid du Colombier 
454*375daca8SDavid du Colombier 	if(debug['Q'] == 0)
455*375daca8SDavid du Colombier 		return;
456*375daca8SDavid du Colombier 
4577dd7cddfSDavid du Colombier 	curtext = P;
4587dd7cddfSDavid du Colombier 	q = P;		/* p - 1 */
4597dd7cddfSDavid du Colombier 	q1 = firstp;	/* top of block */
4607dd7cddfSDavid du Colombier 	o = 0;		/* count of instructions */
4617dd7cddfSDavid du Colombier 	for(p = firstp; p != P; p = p1) {
4627dd7cddfSDavid du Colombier 		p1 = p->link;
4637dd7cddfSDavid du Colombier 		o++;
4647dd7cddfSDavid du Colombier 		if(p->mark & NOSCHED){
4657dd7cddfSDavid du Colombier 			if(q1 != p){
4667dd7cddfSDavid du Colombier 				sched(q1, q);
4677dd7cddfSDavid du Colombier 			}
4687dd7cddfSDavid du Colombier 			for(; p != P; p = p->link){
4697dd7cddfSDavid du Colombier 				if(!(p->mark & NOSCHED))
4707dd7cddfSDavid du Colombier 					break;
4717dd7cddfSDavid du Colombier 				q = p;
4727dd7cddfSDavid du Colombier 			}
4737dd7cddfSDavid du Colombier 			p1 = p;
4747dd7cddfSDavid du Colombier 			q1 = p;
4757dd7cddfSDavid du Colombier 			o = 0;
4767dd7cddfSDavid du Colombier 			continue;
4777dd7cddfSDavid du Colombier 		}
4787dd7cddfSDavid du Colombier 		if(p->mark & (LABEL|SYNC)) {
4797dd7cddfSDavid du Colombier 			if(q1 != p)
4807dd7cddfSDavid du Colombier 				sched(q1, q);
4817dd7cddfSDavid du Colombier 			q1 = p;
4827dd7cddfSDavid du Colombier 			o = 1;
4837dd7cddfSDavid du Colombier 		}
4847dd7cddfSDavid du Colombier 		if(p->mark & (BRANCH|SYNC)) {
4857dd7cddfSDavid du Colombier 			sched(q1, p);
4867dd7cddfSDavid du Colombier 			q1 = p1;
4877dd7cddfSDavid du Colombier 			o = 0;
4887dd7cddfSDavid du Colombier 		}
4897dd7cddfSDavid du Colombier 		if(o >= NSCHED) {
4907dd7cddfSDavid du Colombier 			sched(q1, p);
4917dd7cddfSDavid du Colombier 			q1 = p1;
4927dd7cddfSDavid du Colombier 			o = 0;
4937dd7cddfSDavid du Colombier 		}
4947dd7cddfSDavid du Colombier 		q = p;
4957dd7cddfSDavid du Colombier 	}
4967dd7cddfSDavid du Colombier }
4977dd7cddfSDavid du Colombier 
4987dd7cddfSDavid du Colombier void
addnop(Prog * p)4997dd7cddfSDavid du Colombier addnop(Prog *p)
5007dd7cddfSDavid du Colombier {
5017dd7cddfSDavid du Colombier 	Prog *q;
5027dd7cddfSDavid du Colombier 
5037dd7cddfSDavid du Colombier 	q = prg();
5047dd7cddfSDavid du Colombier 	q->as = ANOR;
5057dd7cddfSDavid du Colombier 	q->line = p->line;
5067dd7cddfSDavid du Colombier 	q->from.type = D_REG;
5077dd7cddfSDavid du Colombier 	q->from.reg = REGZERO;
5087dd7cddfSDavid du Colombier 	q->to.type = D_REG;
5097dd7cddfSDavid du Colombier 	q->to.reg = REGZERO;
5107dd7cddfSDavid du Colombier 
5117dd7cddfSDavid du Colombier 	q->link = p->link;
5127dd7cddfSDavid du Colombier 	p->link = q;
5137dd7cddfSDavid du Colombier }
514