⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 order.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
# include "mfile2"int fltused = 0;stoasg( p, o ) register NODE *p; {	/* should the assignment op p be stored,	   given that it lies as the right operand of o	   (or the left, if o==UNARY MUL) */	return( shltype(p->left->op, p->left ) );	}deltest( p ) register NODE *p; {	/* should we delay the INCR or DECR operation p */	if( p->op == INCR && p->left->op == REG && spsz( p->left->type, p->right->lval ) ){		/* STARREG */		return( 0 );		}	p = p->left;	if( p->op == UNARY MUL ) p = p->left;	return( p->op == NAME || p->op == OREG || p->op == REG );	}mkadrs(p) register NODE *p; {	register o;	o = p->op;	if( asgop(o) ){		if( p->left->su >= p->right->su ){			if( p->left->op == UNARY MUL ){				if( p->left->su > 0 )					SETSTO( p->left->left, INTEMP );				else {					if( p->right->su > 0 ) SETSTO( p->right, INTEMP );					else cerror( "store finds both sides trivial" );					}				}			else if( p->left->op == FLD && p->left->left->op == UNARY MUL ){				SETSTO( p->left->left->left, INTEMP );				}			else { /* should be only structure assignment */				SETSTO( p->left, INTEMP );				}			}		else SETSTO( p->right, INTEMP );		}	else {		if( p->left->su > p->right->su ){			SETSTO( p->left, INTEMP );			}		else {			SETSTO( p->right, INTEMP );			}		}	}notoff( t, r, off, cp) TWORD t; CONSZ off; char *cp; {	/* is it legal to make an OREG or NAME entry which has an	/* offset of off, (from a register of r), if the	/* resulting thing had type t */	/* return( 1 );  /* NO */	return(0);  /* YES */	}# define max(x,y) ((x)<(y)?(y):(x))# define min(x,y) ((x)<(y)?(x):(y))# define ZCHAR 01# define ZLONG 02# define ZFLOAT 04zum( p, zap ) register NODE *p; {	/* zap Sethi-Ullman number for chars, longs, floats */	/* in the case of longs, only STARNM's are zapped */	/* ZCHAR, ZLONG, ZFLOAT are used to select the zapping */	register su;	su = p->su;	switch( p->type ){	case CHAR:	case UCHAR:		if( !(zap&ZCHAR) ) break;		if( su == 0 ) p->su = su = 1;		break;	case LONG:	case ULONG:		if( !(zap&ZLONG) ) break;		if( p->op == UNARY MUL && su == 0 ) p->su = su = 2;		break;	case FLOAT:		if( !(zap&ZFLOAT) ) break;		if( su == 0 ) p->su = su = 1;		}	return( su );	}sucomp( p ) register NODE *p; {	/* set the su field in the node to the sethi-ullman	   number, or local equivalent */	register o, ty, sul, sur;	register nr;	ty = optype( o=p->op);	nr = szty( p->type );	p->su = 0;	if( ty == LTYPE ) {		if( p->type==FLOAT ) p->su = 1;		return;		}	else if( ty == UTYPE ){		switch( o ) {		case UNARY CALL:		case UNARY STCALL:			p->su = fregs;  /* all regs needed */			return;		case UNARY MUL:			if( shumul( p->left ) ) return;		default:			p->su = max( p->left->su, nr);			return;			}		}	/* If rhs needs n, lhs needs m, regular su computation */	sul = p->left->su;	sur = p->right->su;	if( o == ASSIGN ){		asop:  /* also used for +=, etc., to memory */		if( sul==0 ){			/* don't need to worry about the left side */			p->su = max( sur, nr );			}		else {			/* right, left address, op */			if( sur == 0 ){				/* just get the lhs address into a register, and mov */				/* the `nr' covers the case where value is in reg afterwards */				p->su = max( sul, nr );				}			else {				/* right, left address, op */				p->su = max( sur, nr+sul );				}			}		return;		}	if( o == CALL || o == STCALL ){		/* in effect, takes all free registers */		p->su = fregs;		return;		}	if( o == STASG ){		/* right, then left */		p->su = max( max( sul+nr, sur), fregs );		return;		}	if( logop(o) ){		/* do the harder side, then the easier side, into registers */		/* left then right, max(sul,sur+nr) */		/* right then left, max(sur,sul+nr) */		/* to hold both sides in regs: nr+nr */		nr = szty( p->left->type );		sul = zum( p->left, ZLONG|ZCHAR|ZFLOAT );		sur = zum( p->right, ZLONG|ZCHAR|ZFLOAT );		p->su = min( max(sul,sur+nr), max(sur,sul+nr) );		return;		}	if( asgop(o) ){		/* computed by doing right, doing left address, doing left, op, and store */		switch( o ) {		case INCR:		case DECR:			/* do as binary op */			break;		case ASG DIV:		case ASG MOD:		case ASG MUL:			if( p->type!=FLOAT && p->type!=DOUBLE ) nr = fregs;			goto gencase;		case ASG PLUS:		case ASG MINUS:		case ASG AND:  /* really bic */		case ASG OR:			if( p->type == INT || p->type == UNSIGNED || ISPTR(p->type) ) goto asop;		gencase:		default:			sur = zum( p->right, ZCHAR|ZLONG|ZFLOAT );			if( sur == 0 ){ /* easy case: if addressable,				do left value, op, store */				if( sul == 0 ) p->su = nr;				/* harder: left adr, val, op, store */				else p->su = max( sul, nr+1 );				}			else { /* do right, left adr, left value, op, store */				if( sul == 0 ){  /* right, left value, op, store */					p->su = max( sur, nr+nr );					}				else {					p->su = max( sur, max( sul+nr, 1+nr+nr ) );					}				}			return;			}		}	switch( o ){	case ANDAND:	case OROR:	case QUEST:	case COLON:	case COMOP:		p->su = max( max(sul,sur), nr);		return;		}	if( ( o==DIV || o==MOD || o==MUL )	    && p->type!=FLOAT && p->type!=DOUBLE ) nr = fregs;	if( o==PLUS || o==MUL || o==OR || o==ER ){		/* AND is ruined by the hardware */		/* permute: get the harder on the left */		register rt, lt;		if( istnode( p->left ) || sul > sur ) goto noswap;  /* don't do it! */		/* look for a funny type on the left, one on the right */		lt = p->left->type;		rt = p->right->type;		if( rt == FLOAT && lt == DOUBLE ) goto swap;		if( (rt==CHAR||rt==UCHAR) && (lt==INT||lt==UNSIGNED||ISPTR(lt)) ) goto swap;		if( lt==LONG || lt==ULONG ){			if( rt==LONG || rt==ULONG ){				/* if one is a STARNM, swap */				if( p->left->op == UNARY MUL && sul==0 ) goto noswap;				if( p->right->op == UNARY MUL && p->left->op != UNARY MUL ) goto swap;				goto noswap;				}			else if( p->left->op == UNARY MUL && sul == 0 ) goto noswap;			else goto swap;  /* put long on right, unless STARNM */			}		/* we are finished with the type stuff now; if one is addressable,			put it on the right */		if( sul == 0 && sur != 0 ){			NODE *s;			int ssu;		swap:			ssu = sul;  sul = sur; sur = ssu;			s = p->left;  p->left = p->right; p->right = s;			}		}	noswap:	sur = zum( p->right, ZCHAR|ZLONG|ZFLOAT );	if( sur == 0 ){		/* get left value into a register, do op */		p->su = max( nr, sul );		}	else {		/* do harder into a register, then easier */		p->su = max( nr+nr, min( max( sul, nr+sur ), max( sur, nr+sul ) ) );		}	}int radebug = 0;mkrall( p, r ) register NODE *p; {	/* insure that the use of p gets done with register r; in effect, */	/* simulate offstar */	if( p->op == FLD ){		p->left->rall = p->rall;		p = p->left;		}	if( p->op != UNARY MUL ) return;  /* no more to do */	p = p->left;	if( p->op == UNARY MUL ){		p->rall = r;		p = p->left;		}	if( p->op == PLUS && p->right->op == ICON ){		p->rall = r;		p = p->left;		}	rallo( p, r );	}rallo( p, down ) register NODE *p; {	/* do register allocation */	register o, type, down1, down2, ty;	if( radebug ) printf( "rallo( %o, %o )\n", p, down );	down2 = NOPREF;	p->rall = down;	down1 = ( down &= ~MUSTDO );	ty = optype( o = p->op );	type = p->type;	if( type == DOUBLE || type == FLOAT ){		if( o == FORCE ) down1 = FR0|MUSTDO;		++fltused;		}	else switch( o ) {	case ASSIGN:			down1 = NOPREF;		down2 = down;		break;	case ASG MUL:	case ASG DIV:	case ASG MOD:		/* keep the addresses out of the hair of (r0,r1) */		if(fregs == 2 ){			/* lhs in (r0,r1), nothing else matters */			down1 = R1|MUSTDO;			down2 = NOPREF;			break;			}		/* at least 3 regs free */		/* compute lhs in (r0,r1), address of left in r2 */		p->left->rall = R1|MUSTDO;		mkrall( p->left, R2|MUSTDO );		/* now, deal with right */		if( fregs == 3 ) rallo( p->right, NOPREF );		else {			/* put address of long or value here */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -