/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "bem.h" #ifndef NORSCID static char rcs_id[] = "$Header$" ; #endif /* Split the intermediate code into procedures. This is necessary to make the EM code fit on smaller machines. (for the Peephole optimizer!) */ /* Heuristic is to collect all basic blocks of more then THRESHOLD em instructions into a procedure */ int procnum; int threshold; /* can be set by the user */ fix(lnr) int lnr; { /* this block may not be moved to a procedure */ Linerecord *lr; if(debug) printf("fixate %d\n",lnr); for(lr= firstline;lr; lr=lr->nextline) if( lr->linenr == lnr) lr->fixed=1; } fixblock(l) List *l; { while(l) { fix(l->linenr); l=l->nextlist; } } phase1() { /* copy all offloaded blocks */ Linerecord *lr, *lf; long blksize; lf= lr= firstline; blksize= lr->codelines; while( lr) { if( lr->fixed){ if( !lf->fixed && blksize>threshold) { /*move block */ if(debug) printf("%d %d->%d moved\n", blksize,lf->linenr, lr->linenr); } lf= lr; blksize= lr->codelines; } lr= lr->nextline; } } phase2() { /* copy main procedure */ prolog2(); epilogcode(); } split() { /* selectively copy the intermediate code to procedures */ Linerecord *lr; if( debug) printf("split EM code using %d\n",threshold); /* First consolidate the goto's and caller's */ lr= firstline; while(lr) { fixblock(lr->callers); fixblock(lr->gotos); lr= lr->nextline; } /* Copy the temporary file piecewise */ prologcode(); phase1(); phase2(); }