The version of basic copied from Martin Kerstens directory.
This commit is contained in:
86
lang/basic/src.old/split.c
Normal file
86
lang/basic/src.old/split.c
Normal file
@@ -0,0 +1,86 @@
|
||||
#include "bem.h"
|
||||
|
||||
/* 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,*lr2;
|
||||
int 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();
|
||||
}
|
||||
Reference in New Issue
Block a user