{
File : EQL.mc
Author : Gwan Santosa
Date :    8-Nov-85 15:50:57

EQUAL is opcode 364(octal), EQL is opcode 72(octal).

They operate identically: return T if args are EQ.
Otherwise, return NIL if 
	either arg is a symbol (high word 0)
or	both args are smallp

Otherwise, call UFN
}

@EQLOP:	MAR ← [rhS, S - 1], GOTO[EQMG0],		c1, opcode[72'b];

@EQAOP:	MAR ← [rhS, S - 1], GOTO[EQMG0],		c1, opcode[364'b];

EQMG0:	CANCELBR[$, 2],					c2;
	TT ← MD,					c3;
	
	MAR ← [rhS, S + 0],				c1;
	Ybus ← TOSH xor TT, ZeroBr,			c2; {Compare high words of args}
	Rx ← MD, BRANCH[NEQ1, $],			c3;

	Ybus ← TOS xor Rx, ZeroBr,			c1; {Compare low word of args}
	BRANCH[NEQ2, $],				c2;

	TOS ← KTval, GOTO[EQFN2],			c3; {If EQ return T}
	
NEQ2:	Ybus ← TOSH xor smallpl, ZeroBr,		c3; {Otherwise check if smallpl}

	Ybus ← TOSH, ZeroBr, BRANCH[ANSP0, ASP0],	c1; {Check if an atom}

ASP0:	TOSH ← 0, CANCELBR[$],				c2; {If not EQ, but smallpl, return NIL}
	TOS ← 0,					c3;
	
	S ← S - 2, GOTO[IB.pc1],			c1;		
	
NEQ1:	Ybus ← TOSH, ZeroBr,			c1; {Check if arg is an atom}
ANSP0:	Ybus ← TT, ZeroBr, BRANCH[ANAT0, AAT0],	c2; {Check if arg is an atom}

ANAT0:	BRANCH[ANAT1, AAT1],			c3;

AAT0:	CANCELBR[EQFN1],			c3;

ANAT1:	GOTO[ufnX2],				c1;

AAT1:	TOS ← 0, GOTO[EQFN3],			c1;

EQFN2:	GOTO[EQFN3],				c1;
	
EQFN1:	TOS ← 0,				c1;
EQFN3:	TOSH ← 0,				c2;
EQFN4:	S ← S - 2, 				c3;
	
	GOTO[IB.pc1],				c1; {Go to exit point for Bank 1}