122 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#define RCSID5 "$Header$"
 | 
						|
 | 
						|
/*
 | 
						|
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
op1(mode)	{
 | 
						|
	int relpc = 0;
 | 
						|
	if (im1flag)	{
 | 
						|
		if (mode == 067 || mode == 077) {
 | 
						|
			exp_1.val = adjust(exp_1);
 | 
						|
			relpc = RELPC;
 | 
						|
		}
 | 
						|
#ifdef RELOCATION
 | 
						|
		RELOMOVE(relonami, rel_1);
 | 
						|
		if (rflag != 0 && PASS_RELO)
 | 
						|
			newrelo(exp_1.typ, RELO2|relpc);
 | 
						|
#endif
 | 
						|
		emit2(exp_1.val);
 | 
						|
		im1flag = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
op2(mode)	{
 | 
						|
	int relpc = 0;
 | 
						|
	if (im2flag)	{
 | 
						|
		if (mode == 067 || mode == 077) {
 | 
						|
			relpc = RELPC;
 | 
						|
			exp_2.val = adjust(exp_2);
 | 
						|
		}
 | 
						|
#ifdef RELOCATION
 | 
						|
		RELOMOVE(relonami, rel_2);
 | 
						|
		if (rflag != 0 && PASS_RELO)
 | 
						|
			newrelo(exp_2.typ, RELO2|relpc);
 | 
						|
#endif
 | 
						|
		emit2(exp_2.val);
 | 
						|
		im2flag = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
branch(opc,exp) expr_t exp; {
 | 
						|
	register eval;
 | 
						|
	register sm;
 | 
						|
 | 
						|
	eval = adjust(exp) >> 1;
 | 
						|
	sm = fitb(eval);
 | 
						|
	if ((exp.typ & ~S_DOT) != DOTTYP && pass >= PASS_2) sm = 0;
 | 
						|
	if (!sm && pass >= PASS_2) {
 | 
						|
		serror("label too far");
 | 
						|
	}
 | 
						|
	emit2(opc | lowb(eval));
 | 
						|
}
 | 
						|
 | 
						|
ejump(opc, exp) expr_t exp; {
 | 
						|
	register sm,eval;
 | 
						|
	int gain;
 | 
						|
 | 
						|
# ifdef THREE_PASS
 | 
						|
	eval = adjust(exp) >> 1;
 | 
						|
	sm = fitb(eval);
 | 
						|
	if ((exp.typ & ~S_DOT) != DOTTYP)	{
 | 
						|
		sm = 0;
 | 
						|
	}
 | 
						|
	gain = (opc == OPBRA ? 2 : 4);
 | 
						|
	if (small(sm,gain))	{
 | 
						|
		emit2( opc | lowb(eval));
 | 
						|
	}
 | 
						|
	else	{
 | 
						|
# endif
 | 
						|
		if (opc != OPBRA)	{
 | 
						|
			emit2((opc^0400) | 04);
 | 
						|
		}
 | 
						|
 | 
						|
		exp_1.val = exp.val;
 | 
						|
		im1flag = 1;
 | 
						|
		jump(0100,067);
 | 
						|
# ifdef THREE_PASS
 | 
						|
	}
 | 
						|
# endif
 | 
						|
}
 | 
						|
 | 
						|
sob(reg, exp) expr_t exp; {
 | 
						|
	if ((exp.typ & ~S_DOT) != DOTTYP)	{
 | 
						|
		serror("error in sob-label");
 | 
						|
	}
 | 
						|
	exp.val = ( - adjust(exp) ) >> 1;
 | 
						|
	fit(fit6(exp.val));
 | 
						|
	emit2( OPSOB | (reg << 6) | exp.val);
 | 
						|
}
 | 
						|
 | 
						|
jump(opc,opr)	{
 | 
						|
	register sm;
 | 
						|
	register val;
 | 
						|
 | 
						|
	if (opr==067) {
 | 
						|
# ifdef THREE_PASS
 | 
						|
		val = adjust(exp_1) >> 1;
 | 
						|
		if ( fitb(val) && (exp_1.typ & ~S_DOT) == DOTTYP) {
 | 
						|
			sm = 1;
 | 
						|
		}
 | 
						|
		if (small(sm,2)) {
 | 
						|
			emit2(OPBRA | lowb(val));
 | 
						|
			im1flag = 0;
 | 
						|
			return(0);
 | 
						|
		}
 | 
						|
# endif
 | 
						|
	}
 | 
						|
	emit2(opc | opr);
 | 
						|
	op1(opr);
 | 
						|
}
 | 
						|
 | 
						|
valu_t adjust(exp) expr_t exp; {
 | 
						|
	valu_t val;
 | 
						|
 | 
						|
	val = exp.val - DOTVAL - 2;
 | 
						|
# ifdef THREE_PASS
 | 
						|
	if (pass == PASS_2 && val > 0) val -= DOTGAIN;
 | 
						|
# endif
 | 
						|
	return(val);
 | 
						|
}
 |