File:  [Research Unix] / researchv10no / cmd / ccom / vax / tests / 7.i
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

/* local2.c */
extern	struct	_iobuf {
	int	_cnt;
	char	*_ptr;
	char	*_base;
	short	_flag;
	char	_file;
} _iob[20];
struct _iobuf	*fopen();
struct _iobuf	*fdopen();
struct _iobuf	*freopen();
long	ftell();
char	*fgets();
	char		*hash();
	char		*savestr();
	char		*tstr();
	extern int	tstrused;
	extern char	*tstrbuf[];
	extern char	**curtstr;
extern int nerrors;  
typedef union ndu NODE;
typedef unsigned int TWORD;
typedef long CONSZ;  
	
	
extern int dope[];  
extern char *opst[];  
	
union ndu {
	struct {
		int op;
		int goal;
		TWORD type;
		int cst[(6+4)];
		char * name;
		char pad[8  -sizeof(char *)];	
		NODE *left;
		NODE *right;
	}in;	
	
	struct {
		int op;
		int goal;
		TWORD type;
		int cst[(6+4)];
		char * name;
		char pad[8  -sizeof(char *)];	
		CONSZ lval;
		int rval;
	}tn;	
	
	struct {
		int op;
		int goal;
		TWORD type;
		int cst[(6+4)];
		int label;  
		int lop;  
	}bn;	
	struct {
		int op;
		int goal;
		TWORD type;
		int cst[(6+4)];
		int stsize;  
		short stalign;  
		short argsize;  
	}stn;	
	struct {
		int op;
		int goal;
		TWORD type;
		int cdim;
		int csiz;
	}fn;	
	
	struct {
		
		int op;
		int goal;
		TWORD type;
		int cdim;
		int csiz;
		double dval;
	}fpn;	
};
	
	
		
	
	
	
 
	
extern int busy[];
extern NODE node[];
typedef struct shape SHAPE;
	
extern struct shape {
	int	op;	
	SHAPE	*sl;	
	SHAPE	*sr;
	int	sh;	
	int	sc;	
} shapes[];
extern SHAPE	*pshape[];
typedef struct optab OPTAB;
struct optab {
	int	op;	
	int	tyop;	
	OPTAB	*nextop;
	SHAPE	**lshape;	
	int	ltype;		
	SHAPE	**rshape;	
	int	rtype;
	int	needs;
	int	rewrite;
	char	*cstring;
	int	cost;
	int	lcount;		
	int	rcount;		
	int	stinline;	
};
extern OPTAB
	*match(),
	*ophead[],
	table[];
extern NODE resc[];
extern int tmpoff;
extern int maxboff;
extern int maxtemp;
extern int maxarg;
extern int ftnno;
extern int sideff;
extern NODE
	*talloc(),
	*ind2type(),
	*tcopy(),
	*getadr(),
	*getlr();
extern CONSZ rdin();
extern char *rnames[];
extern int lineno;
extern char ftitle[];
extern int fldshf, fldsz;
extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug;
extern int fast;  
	
	
	
	
typedef struct inst INST;
struct inst {
	NODE	*p;
	OPTAB	*q;
	int	goal;
};
extern INST inst[300];
extern nins;
	
	
typedef SHAPE	*SHTABLE[2][20];
extern SHTABLE	sha;
eobl2()			
{
}
char *
exname( ix )
char *ix;
{
	
	static char text[100];
	if( ix == 0 ) cerror("no name in exname");
	sprintf( text, "_%s", ix );
	return( text );
}
lineid( l, fn )
int l;
char *fn;
{
	extern int gdebug;
	
	printf( "#	line %d, file %s\n", l, fn );
}
deflab( n )
int n;
{
	printf( "L%d:\n", n );
}
genubr( n )
int n;
{
	
	printf( "	jbr	L%d\n", n );
}
genret( s, l, n )
int s, l, n;
{
	
	
	deflab(n);
	if( s ) printf( "	movab	L%d,r0\n", l );
	dbfunret();
	printf( "	ret\n" );
}
defalign(n)
int n;
{
	
	if( n % 8 ) cerror( "funny alignment: %d", n );
	else n /= 8;
	if( n == 1 ) return;
	else if( n==2 ) n=1;
	else if( n==4 ) n=2;
	else cerror( "funny alignment: %d", n );
	printf( "	.align	%d\n", n );
}
char *locnames[] = {
	
	"	.text\n",
	"	.data\n",
	"	.data\n",
	"	.data	2\n",
	"	.data	1\n",
	};
bycode( t, i )
int t, i;
{
	
	i &= 07;
	if( t < 0 )
	{ 
		if( i != 0 ) printf("\n");
	}
	else
	{ 
		if( i == 0 ) printf( "\n	.byte	" );
		else printf(",");
		printf("0x%x", t);
	}
}
genshort( s )
short s;
{
	
	printf( "	.short	%d\n", (short) s );
}
genlong( l )
long l;
{
	
	printf( "	.long	0x%lx\n", l );
}
char *
rnames[]= {  
	"r0", "r1",
	"r2", "r3", "r4",
	"r5", "r6", "r7", "r8", "r9", "r10", "r11",
	"ap", "fp", "sp", "pc" 
	};
zzzcode( p, ppc, q )
NODE *p; char **ppc; OPTAB *q;
{
	register c;
	switch( c= *++(*ppc) )
	{
	case 'I':
		cbgen( p->bn.lop, p->bn.label, c );
		return;
	case 'k':	
		printf("$%ld", ~p->in.right->tn.lval);
		return;
	case 'c':
		
		printf( "$%d", p->stn.argsize/32);
		return;
	case 'U':	
		printf("$%d", 32 - p->in.right->tn.lval );
		return;
	case 'T':	
		printf("$%d", p->stn.stsize/8);
		break;
	case 'M':	
		staradr( p->in.right );
		break;
	case 'S':  
		{
			register NODE *l, *r;
			register size;
			if( p->in.op == 98 )
			{
				l = p->in.left;
				r = p->in.right;
			}
			else if( p->in.op == 99 )
			{  
				r = p->in.left;
			}
			else cerror( "STASG bad" );
			size = p->stn.stsize/8;
			if( size <= 0 || size > 65535 )
				cerror("structure size <0=0 or >65535");
			switch(size)
			{
			case 1:
				printf("	movb	");
				break;
			case 2:
				printf("	movw	");
				break;
			case 4:
				printf("	movl	");
				break;
			case 8:
				printf("	movq	");
				break;
			default:
				printf("	movc3	$%d,", size);
				break;
			}
			staradr( r );
			printf(",");
			if( p->in.op == 99 ) printf( "(sp)" );
			else staradr( l );
			printf("\n");
		}
		break;
	default:
		cerror( "illegal zzzcode" );
	}
}
staradr( p )
NODE *p;
{
	NODE *pp;
	pp = talloc();
	pp->in.op = (2+ 11);
	pp->in.left = p;
	upput( pp );
	pp->in.op = 97;
}
conput( p )
register NODE *p;
{
	switch( p->in.op )
	{
	case 4:
		acon( p );
		return;
	case 94:
		printf( "%s", rnames[p->tn.rval] );
		return;
	default:
		cerror( "illegal conput" );
	}
}
insput( p )
NODE *p;
{
	cerror( "insput" );
}
upput( p )
NODE *p;
{
	register NODE *r, *l, *pp;
	register o;
	pp = ( (2+ 11) == p->in.op ) ? p->in.left : p ;
	o = pp->in.op;
	if( o==2 || o==(2+ 11) || o==95 || o==116 || o==117 )
	{
		printf( "*" );
		adrput(pp);
		return;
	}
	if( o==4 )
	{
		acon( pp );
		sideff = 0;
		return;
	}
	if( o == 6 )
	{
		r = pp->in.right;
		l = pp->in.left;
		if( l->in.op == 94 && r->in.op == 4 )
		{
			acon( r );
			pp = pp->in.left;
		}
		else
		{
			
			
			if( l->in.op == 2+ 14 )
			{ 
				adrput( l->in.left );
				l = r;
			}
			else
			{
				p->in.left = r;
				adrput( p );
				p->in.left = pp;  
			}
			if( l->in.op == 64 ) l = l->in.left;
			if( l->in.op != 94 ) cerror("illegal address");
			printf( "[%s]", rnames[l->tn.rval] );
			return;
		}
	}
	else if( o == 8 )
	{
		r = pp->in.right;
		if( r->tn.op != 4 || r->tn.name ) cerror("illegal address");
		r->tn.lval = -r->tn.lval;
		acon( r );
		r->tn.lval = -r->tn.lval;
		pp = pp->in.left;
	}
	else if( o == 1+ 8 )
	{
		r = pp->in.right;
		if( r->tn.op != 4 ) cerror("illegal address");
		r = pp->in.left;
		if( r->tn.op != 94 ) cerror("illegal address");
		
		printf( "-(%s)", rnames[r->tn.rval] );
		sideff = 1;  
		return;
	}
	else if( o == 78 )
	{
		r = pp->in.right;
		if( r->tn.op != 4 ) cerror("illegal address");
		r = pp->in.left;
		if( r->tn.op != 94 ) cerror("illegal address");
		if( sideff ) printf( "(%s)+", rnames[r->tn.rval] );
		else printf( "(%s)", rnames[r->tn.rval] );
		return;
	}
	if( pp->tn.op != 94 ) cerror("illegal address");
	printf( "(%s)", rnames[pp->tn.rval] );
	return;
}
adrput( p )
register NODE *p;
{
	
	register o;
	while( (o=p->in.op) == 103 || o==104 )
	{
		p = p->in.left;
		o = p->in.op;
	}
	switch( o )
	{
	case 2:
		acon( p );
		sideff = 0;
		return;
	case 4:
		
		printf( "$" );
		acon( p );
		sideff = 0;
		return;
	case 94:
		printf( "%s", rnames[p->tn.rval] );
		sideff = 0;
		return;
	case (2+ 11):
		upput( p );
		return;
	case 95:
		sideff = 0;
		printf( "%ld(fp)", p->tn.lval - maxboff );
		return;
	case 116:
		sideff = 0;
		printf( "%ld(fp)", p->tn.lval );
		return;
	case 117:
		sideff = 0;
		printf( "%ld(ap)", p->tn.lval );
		return;
	default:
		cerror( "illegal address" );
		return;
	}
}
acon(p)
NODE *p;
{ 
	if( p->tn.name == 0 )
	{	
		printf( "%ld", p->tn.lval);
	}
	else if( p->tn.lval == 0 )
	{	
		printf( "%s", p->tn.name );
	}
	else
	{				
		printf( "%s+%ld", p->tn.name, p->tn.lval );
	}
}
char *
ccbranches[] = {
	"	jeql	L%d\n",
	"	jneq	L%d\n",
	"	jleq	L%d\n",
	"	jlss	L%d\n",
	"	jgeq	L%d\n",
	"	jgtr	L%d\n",
	"	jlequ	L%d\n",
	"	jlssu	L%d\n",
	"	jgequ	L%d\n",
	"	jgtru	L%d\n",
	};
cbgen( o, lab, mode )
int o, lab, mode;
{ 
	if( !o ) printf( "	jbr	L%d\n", lab );
	else	if( o > 89 ) cerror( "bad conditional branch: %s", opst[o] );
	else printf( ccbranches[o-80], lab );
}
special()
{
	cerror("reached special");
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.