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();
 | |
| }
 |