94 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * (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();
 | 
						|
}
 |