#include "l.h"
void
noops(void)
{
Prog *p, *q, *q1;
if(debug['v'])
Bprint(&bso, "%5.2f noops\n", cputime());
Bflush(&bso);
q = P;
for(p = firstp; p != P; p = p->link) {
switch(p->as) {
case ATEXT:
p->mark |= LEAF;
/*p->mark = 0;/**/
curtext = p;
break;
case ABAL:
curtext->mark = 0;
break;
case ANOP:
q = q;
continue;
q1 = p->link;
q->link = q1; /* q is non-nop */
q1->mark |= p->mark;
continue;
}
q = p;
}
curtext = P;
for(p = firstp; p != P; p = p->link) {
switch(p->as) {
case ATEXT:
curtext = p;
autosize = p->to.offset + 4;
if(autosize <= 4)
if(curtext->mark & LEAF) {
p->to.offset = -4;
autosize = 0;
}
q = p;
if(autosize) {
q = prg();
q->as = ASUBO;
q->line = p->line;
q->from.type = D_CONST;
q->from.offset = autosize;
q->to.type = REGSP;
q->link = p->link;
p->link = q;
} else
if(!(curtext->mark & LEAF)) {
if(debug['v'])
Bprint(&bso, "save suppressed in: %s\n",
curtext->from.sym->name);
curtext->mark |= LEAF;
}
if(curtext->mark & LEAF) {
if(curtext->from.sym)
curtext->from.sym->type = SLEAF;
break;
}
q1 = prg();
q1->as = AMOV;
q1->line = p->line;
q1->from.type = REGLINK;
q1->to.type = REGSP+D_INDIR;
q1->link = q->link;
q->link = q1;
break;
case ARTS:
if(curtext->mark & LEAF) {
if(!autosize) {
p->as = AB;
p->from = zprg.from;
p->to.type = REGLINK+D_INDIR;
p->to.offset = 0;
break;
}
p->as = AADDO;
p->from.type = D_CONST;
p->from.offset = autosize;
p->to.type = REGSP;
q = prg();
q->as = AB;
q->line = p->line;
q->to.type = REGLINK+D_INDIR;
q->to.offset = 0;
q->link = p->link;
p->link = q;
break;
}
p->as = AMOV;
p->from.type = REGSP+D_INDIR;
p->from.offset = 0;
p->to.type = REGRET+1;
q = p;
if(autosize) {
q = prg();
q->as = AADDO;
q->line = p->line;
q->from.type = D_CONST;
q->from.offset = autosize;
q->to.type = REGSP;
q->link = p->link;
p->link = q;
}
q1 = prg();
q1->as = AB;
q1->line = p->line;
q1->to.type = REGRET+1+D_INDIR;
q1->to.offset = 0;
q1->link = q->link;
q->link = q1;
break;
}
}
}