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