124 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 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) | 02);
 | |
| 		}
 | |
| 
 | |
| 		exp_1 = exp;
 | |
| 		im1flag = 1;
 | |
| 		emit2(0100|067);
 | |
| 		op1(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 val;
 | |
| 
 | |
| # ifdef THREE_PASS
 | |
| 	if (opr==067) {
 | |
| 		register sm = 0;
 | |
| 
 | |
| 		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);
 | |
| }
 |