{File name LFAM.mc
Description: DandeLion InterLisp Emulator LispFloatArray
Author: Charnley
Last modified: Charnley 28-Jun-84 11:37:59
Created: 8-Jun-84 10:04:55
}
{ (MAGIC S2 S1 D Kount) op = 373'b alpha = 4
S1 -- pointer to first source complex number
S2 -- pointert to last source complex number
D -- pointer to first dest complex number
within the loop
S1 = S1init + 4*(Kount - 1) {alpha, gamma}
S2 = S2init - 4*(Kount - 1) {beta, delta}
D = Dinit + 8*(Kount - 1) {D.0, D.1, D.2, D.3}
D(n.0) ← S1(n.0) + S2(-n.0) {alpha + beta}
D(n.1) ← S1(n.1) - S2(-n.1) {delta - gamma}
D(n.2) ← S1(n.1) + S2(-n.1) {delta + gamma}
D(n.3) ← S1(n.0) - S2(-n.0) {alpha - beta}
S1, S2, and D are quadword alligned
}
{ INNER LOOP FLOAT SEQUENCE
B ← alpha
A ← beta [add] [unload]
XXXXX D.2 ← RESULT (delta+gamma)
A ← beta [sub] [unload]
XXXXX D.1 ← RESULT (delta-gamma)
B ← delta [unload]
-------------------------------- LOOP START
D.0 ← RESULT (alpha+beta)
A ← gamma [add] [unload]
D.3 ← RESULT (alpha-beta)
A ← gamma [sub]
B ← alpha
A ← beta [add] [unload]
D.2 ← RESULT (delta+gamma)
A ← beta [sub] [unload]
D.1 ← RESULT (delta-gamma)
B ← delta [unload]
-------------------------------- LOOP END
D.0 ← RESULT (alpha+beta)
A ← gamma [add] [unload]
D.3 ← RESULT (alpha-beta)
--------------------------------
A ← gamma [sub]
XXXXX B ← alpha
XXXXX A ← beta [add] [unload]
D.2 ← RESULT (delta+gamma)
XXXXX A ← beta [sub] [unload]
D.1 ← RESULT (delta-gamma)
}
{
RegDef[uFLAmB, U, 35];
}
GOTO[FLOATARRAYPREP], c3, at[L2.magic, 10, FOP2Disp];{MAGIC}
lfam.s:
{ loop pipe start up }
at[L2.magic, 10, LFAop],{FOP2 = MAGIC}
Zimph ← LShift1 Kount - 1, SE ← 0, c1;
L0 ← L0.S1mag0, FloatMode.RN.AI.FAST, FloatPIPE, c2;
Zimph ← LShift1 Zimph, SE ← 0,CALL[LFAremapS1], c3;
{ MAR ← S1 ← [S1 + 4*Kount-1], c1; }
stackP ← 6{FLBMinusA}, c2, at[L0.S1mag0, 10, LFAremapS1ret];
FloatAB ← MD{alpha}, c3;
MAR ← [rhS1, S1 + 1], c1;
CANCELBR[$, 2], c2;
FloatAB ← MD{alpha}, c3;
Zimph ← LShift1 Kount - 1, SE ← 0, c1;
L0 ← L0.S2mag0, c2;
Zimph ← LShift1 Zimph, CALL[LFAremapNS2], c3;
{ MAR ← S2 ← [S2 - 4*Kount-1], }
, c2, at[L0.S2mag0, 10, LFAremapS2ret];
Stemp ← FloatA ← MD{beta}, FLPlus, c3;
MAR ← [rhS2, S2 + 1], c1;
USrcVALo ← Stemp, CANCELBR[$, 2], c2;
Stemp ← FloatA ← MD{beta}, c3;
FloatPump, uStemp ← Stemp, c1;
FloatPump, c2;
FloatA ← USrcVALo{beta}, {FLBMinusA,} c3;
FloatA ← uStemp{beta}, c1;
FloatPump, c2;
FloatPump, c3;
MAR ← S2 ← [rhS2, S2 + 2], c1;
CANCELBR[$, 2], c2;
FloatAB ← MD{delta}, FloatUnloadS, Float.M, c3;
MAR ← [rhS1, S2 + 1], L0 ← L0.lfam.di, c1;
, CANCELBR[$, 2], c2;
FloatAB ← MD{delta}, FloatUnloadS, Float.L, c3;
Zimph ← LShift1 Kount - 1, SE ← 0, c1;
Zimph ← LShift1 Zimph, SE ← 0, c2;
Zimph ← LShift1 Zimph, SE ← 0,CALL[LFAremapD] c3;
{ MAR ← D ← [D + 8*Kount-1], c1; }
Q ← MDR ← FloatResult{alpha+beta}, GOTO[lfam.entry], FloatPump, c2, at[L0.lfam.di, 10, LFAremapDret];
{ - - - - - - -}
lfam.loop: MAR ← D ← [rhD, D - 10'd], c1;{D.0}
Q ← MDR ← FloatResult{alpha+beta}, BRANCH[$, fixDA, 1], FloatPump, c2;
fixDAret:
lfam.entry:
pop, c3;{S: 6 to 5}
MAR ← [rhD, D + 1], L0 ← L0.lfam.s2a, c1;
Q ← MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
pop, c3;{S: 5 to 4}
MAR ← S1 ← [rhS1, S1 + 2], c1;
CANCELBR[$, 2], c2;
Stemp ← FloatA ← MD{gamma}, FLPlus, FloatUnloadS, Float.M, push, c3;{S: 4 to 5}
MAR ← [rhS1, S1 + 1], push, c1;{S: 5 to 6}
USrcVALo{6} ← Stemp, CANCELBR[$, 2], c2;
Stemp ← FloatA ← MD{gamma}, FloatUnloadS, Float.L, c3;
MAR ← D ← [rhD, D + 6], c1;{D.3}
Q ← MDR ← FloatResult{alpha-beta}, LOOPHOLE[wok], BRANCH[$, fixDB, 1], FloatPump, c2;
fixDBret:
, uSaveTT ← Stemp, c3;
, c1;
, c2;
Kount ← Kount - 1, ZeroBr, c3;
MAR ← [rhD, D + 1], BRANCH[$, lfam.exit] c1;
Q ← MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
FloatA ← USrcVALo{gamma}, {FLBMinusA,} c3;
MAR ← S1 ← [rhS1, S1 - 6], pop, c1;{S: 6 to 5}
FloatA ← uSaveTT{gamma}, BRANCH[$, fixS1A, 1], c2;
fixS1Aret:
Stemp{Db} ← FloatAB ← MD{alpha}, c3;
MAR ← [rhS1, S1 + 1], pop, c1;{S: 5 to 4}
, CANCELBR[$, 2], c2;
Stemp{Db} ← FloatAB ← MD{alpha}, c3;
MAR ← S2 ← [rhS2, S2 + 2], c1;
BRANCH[$, fixS2A, 1], c2, at[L0.lfam.s2a, 10, LFAremapS2ret];
fixS2Aret:
Stemp ← FloatA ← MD{beta}, FLPlus, FloatUnloadS, Float.M, push, c3;{S: 4 to 5}
MAR ← [rhS2, S2 + 1], push, c1;{S: 5 to 6}
STK{6} ← Stemp, CANCELBR[$, 2], c2;
Stemp ← FloatA ← MD{beta}, FloatUnloadS, Float.L, c3;
MAR ← D ← [rhD, D - 2], c1;{D.2}
Q ← MDR ← FloatResult{delta+gamma}, LOOPHOLE[wok], CANCELBR[$, 2], FloatPump, c2;
, c3;
MAR ← [rhD, D + 1], c1;
Q ← MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
uSaveTT ← Stemp, c3;
FloatA ← STK{beta}, {FLAMinusB,} FloatUnloadS, Float.M, c1;
FloatA ← Stemp LRot0{beta}, FloatUnloadS, Float.L, c2;
, c3;
MAR ← D ← [rhD, D - 2], c1;{D.1}
Q ← MDR ← FloatResult{delta-gamma}, LOOPHOLE[wok], BRANCH[$, fixDD, 1], FloatPump, c2;
fixDDret:
, c3;
MAR ← [rhD, D + 1], c1;
Q{Db} ← MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
, c3;
MAR ← S2 ← [rhS2, S2 + 2], c1;
CANCELBR[$, 2], c2;
Q{Db} ← FloatAB ← MD{delta}, FloatUnloadS, Float.M, c3;
MAR ← [rhS2, S2 + 1], c1;
, CANCELBR[$, 2], c2;
Q{Db} ← FloatAB ← MD{delta}, GOTO[lfam.loop], FloatUnloadS, Float.L, c3;
{ - - - - - - -}
lfam.exit:
MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
FloatA ← USrcVALo{gamma}, {FLAMinusB,} c3;
FloatA ← uSaveTT{gamma}, c1;
FloatPump, c2;
FloatPump, c3;
, c1;
FloatPump, FloatUnloadS, Float.M, c2;
FloatPump, FloatUnloadS, Float.L, c3;
MAR ← D ← [rhD, D - 2], c1;
Q ← MDR ← FloatResult{delta+gamma}, LOOPHOLE[wok], CANCELBR[$, 2], FloatPump, c2;
fixDEret:
, c3;
MAR ← [rhD, D + 1], c1;
Q ← MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
, c3;
FloatPump, FloatUnloadS, Float.M, c1;
FloatPump, FloatUnloadS, Float.L, c2;
, c3;
MAR ← D ← [rhD, D - 2], c1;
Q ← MDR ← FloatResult{delta-gamma}, LOOPHOLE[wok], BRANCH[$, fixDF, 1], FloatPump, c2;
fixDFret:
, c3;
MAR ← [rhD, D + 1], c1;
MDR ← FloatResult, CANCELBR[$, 2], LOOPHOLE[wok], FloatPump, c2;
Q ← 6, L1 ← L1.LFAexit, c3;
GOTO[LFACommonExit], c1;
{ exceptions }
fixDA: {8*K + 0}
Zimph ← LShift1 Kount - 1, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 0, c1;
UQSave ← Q, L0 ← L0.lfam.da, c2;
Zimph ← LShift1 Zimph, SE ← 0, CALL[LFAremapD], c3;
MDR ← UQSave, GOTO[fixDAret], c2, at[L0.lfam.da, 10, LFAremapDret];
fixDB: {8*K + 6}
Zimph ← LShift1 Kount, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 0, c1;
UQSave ← Q, L0 ← L0.lfam.db, c2;
Zimph ← LShift1 Zimph - 1, SE ← 0, CALL[LFAremapD], c3;
MDR ← UQSave, GOTO[fixDBret], c2, at[L0.lfam.db, 10, LFAremapDret];
fixDD: {8*K + 2} {Kount has been decremented!}
Zimph ← LShift1 Kount, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 1, c1;
UQSave ← Q, L0 ← L0.lfam.dd, c2;
Zimph ← LShift1 Zimph, SE ← 0, CALL[LFAremapD], c3;
MDR ← UQSave, GOTO[fixDDret], c2, at[L0.lfam.dd, 10, LFAremapDret];
fixDF: {8*K + 2} {Kount has been decremented!}
Zimph ← LShift1 Kount, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 1, c1;
UQSave ← Q, L0 ← L0.lfam.df, c2;
Zimph ← LShift1 Zimph, SE ← 0, CALL[LFAremapD], c3;
MDR ← UQSave, GOTO[fixDFret], c2, at[L0.lfam.df, 10, LFAremapDret];
fixS1A: {4*K + 0} {Kount has been decremented!}
Zimph ← LShift1 Kount, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 0, c1;
L0 ← L0.lfam.s1a, c2;
CALL[LFAremapS1], c3;
GOTO[fixS1Aret], c2, at[L0.lfam.s1a, 10, LFAremapS1ret];
fixS2A: {4*K + 0}
Zimph ← LShift1 Kount - 1, SE ← 0, c3;
Zimph ← LShift1 Zimph, SE ← 0, c1;
L0 ← L0.lfam.s2a, c2;
CALL[LFAremapNS2], c3;
LFAremapNS2:
Zorch ← uS2Lo, c1;
Zorch ← Zorch - Zimph, CarryBr, c2;
rhZorch ← uS2Hi, BRANCH[LFANS2car, LFANS2nocar], c3;
LFANS2car:
Q ← rhZorch, c1;
Q ← Q - 1, c2;
rhZorch ← Q LRot0, c3;
LFANS2nocar:
{map S2}
Map ← [rhZorch, Zorch], GOTO[lfa.S2map], c1;
{ E N D }