{
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}