{File name TripleCheck.mc
Description: DandeLion InterLisp Emulator TripleCheck
Charnley 15-Jan-85 10:29:44 Created
}
{ uses opcode 373'b alpha = 5 ( FLOATARRAY2 5)
}
{ called (TRIPLECHECK Src1 Src2 Src3 WCount)
if WCount = 0 then return( NIL )
loop: if NOT( [Src1 + WCount - 1] = [Src2 + WCount - 1] = [Src3 + WCount - 1] ) then WCount ← WCount - 1, loop
return( WCount )
}
{Set[L2.Triple, 5];
Set[L0.trS2i, 1];
Set[L0.trS1i, 2];
Set[L0.trDi, 3];
Set[L0.trS2, 4];
Set[L0.trS1, 5];
Set[L0.trD, 6];
}
GOTO[FLOATARRAYPREP], c3, at[L2.Triple, 10, FOP2Disp];{Triple}
{
has already saved
uTOSH ← TOSH
uTOS ← TOS
saves regs:
uS ← S
uPVx ← PV
uPC ← PC
urhS ← rhS
urhPV ← rhPV
gets stk-1, stk-2, stk-3
stk-3 (first arg)
uS2Hi, uS2Lo
stk-2 (second arg)
uS1Hi, uS1Lo
stk-1 (third arg)
uDHi, uDLo
}
at[L2.Triple, 10, LFAop],{FOP2 = Triple}
Q ← TOS - 1, L1 ← L1.RestoreTosB2, c1;
TT ← uS2Lo, c2;
TT ← TT + Q, CarryBr, c3;
uS2Lo ← TT, BRANCH[$, trfixS2hi], c1;
trS2: TT ← uS1Lo, c2;
TT ← TT + Q, CarryBr, c3;
uS1Lo ← TT, BRANCH[$, trfixS1hi], c1;
trS1: TT ← uDLo, c2;
TT ← TT + Q, CarryBr, c3;
uDLo ← TT, BRANCH[$, trfixDhi], c1;
trD: , c2;
GOTO[TrMapInit], c3;
trfixS2hi:
TT ← uS2Hi, c2;
TT ← TT + 1, c3;
uS2Hi ← TT, GOTO[trS2], c1;
trfixS1hi:
TT ← uS1Hi, c2;
TT ← TT + 1, c3;
uS1Hi ← TT, GOTO[trS1], c1;
trfixDhi:
TT ← uDHi, c2;
TT ← TT + 1, c3;
uDHi ← TT, GOTO[trD], c1;
TrMapInit:
TT ← uS2Hi, L0 ← L0.trS2i, c1;
rhTT ← TT LRot0, c2;
TT ← uS2Lo, CALL[TrMap], c3;
at[L0.trS2i, 10, TrMapRet],
Q ← rhRx, c1;
rhS2 ← Q LRot0, c2;
S2 ← Rx, c3;
MAR ← S2 ← [rhS2, TT + 0], c1;
, c2;
Q ← MD, c3;
UQSave ← Q, c1;
, c2;
, c3;
TT ← uS1Hi, L0 ← L0.trS1i, c1;
rhTT ← TT LRot0, c2;
TT ← uS1Lo, CALL[TrMap], c3;
at[L0.trS1i, 10, TrMapRet],
Q ← rhRx, c1;
rhS1 ← Q LRot0, c2;
S1 ← Rx, c3;
MAR ← S1 ← [rhS1, TT + 0], c1;
Q ← UQSave, c2;
Q ←MD xor Q, c3;
, c1;
Ybus ← Q, ZeroBr, c2;
BRANCH[TrEarlya, $], c3;
TT ← uDHi, L0 ← L0.trDi, c1;
rhTT ← TT LRot0, c2;
TT ← uDLo, CALL[TrMap], c3;
at[L0.trDi, 10, TrMapRet],
Q ← rhRx, c1;
rhD ← Q LRot0, c2;
D ← Rx, c3;
MAR ← D ← [rhD, TT + 0], c1;
Q ← UQSave, c2;
Q ←MD xor Q, GOTO[TrLoopDec], c3;
{ inner loop}
TrLoop:
MAR ← S2 ← [rhS2, S2 - 1], L0 ← L0.trS2, c1;
TrMapS2RetX:
Ybus ← Q, ZeroBr, BRANCH[$, TrfixS2, 1], c2;
Q ← MD, BRANCH[TrEarly2, $], c3;
MAR ← S1 ← [rhS1, S1 - 1], L0 ← L0.trS1, c1;
TrMapS1RetX:
BRANCH[$, TrfixS1, 1], c2;
Q ← MD xor Q, c3;
MAR ← D ← [rhD, D - 1], L0 ← L0.trD, c1;
TrMapDRetX:
Ybus ← Q, ZeroBr, BRANCH[$, TrfixD, 1], c2;
Q ← MD xor Q, BRANCH[TrEarly1, TrLoop], c3;
TrLoopDec:
TOS ← TOS - 1, ZeroBr, c1;
uTOS ← TOS, BRANCH[$, TrDone], c2;
GOTO[TrLoop], c3;
{Early (mismatch) exits here}
TrEarly1:
TOS ← TOS, c1;
Q ← smallpl, c2;
uTOSH ← Q, L1 ← L1.LFAexit, GOTO[TrExit], c3;
TrEarly2:
TOS ← TOS + 1, c1;
Q ← smallpl, c2;
uTOSH ← Q, L1 ← L1.LFAexit, GOTO[TrExit], c3;
TrEarlya:
TOS ← TOS, c1;
Q ← smallpl, c2;
uTOSH ← Q, L1 ← L1.LFAexit, GOTO[TrExit], c3;
TrEarlyc:
, c3;
TOS ← TOS + 1, c1;
Q ← smallpl, c2;
uTOSH ← Q, L1 ← L1.LFAexit, GOTO[TrExit], c3;
TrDone:
, c3;
Ybus ← Q, ZeroBr, c1;
BRANCH[TrEarlyc, $], c2;
uTOSH ← 0, L1 ← L1.LFAexit, GOTO[TrExit], c3;
TrfixS2:
S2 ← rhS2, CANCELBR[$], c3;
TT ← uS2Lo, c1;
rhTT ← S2 LRot0, c2;
CALL[TrMap], c3;
at[L0.trS2, 10, TrMapRet],
MAR ← S2 ← [rhS2, 0FF + 0], GOTO[TrMapS2RetX], c1;
TrfixS1:
S1 ← rhS1, CANCELBR[$], c3;
TT ← uS1Lo, c1;
rhTT ← S1 LRot0, c2;
CALL[TrMap], c3;
at[L0.trS1, 10, TrMapRet],
MAR ← S1 ← [rhS1, 0FF + 0], GOTO[TrMapS1RetX], c1;
TrfixD:
D ← rhD, CANCELBR[$], c3;
TT ← uDLo, c1;
rhTT ← D LRot0, c2;
CALL[TrMap], c3;
at[L0.trD, 10, TrMapRet],
MAR ← D ← [rhD, 0FF + 0], GOTO[TrMapDRetX], c1;
TrMap:
Map ← [rhTT, TT], c1;
, c2;
Rx ← rhRx ← MD, XwdDisp, c3;
Map ← [rhTT,TT], DISP2[TrFixRFlags], c1;
MDR ← Rx or 10, L0Disp, GOTO[TrReRead], c2, at[0, 4, TrFixRFlags];
MDR ← Rx or 10, L0Disp, GOTO[TrReRead], c2, at[1, 4, TrFixRFlags];
MDR ← Rx or 10, L0Disp, GOTO[TrReRead], c2, at[2, 4, TrFixRFlags];
GOTO[RWTrapB2], c2, at[3, 4, TrFixRFlags];
TrReRead: RET[TrMapRet], c3;
{when completed come here for restoring regs}
{set uTOSH to value desired in TOSH}
{set TOS to value desired in TOS}
{when completed, set L1 = L1.LFAexit}
TrExit:
Q ← 6{delta stk}, GOTO[LFACommonExit], c1;
{ E N D }