Home » Archimedes archive » Zipped Apps » BCPL » BCPL/b/cgc
BCPL/b/cgc
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Zipped Apps » BCPL |
Filename: | BCPL/b/cgc |
Read OK: | ✔ |
File size: | 4514 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
SECTION "CGC" GET "b.CGheader" STATIC { // Version of 14 Apr 86 14:00:11 dummy = VersionMark; version = 1*256+19 }; /* 1.6 01 Nov 85 13:12:03 Recognise that after CMP .., #0; BNE .. a register contains 0 Bug fix: x op:= .. must flush pending stores for x 1.7 04 Nov 85 15:24:43 Load of register for indirect store may be deferred 1.8 14 Jan 86 15:56:12 Bug fix: Lock base register in op:= 1.9 30 Jan 86 11:14:35 Bug fix: CGRelopX not to leave a register marked as containing 0 if it hasn't compiled a compare. 1.10 06 Feb 86 17:10:10 Incorporation of floating point (not in op:= though) 1.11 18 Feb 86 11:19:54 Byte selectors mended to get the right byte, not 3- it. Storing of non-constant to general field corrected. 1.12 25 Feb 86 12:33:01 Improvement of code for field update where there is no indirection 1.13 26 Feb 86 11:41:46 Improvement of code for stind & op:= 1.14 Bug fix: SlctSt did not check for indirection before considering the type of the selected thing. 1.15 06 Mar 86 12:57:32 CGSlctSt did not lock its base. 1.16 07 Mar 86 21:30:10 k.static 1.17 16 Mar 86 22:36:16 Improvements in coding of Condition (field : constant) and Field update (value also a field). 1.18 21 Mar 86 11:08:57 Deferred shifts 1.19 14 Apr 86 13:59:28 Stind with locals safe etc need not force the stored register to be loaded */ STATIC { regTestedAgainstZero = 0 } MANIFEST { k.isafr = 256 }; LET CGStind() BE { LET r = h1!arg2=k.freg -> MoveToAnyFR(arg2)+k.isafr, MoveToAnyCRSomeTimeForStoreTo(arg2, ShiftedUp, arg1); StindOrAssOp(-1, r) } AND CGAssOp() BE { LET r = -1; LET f = ?; op := ReadOp(); f := VALOF SWITCHON op INTO { CASE s.plus: RESULTIS CGPlus CASE s.minus: RESULTIS CGMinus CASE s.mult: r := ArgumentRegister(1); RESULTIS CGMult CASE s.div: r := ArgumentRegister(1); RESULTIS CGDiv CASE s.rem: r := ArgumentRegister(1); RESULTIS CGRem CASE s.logand: CASE s.logor: CASE s.eqv: CASE s.neqv: RESULTIS CGLogop CASE s.fplus: CASE s.fminus: CASE s.fmult: CASE s.fdiv: RESULTIS CGFop }; StindOrAssOp(f, r) } AND StindOrAssOp(x, r) BE { LET s, m, a = 0, 0, 0; LET t, ind, n, k = h1!arg1, h2!arg1, h3!arg1, 4*h4!arg1; LET simpleSLoc = FALSE; LET ss = ssp-2; IF k.isafr>r>=0 THEN Lock(r, k.reg); TEST (k.lvloc<=t<=k.lvlab) & ind<0 THEN TEST t=k.lvlab THEN { s := CheckRLLoaded() m, a := n, k } ELSE { t, n := t-k.lvloc+k.loc, n+k/4; h1!arg1, h2!arg1, h3!arg1, h4!arg1 := t, -1, n, 0; simpleSLoc := TRUE } ELSE TEST ind<0 & TurnIndIntoSLoc(arg1) THEN { t, n := h1!arg1, h3!arg1; simpleSLoc := TRUE } ELSE { TEST ind<0 & t~=k.shreg THEN { a := k; h4!arg1 := 0 } ELSE MoveToAnyR(arg1); s := LoadAddress(arg1); Lock(s, k.reg); TEST localsSafe THEN { FlushPendingLoadsExceptLocals(); FlushPendingStoresExceptLocalsAndIregs() } ELSE { FlushPendingLoads(); FlushPendingStores() } }; TEST x>=0 THEN { IF ~simpleSLoc THEN TEST x=CGFop THEN { r := NextFR(); GenCPDT(f.ld, r, s, m, a); Stack(ssp-1); Load(k.freg, r) } ELSE { TEST r<0 THEN r := NextR() ELSE FreeReg(r); GenOpToStore(f.ldr, r, s, m, a); FlushPendingLoadsForReg(r); Stack(ssp-1); Load(k.reg, r) }; SwapSS(arg1, arg2); x(op, FALSE); r := h3!arg1 } ELSE Stack(ssp-1); TEST simpleSLoc THEN { LET rt = h1!arg1; GenStore(t, n); IF rt=k.reg & r<k.isafr THEN Unlock(r, k.reg) } ELSE TEST x=CGFop | r>=k.isafr THEN GenCPDT(f.st, r&15, s, m, a) ELSE TEST localsSafe & t=k.loc & ind<0 THEN { MoveToRSomeTime(r, arg1); AddToPendingStores(r, k.ireg, s, FALSE, a/4) } ELSE { MoveToR(r, arg1); GenF2(f.str, r, s, m, a) }; Unlock(s, k.reg); IF ~simpleSLoc THEN { TEST LocalsSafe THEN DiscardNonLocalRegs() ELSE DiscardNonConstRegs(); Stack(ss) } } AND CgStcar(n, vacar) BE { LET ind, k = h2!arg1, h4!arg1; LET r = ?; LET s = 0; TEST h1!arg2=k.freg THEN r := MoveToAnyFR(arg2)+k.isafr ELSE { r := MoveToAnyCRSomeTime(arg2); Lock(r, k.reg) }; TEST ind<0 & h1!arg1~=k.shreg THEN n, h4!arg1 := n+k, 0 ELSE MoveToAnyR(arg1); s := (vacar -> MoveToAnyCR(arg1), LoadCarAdd(arg1)); TEST r>=k.isafr THEN { FlushPendingLoadsExceptLocals(); FlushPendingStoresExceptLocalsAndIregs(); GenCPDT(f.st, r&15, s, 0, n/BytesPerWord) } ELSE { AddToPendingStores(r, k.ireg, s, FALSE, n/BytesPerWord); UnLock(r, k.reg) }; Stack(ssp-2) } AND CGShift(sh) BE TEST h2!arg2<0 & (k.lvloc<=h1!arg2<=k.lvlab) & IsConst(arg1) & h3!arg1=2 & sh=sh.asl THEN { h1!arg2 := h1!arg2+k.lvs; h4!arg2 := (h4!arg2)<<2; Stack(ssp-1) } ELSE { LET s = ?; LET deferredShift = Null; LET r = FindSourceAndDestinationRegisters(@s, arg2, FALSE); TEST IsConst(arg1) THEN TEST s=r THEN deferredShift := sh*32+h3!arg1 ELSE ShiftRegisterDS(r, s, sh, h3!arg1) ELSE ShiftRegisterDS(r, s, sh, -MoveToAnyCR(arg1)); Unlock(s, k.reg); LoseR(r, deferredShift) } AND CGLogop(logop, readAhead) BE { LET x, y = arg1, arg2; IF Class(arg1, TRUE)<Class(arg2, TRUE) THEN x, y := arg2, arg1; { LET s = IsInARegister(y); LET r = -1; LET nextOperand = ?; LET iscf, lnpending = FALSE, FALSE; LET f = VALOF SWITCHON logop INTO { CASE s.logand: RESULTIS f.and CASE s.logor: RESULTIS f.orr CASE s.eqv: CASE s.neqv: RESULTIS f.eor }; IF readAhead THEN { op := ReadOp(); TEST op=s.ln THEN { lnpending := TRUE; nextOperand := ReadN(); op := ReadOp(); IF nextOperand=0 & (op=s.eq | op=s.ne) & (logop=s.logand | logop=s.neqv) THEN iscf := TRUE } ELSE IF op=s.res | op=s.fnrn THEN r := 1 }; TEST s=Null | (~Locked(s, k.reg) & [(h1!y=k.loc & h3!y>=ssp-2) | /* an heuristic to avoid consuming registers over-rapidly */ h1!y=k.reg]) THEN { s := MoveToAnyR(y); IF ~iscf & r<0 THEN r := s } ELSE { FlushPendingLoadsForReg(s); Lock(s, k.reg); IF ~iscf & r<0 THEN r := NextR() }; TEST iscf THEN { TEST logop=s.logand THEN f, r := f.tsts, 0 ELSE f, r := f.teqs, 0 IF (pendingMask ~= m.always) THEN { Store(0, ssp-4); FlushPendingStores() } } ELSE { FlushPendingUsesOfReg(r); IF f=f.and & IsConst(x) & EightBitsOrFewer(~h3!x) THEN { f := f.bic; h3!x := ~h3!x } }; GenFDS(f, r, s, x); IF logop=s.eqv THEN GenRR(f.mvn, r, 0, r) Unlock(s, k.reg); TEST r~=0 THEN Lose(r, k.reg) ELSE Stack(ssp-1); IF lnpending THEN Load(k.number, nextOperand); IF iscf THEN CGRelopX(op, ReadOp(), FALSE) } } AND CGRelop(relop, nextop) BE CGRelopX(relop, nextop, TRUE) AND CGRelopX(relop, nextop, compneeded) BE { op := nextop; TEST op=s.jt | op=s.jf THEN { LET c = ?; LET l = ReadL(); LET x = TransferredLabel(l); TEST x~=0 THEN { Store(0, ssp-3); FlushPendingStores() } ELSE FlushPendingStoresExceptLocals(); c := ConditionX(relop, op=s.jt, compneeded); SaveStateForLab(l); // IF x~=0 THEN DelLocsAbove(0, FALSE); CondJump(c, l); IF regTestedAgainstZero~=Null & c=m.ne & compneeded THEN AddRegInfo(k.reg, regTestedAgainstZero, k.number, 0); countFlag := counting; op := ReadOp() } ELSE { LET r = NextR(); Lock(r, k.reg); IF pendingLab~=Null THEN FlushPendingInsts(Null, FALSE); GenF1K(f.mov, r, 0, 0); F1Inst(f.mvn, r, 0, r, 0, Null, 0, conditionX(relop, TRUE, compneeded)); Load(k.reg, r); UnLock(r, k.reg) } } AND Condition(relop, b) = ConditionX(relop, b, TRUE) AND ConditionX(relop, b, compneeded) = VALOF { LET x, y = arg1, arg2; LET k, mergek = 0, FALSE; LET f = f.cmps; IF compneeded THEN { LET i1, i2 = h2!arg1, h2!arg2; IF i1<0 & h4!arg1~=0 & h1!arg1~=k.shreg & i2<0 & h4!arg2~=0 & h1!arg2~=k.shreg THEN { k := h4!arg1-h4!arg2; h4!arg1, h4!arg2 := 0, 0; mergek := TRUE }; IF Class(arg1, TRUE)<Class(arg2, TRUE) THEN { x, y := arg2, arg1; relop := Reverse(relop); k := -k }; /* Now a bit of special case detection which says if both operands are in the stack and in adjacent locations, use a LDM to extract them. This is worth doing even if there is deferment of register loading, because it can ensure that registers get allocated the right way round (and it will often be applicable to FOR loops) */ IF IsInTheStack(x) & IsInTheStack(y) & usesFrame & relop<s.fadd THEN { LET loc1, loc2 = h3!x, h3!y; IF [loc1=(loc2+1) | loc2=(loc1+1)] & LookFor(x, NotAddr)=Null & LookFor(y, NotAddr)=Null THEN { LET r, s = NextR(), ?; LET b = r.0; LET toploc = loc1>loc2 -> loc1+1, loc2+1; LET wb = f.wb; Lock(r, k.reg); s := NextR(); Unlock(r, k.reg); IF (((r-s) NEQV (loc1-loc2)) NEQV nextStackWord)<0 THEN { // the registers have been allocated the wrong // way round - swap them LET t = r; r := s; s := t }; TEST toploc=TOSOffset THEN b, wb := r.ts, 0 ELSE { IF toploc~=R0Offset THEN SetRtoRplusK(r.0, r.p, nextStackWord*toploc); R0Offset := toploc-2 }; F4Inst(f.ldm, b, (1<<r)+(1<<s), reversedStack -> f.preup+wb, f.predown+wb); MoveSToR(k.reg, r, k.loc, h3!x); MoveSToR(k.reg, s, k.loc, h3!y); h1!x, h3!x := k.reg, r; h1!y, h3!y := k.reg, s } }; IF mergek THEN h4!x := k; regTestedAgainstZero := Null; TEST relop>s.fadd THEN CGFCompare(y, x) ELSE { LET r = ?; LET ind = h2!y; IF 0<ind<CarMark & IsConst(x) & (relop=s.eq | relop=s.ne) THEN { LET size = ind/32; LET shift = ind REM 32; LET k = h3!x; IF (size<=8 & k=0) | (size=1 & k=1) THEN { h2!y := 0; h3!x := [(-1)>>(32-size)]<<shift; IF k=1 THEN b := ~b; f := f.tsts } }; r := MoveToAnyCR(y); IF IsConst(x) & f=f.cmps THEN { LET k = h3!x; LET m = MaskFor(relop, b); IF k=0 THEN regTestedAgainstZero := r; IF LookForSLoc(NotAddr, k.number, k)=Null THEN { CompareAgainstK(r, k, m); Stack(ssp-2); RESULTIS m } }; GenF(f, r, x) } }; Stack(ssp-2); RESULTIS MaskFor(relop, b) } AND MaskFor(relop, b) = VALOF SWITCHON relop INTO { CASE s.ne: CASE s.fne: b := ~b; CASE s.eq: CASE s.feq: RESULTIS b -> m.eq, m.ne CASE s.ls: CASE s.fls: b := ~b; CASE s.ge: CASE s.fge: RESULTIS b -> m.ge, m.lt CASE s.gr: CASE s.fgr: b := ~b; CASE s.le: CASE s.fle: RESULTIS b -> m.le, m.gt CASE s.lls: b := ~b; CASE s.lge: RESULTIS b -> m.geu, m.ltu CASE s.lgr: b := ~b; CASE s.lle: RESULTIS b -> m.leu, m.gtu } AND Reverse(relop) = VALOF SWITCHON relop INTO { CASE s.ls: RESULTIS s.gr CASE s.gr: RESULTIS s.ls CASE s.le: RESULTIS s.ge CASE s.ge: RESULTIS s.le CASE s.lls: RESULTIS s.lgr CASE s.lgr: RESULTIS s.lls CASE s.lle: RESULTIS s.lge CASE s.lge: RESULTIS s.lle CASE s.fls: RESULTIS s.fgr CASE s.fgr: RESULTIS s.fls CASE s.fle: RESULTIS s.fge CASE s.fge: RESULTIS s.fle DEFAULT: RESULTIS relop } AND ComplementCondition(mask) = VALOF SWITCHON mask INTO { CASE m.eq: RESULTIS m.ne CASE m.ne: RESULTIS m.eq CASE m.lt: RESULTIS m.ge CASE m.ge: RESULTIS m.lt CASE m.gt: RESULTIS m.le CASE m.le: RESULTIS m.gt CASE m.ltu: RESULTIS m.geu CASE m.geu: RESULTIS m.ltu CASE m.gtu: RESULTIS m.leu CASE m.leu: RESULTIS m.gtu CASE m.always: RESULTIS m.never CASE m.never: CASE Null: RESULTIS m.always } AND CGSlctSt() BE { LET size = ReadN() LET shift = ReadN(); LET offset = ReadN(); LET simpleSLoc = FALSE; IF h2!arg1>=0 THEN MoveToAnyR(arg1); IF size=0 & h1!arg1~=k.shreg THEN { h4!arg1 := h4!arg1+offset; CGStind(); RETURN }; { LET b, m = -1, 0; LET n, t, k = h3!arg1, h1!arg1, h4!arg1; LET classofsel = TypeOfField(size, shift); LET a = 4*offset; IF t~=k.shreg THEN a := a+4*k; SWITCHON t INTO { CASE k.lvloc: CASE k.lvglob: CASE k.lvstatic: t, n := t+k.loc-k.lvloc, a/4+n; h1!arg1, h2!arg1, h3!arg1, h4!arg1 := t, -1, n, 0; simpleSLoc := TRUE; ENDCASE CASE k.lvlab: b, m := CheckRLLoaded(), n; ENDCASE DEFAULT: FlushPendingStores(); h4!arg1 := 0; b := LoadAddress(arg1); Lock(b, k.reg); TEST localsSafe THEN { FlushPendingLoadsExceptLocals(); FlushPendingStoresExceptLocalsAndIregs() } ELSE { FlushPendingLoads(); FlushPendingStores() } }; TEST classofsel=bytefield & ~simpleSLoc THEN GenF2(f.strb, MoveToAnyCR(arg2), b, m, a+shift/8) ELSE TEST h1!arg2=k.number THEN { LET mask = (-1>>(TargetWordSize-size))<<shift; LET r, n1 = NextR(), (h3!arg2)<<shift; LET s = r; TEST simpleSLoc THEN { s := IsInARegister(arg1); IF s=Null THEN s := r; MoveToR(s, arg1); h3!arg1 := r; DiscardReg(r, k.reg) } ELSE GenF2(f.ldr, r, b, m, a); IF n1~=mask THEN { TEST size<=16 THEN GenF1K(f.bic, r, s, mask) ELSE GenF1K(f.and, r, s, ~mask); s := r }; IF (n1&mask)~=0 THEN GenF1K(f.orr, r, s, n1&mask); TEST simpleSLoc THEN GenStore(t, n) ELSE GenF2(f.str, r, b, m, a) } ELSE { LET mask = (-1>>(TargetWordSize-size))<<shift; LET r, s = Null, Null; LET i2 = h2!arg2; LET realshift = shift; IF 0<i2<CarMark THEN { LET size2, shift2 = i2/32, i2 REM 32; IF size2>=size THEN { h2!arg2 := 0; shift := shift-shift2 } }; r := MoveToAnyR(arg2); TEST simpleSLoc THEN { s := IsInARegister(arg1); TEST s=Null THEN s := MoveToAnyCR(arg1) ELSE MoveToR(s, arg1); h3!arg1 := r; DiscardReg(r, k.reg) } ELSE { s := NextR(); GenF2(f.ldr, s, b, m, a) }; TEST (size+realshift)=32 THEN { LET s1 = simpleSloc -> NextR(), s; TEST shift=0 THEN { ShiftRegisterDS(s1, s, sh.asl, size); F1Inst(f.eor, r, r, s1, 0, sh.lsr, size, m.always) } ELSE { TEST size<=16 THEN GenF1K(f.bic, s1, s, mask) ELSE GenF1K(f.and, s1, s, ~mask); TEST shift>0 THEN F1Inst(f.eor, r, s1, r, 0, sh.asl, shift, m.always) ELSE F1Inst(f.eor, r, s1, r, 0, sh.lsr, -shift, m.always) } } ELSE { TEST shift>0 THEN F1Inst(f.eor, r, s, r, 0, sh.asl, shift, m.always) ELSE TEST shift<0 THEN F1Inst(f.eor, r, s, r, 0, sh.lsr, -shift, m.always) ELSE GenRR(f.eor, r, s, r); TEST realshift=0 THEN { ShiftRegister(r, sh.asl, 32-size); F1Inst(f.eor, r, s, r, 0, sh.lsr, 32-size, m.always) } ELSE { TEST size>=16 THEN GenF1K(f.bic, r, r, ~mask) ELSE GenF1K(f.and, r, r, mask); GenRR(f.eor, r, s, r) } }; TEST simpleSLoc THEN GenStore(t, n) ELSE GenF2(f.str, r, b, m, a) }; TEST simpleSLoc THEN Stack(ssp-1) ELSE { DiscardRegs(); Stack(ssp-2) }; IF b>=0 THEN Unlock(b, k.reg) } } AND CGByteAp(op) BE { LET a, r, x = ?, ?, Null; LET sh, m = sh.asl, 0; LET b = ?; TEST IsConst(arg1) & (-k4<=h3!arg1<=k4) & h2!arg2<0 THEN SWITCHON h1!arg2 INTO { CASE k.lvloc: a := h3!arg1+4*h4!arg2; b := linkageNotStored -> r.ts, r.p; IF ~usesFrame THEN b, a := r.ts, a-4*saveSpaceSize; a := a+nextStackWord*h3!arg2; ENDCASE CASE k.lvstatic: a, b := h3!arg1+4*(h4!arg2+h3!arg2), CheckRLLoaded(); ENDCASE CASE k.lvglob: a, b := h3!arg1+4*(h4!arg2+h3!arg2), r.g; ENDCASE CASE k.lvlab: a, m := h3!arg1+4*h4!arg2, h3!arg2; b := CheckRLLoaded(); ENDCASE; DEFAULT: IF h1!arg2~=k.shreg THEN { a := h3!arg1+nextStackWord*h4!arg2; h4!arg2 := 0 }; b := LoadAddress(arg2) } ELSE TEST IsConst(arg2) & h3!arg2=0 THEN { // special case of 0%something. // because this is a construct much used in Lisp, // where the something is a tagged pointer, I mask // out potential tag bits TEST h2!arg1<0 & h4!arg1~=0 THEN { a := h4!arg1; h4!arg1 := 0 } ELSE a := 0; b := LoadCarAdd(arg1) } ELSE { x := MoveToAnyCR(arg1); Lock(x, k.reg); TEST h2!arg2<0 THEN { IF k.lvloc<=h1!arg2<=k.lvlab THEN { h1!arg2, sh := h1!arg2+k.lvs, Null; h4!arg2 := h4!arg2*4 }; b := LookFor(arg2, ShiftedUp); TEST b>=0 & h4!arg2=0 THEN sh := Null ELSE b := MoveToAnyCR(arg2) } ELSE b := MoveToAnyCR(arg2) }; FlushPendingLoads(); FlushPendingStores(); Lock(b, k.reg); TEST op=s.putbyte THEN { r := LoadArg3ToSomeCR(); TEST x=Null THEN GenF2(f.strb, r, b, m, a) ELSE F2Inst(f.strb, r, x, 0, b, f.preup, sh, 2, m.always); TEST LocalsSafe THEN DiscardNonLocalRegs() ELSE DiscardNonConstRegs(); Stack(ssp-3) } ELSE { r := NextR(); TEST x=Null THEN GenF2(f.ldrb, r, b, m, a) ELSE F2Inst(f.ldrb, r, x, 0, b, f.preup, sh, 2, m.always); DiscardReg(r, k.reg); Lose(r, k.reg); UnLock(b, k.reg); IF x~=Null THEN UnLock(x, k.reg) } }
00000000 53 45 43 54 49 4f 4e 20 22 43 47 43 22 0a 0a 47 |SECTION "CGC"..G| 00000010 45 54 20 22 62 2e 43 47 68 65 61 64 65 72 22 0a |ET "b.CGheader".| 00000020 0a 53 54 41 54 49 43 20 7b 0a 20 20 20 2f 2f 20 |.STATIC {. // | 00000030 56 65 72 73 69 6f 6e 20 6f 66 20 31 34 20 41 70 |Version of 14 Ap| 00000040 72 20 38 36 20 31 34 3a 30 30 3a 31 31 0a 20 20 |r 86 14:00:11. | 00000050 20 64 75 6d 6d 79 20 3d 20 56 65 72 73 69 6f 6e | dummy = Version| 00000060 4d 61 72 6b 3b 0a 20 20 20 76 65 72 73 69 6f 6e |Mark;. version| 00000070 20 3d 20 31 2a 32 35 36 2b 31 39 20 7d 3b 0a 0a | = 1*256+19 };..| 00000080 2f 2a 20 31 2e 36 09 30 31 20 4e 6f 76 20 38 35 |/* 1.6.01 Nov 85| 00000090 20 31 33 3a 31 32 3a 30 33 0a 20 20 20 20 20 20 | 13:12:03. | 000000a0 52 65 63 6f 67 6e 69 73 65 20 74 68 61 74 20 61 |Recognise that a| 000000b0 66 74 65 72 20 20 43 4d 50 20 2e 2e 2c 20 23 30 |fter CMP .., #0| 000000c0 3b 20 42 4e 45 20 2e 2e 20 61 20 72 65 67 69 73 |; BNE .. a regis| 000000d0 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 30 0a 20 |ter contains 0. | 000000e0 20 20 20 20 20 42 75 67 20 66 69 78 3a 20 78 20 | Bug fix: x | 000000f0 6f 70 3a 3d 20 2e 2e 20 6d 75 73 74 20 66 6c 75 |op:= .. must flu| 00000100 73 68 20 70 65 6e 64 69 6e 67 20 73 74 6f 72 65 |sh pending store| 00000110 73 20 66 6f 72 20 78 0a 20 20 20 31 2e 37 09 20 |s for x. 1.7. | 00000120 30 34 20 4e 6f 76 20 38 35 20 31 35 3a 32 34 3a |04 Nov 85 15:24:| 00000130 34 33 0a 20 20 20 20 20 20 4c 6f 61 64 20 6f 66 |43. Load of| 00000140 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 69 6e | register for in| 00000150 64 69 72 65 63 74 20 73 74 6f 72 65 20 6d 61 79 |direct store may| 00000160 20 62 65 20 64 65 66 65 72 72 65 64 0a 20 20 20 | be deferred. | 00000170 31 2e 38 09 20 31 34 20 4a 61 6e 20 38 36 20 31 |1.8. 14 Jan 86 1| 00000180 35 3a 35 36 3a 31 32 0a 20 20 20 20 20 20 42 75 |5:56:12. Bu| 00000190 67 20 66 69 78 3a 20 4c 6f 63 6b 20 62 61 73 65 |g fix: Lock base| 000001a0 20 72 65 67 69 73 74 65 72 20 69 6e 20 6f 70 3a | register in op:| 000001b0 3d 0a 20 20 20 31 2e 39 09 20 33 30 20 4a 61 6e |=. 1.9. 30 Jan| 000001c0 20 38 36 20 31 31 3a 31 34 3a 33 35 0a 20 20 20 | 86 11:14:35. | 000001d0 20 20 20 42 75 67 20 66 69 78 3a 20 43 47 52 65 | Bug fix: CGRe| 000001e0 6c 6f 70 58 20 6e 6f 74 20 74 6f 20 6c 65 61 76 |lopX not to leav| 000001f0 65 20 61 20 72 65 67 69 73 74 65 72 20 6d 61 72 |e a register mar| 00000200 6b 65 64 20 61 73 20 63 6f 6e 74 61 69 6e 69 6e |ked as containin| 00000210 67 20 30 0a 20 20 20 20 20 20 69 66 20 69 74 20 |g 0. if it | 00000220 68 61 73 6e 27 74 20 63 6f 6d 70 69 6c 65 64 20 |hasn't compiled | 00000230 61 20 63 6f 6d 70 61 72 65 2e 0a 20 20 20 31 2e |a compare.. 1.| 00000240 31 30 20 20 30 36 20 46 65 62 20 38 36 20 31 37 |10 06 Feb 86 17| 00000250 3a 31 30 3a 31 30 0a 20 20 20 20 20 20 49 6e 63 |:10:10. Inc| 00000260 6f 72 70 6f 72 61 74 69 6f 6e 20 6f 66 20 66 6c |orporation of fl| 00000270 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 28 6e 6f |oating point (no| 00000280 74 20 69 6e 20 6f 70 3a 3d 20 74 68 6f 75 67 68 |t in op:= though| 00000290 29 0a 20 20 20 31 2e 31 31 20 20 31 38 20 46 65 |). 1.11 18 Fe| 000002a0 62 20 38 36 20 31 31 3a 31 39 3a 35 34 0a 20 20 |b 86 11:19:54. | 000002b0 20 20 20 20 42 79 74 65 20 73 65 6c 65 63 74 6f | Byte selecto| 000002c0 72 73 20 6d 65 6e 64 65 64 20 74 6f 20 67 65 74 |rs mended to get| 000002d0 20 74 68 65 20 72 69 67 68 74 20 62 79 74 65 2c | the right byte,| 000002e0 20 6e 6f 74 20 33 2d 20 69 74 2e 0a 20 20 20 20 | not 3- it.. | 000002f0 20 20 53 74 6f 72 69 6e 67 20 6f 66 20 6e 6f 6e | Storing of non| 00000300 2d 63 6f 6e 73 74 61 6e 74 20 74 6f 20 67 65 6e |-constant to gen| 00000310 65 72 61 6c 20 66 69 65 6c 64 20 63 6f 72 72 65 |eral field corre| 00000320 63 74 65 64 2e 0a 20 20 20 31 2e 31 32 20 20 32 |cted.. 1.12 2| 00000330 35 20 46 65 62 20 38 36 20 31 32 3a 33 33 3a 30 |5 Feb 86 12:33:0| 00000340 31 0a 20 20 20 20 20 20 49 6d 70 72 6f 76 65 6d |1. Improvem| 00000350 65 6e 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 |ent of code for | 00000360 66 69 65 6c 64 20 75 70 64 61 74 65 20 77 68 65 |field update whe| 00000370 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69 |re there is no i| 00000380 6e 64 69 72 65 63 74 69 6f 6e 0a 20 20 20 31 2e |ndirection. 1.| 00000390 31 33 20 20 32 36 20 46 65 62 20 38 36 20 31 31 |13 26 Feb 86 11| 000003a0 3a 34 31 3a 34 36 0a 20 20 20 20 20 20 49 6d 70 |:41:46. Imp| 000003b0 72 6f 76 65 6d 65 6e 74 20 6f 66 20 63 6f 64 65 |rovement of code| 000003c0 20 66 6f 72 20 73 74 69 6e 64 20 26 20 6f 70 3a | for stind & op:| 000003d0 3d 0a 20 20 20 31 2e 31 34 0a 20 20 20 20 20 20 |=. 1.14. | 000003e0 42 75 67 20 66 69 78 3a 20 53 6c 63 74 53 74 20 |Bug fix: SlctSt | 000003f0 64 69 64 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f |did not check fo| 00000400 72 20 69 6e 64 69 72 65 63 74 69 6f 6e 20 62 65 |r indirection be| 00000410 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 |fore considering| 00000420 0a 20 20 20 20 20 20 74 68 65 20 74 79 70 65 20 |. the type | 00000430 6f 66 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 |of the selected | 00000440 74 68 69 6e 67 2e 0a 20 20 20 31 2e 31 35 20 20 |thing.. 1.15 | 00000450 30 36 20 4d 61 72 20 38 36 20 31 32 3a 35 37 3a |06 Mar 86 12:57:| 00000460 33 32 0a 20 20 20 20 20 43 47 53 6c 63 74 53 74 |32. CGSlctSt| 00000470 20 64 69 64 20 6e 6f 74 20 6c 6f 63 6b 20 69 74 | did not lock it| 00000480 73 20 62 61 73 65 2e 0a 20 20 20 31 2e 31 36 20 |s base.. 1.16 | 00000490 20 30 37 20 4d 61 72 20 38 36 20 32 31 3a 33 30 | 07 Mar 86 21:30| 000004a0 3a 31 30 0a 20 20 20 20 20 6b 2e 73 74 61 74 69 |:10. k.stati| 000004b0 63 0a 20 20 20 31 2e 31 37 20 20 31 36 20 4d 61 |c. 1.17 16 Ma| 000004c0 72 20 38 36 20 32 32 3a 33 36 3a 31 36 0a 20 20 |r 86 22:36:16. | 000004d0 20 20 20 49 6d 70 72 6f 76 65 6d 65 6e 74 73 20 | Improvements | 000004e0 69 6e 20 63 6f 64 69 6e 67 20 6f 66 20 43 6f 6e |in coding of Con| 000004f0 64 69 74 69 6f 6e 20 28 66 69 65 6c 64 20 3a 20 |dition (field : | 00000500 63 6f 6e 73 74 61 6e 74 29 20 61 6e 64 0a 20 20 |constant) and. | 00000510 20 20 20 46 69 65 6c 64 20 75 70 64 61 74 65 20 | Field update | 00000520 28 76 61 6c 75 65 20 61 6c 73 6f 20 61 20 66 69 |(value also a fi| 00000530 65 6c 64 29 2e 0a 20 20 20 31 2e 31 38 20 20 32 |eld).. 1.18 2| 00000540 31 20 4d 61 72 20 38 36 20 31 31 3a 30 38 3a 35 |1 Mar 86 11:08:5| 00000550 37 0a 20 20 20 20 20 44 65 66 65 72 72 65 64 20 |7. Deferred | 00000560 73 68 69 66 74 73 0a 20 20 20 31 2e 31 39 20 20 |shifts. 1.19 | 00000570 31 34 20 41 70 72 20 38 36 20 31 33 3a 35 39 3a |14 Apr 86 13:59:| 00000580 32 38 0a 20 20 20 20 20 53 74 69 6e 64 20 77 69 |28. Stind wi| 00000590 74 68 20 6c 6f 63 61 6c 73 20 73 61 66 65 20 65 |th locals safe e| 000005a0 74 63 20 6e 65 65 64 20 6e 6f 74 20 66 6f 72 63 |tc need not forc| 000005b0 65 20 74 68 65 20 73 74 6f 72 65 64 20 72 65 67 |e the stored reg| 000005c0 69 73 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 |ister to be. | 000005d0 20 6c 6f 61 64 65 64 0a 2a 2f 0a 0a 53 54 41 54 | loaded.*/..STAT| 000005e0 49 43 20 7b 0a 20 20 20 72 65 67 54 65 73 74 65 |IC {. regTeste| 000005f0 64 41 67 61 69 6e 73 74 5a 65 72 6f 20 3d 20 30 |dAgainstZero = 0| 00000600 20 7d 0a 0a 4d 41 4e 49 46 45 53 54 20 7b 0a 20 | }..MANIFEST {. | 00000610 20 20 6b 2e 69 73 61 66 72 20 3d 20 32 35 36 20 | k.isafr = 256 | 00000620 7d 3b 0a 0a 4c 45 54 20 43 47 53 74 69 6e 64 28 |};..LET CGStind(| 00000630 29 20 42 45 20 7b 0a 20 20 20 4c 45 54 20 72 20 |) BE {. LET r | 00000640 3d 20 68 31 21 61 72 67 32 3d 6b 2e 66 72 65 67 |= h1!arg2=k.freg| 00000650 20 2d 3e 0a 09 20 20 20 20 20 4d 6f 76 65 54 6f | ->.. MoveTo| 00000660 41 6e 79 46 52 28 61 72 67 32 29 2b 6b 2e 69 73 |AnyFR(arg2)+k.is| 00000670 61 66 72 2c 0a 09 20 20 20 20 20 4d 6f 76 65 54 |afr,.. MoveT| 00000680 6f 41 6e 79 43 52 53 6f 6d 65 54 69 6d 65 46 6f |oAnyCRSomeTimeFo| 00000690 72 53 74 6f 72 65 54 6f 28 61 72 67 32 2c 20 53 |rStoreTo(arg2, S| 000006a0 68 69 66 74 65 64 55 70 2c 20 61 72 67 31 29 3b |hiftedUp, arg1);| 000006b0 0a 20 20 20 53 74 69 6e 64 4f 72 41 73 73 4f 70 |. StindOrAssOp| 000006c0 28 2d 31 2c 20 72 29 20 7d 0a 0a 41 4e 44 20 43 |(-1, r) }..AND C| 000006d0 47 41 73 73 4f 70 28 29 20 42 45 20 7b 0a 20 20 |GAssOp() BE {. | 000006e0 20 4c 45 54 20 72 20 3d 20 2d 31 3b 0a 20 20 20 | LET r = -1;. | 000006f0 4c 45 54 20 66 20 3d 20 3f 3b 0a 20 20 20 6f 70 |LET f = ?;. op| 00000700 20 3a 3d 20 52 65 61 64 4f 70 28 29 3b 0a 20 20 | := ReadOp();. | 00000710 20 66 20 3a 3d 20 56 41 4c 4f 46 20 53 57 49 54 | f := VALOF SWIT| 00000720 43 48 4f 4e 20 6f 70 20 49 4e 54 4f 20 7b 0a 20 |CHON op INTO {. | 00000730 20 20 20 20 20 43 41 53 45 20 73 2e 70 6c 75 73 | CASE s.plus| 00000740 3a 20 20 52 45 53 55 4c 54 49 53 20 43 47 50 6c |: RESULTIS CGPl| 00000750 75 73 0a 20 20 20 20 20 20 43 41 53 45 20 73 2e |us. CASE s.| 00000760 6d 69 6e 75 73 3a 20 52 45 53 55 4c 54 49 53 20 |minus: RESULTIS | 00000770 43 47 4d 69 6e 75 73 0a 20 20 20 20 20 20 43 41 |CGMinus. CA| 00000780 53 45 20 73 2e 6d 75 6c 74 3a 20 20 72 20 3a 3d |SE s.mult: r :=| 00000790 20 41 72 67 75 6d 65 6e 74 52 65 67 69 73 74 65 | ArgumentRegiste| 000007a0 72 28 31 29 3b 20 52 45 53 55 4c 54 49 53 20 43 |r(1); RESULTIS C| 000007b0 47 4d 75 6c 74 0a 20 20 20 20 20 20 43 41 53 45 |GMult. CASE| 000007c0 20 73 2e 64 69 76 3a 20 20 20 72 20 3a 3d 20 41 | s.div: r := A| 000007d0 72 67 75 6d 65 6e 74 52 65 67 69 73 74 65 72 28 |rgumentRegister(| 000007e0 31 29 3b 20 52 45 53 55 4c 54 49 53 20 43 47 44 |1); RESULTIS CGD| 000007f0 69 76 0a 20 20 20 20 20 20 43 41 53 45 20 73 2e |iv. CASE s.| 00000800 72 65 6d 3a 20 20 20 72 20 3a 3d 20 41 72 67 75 |rem: r := Argu| 00000810 6d 65 6e 74 52 65 67 69 73 74 65 72 28 31 29 3b |mentRegister(1);| 00000820 20 52 45 53 55 4c 54 49 53 20 43 47 52 65 6d 0a | RESULTIS CGRem.| 00000830 20 20 20 20 20 20 43 41 53 45 20 73 2e 6c 6f 67 | CASE s.log| 00000840 61 6e 64 3a 0a 20 20 20 20 20 20 43 41 53 45 20 |and:. CASE | 00000850 73 2e 6c 6f 67 6f 72 3a 0a 20 20 20 20 20 20 43 |s.logor:. C| 00000860 41 53 45 20 73 2e 65 71 76 3a 0a 20 20 20 20 20 |ASE s.eqv:. | 00000870 20 43 41 53 45 20 73 2e 6e 65 71 76 3a 20 20 52 | CASE s.neqv: R| 00000880 45 53 55 4c 54 49 53 20 43 47 4c 6f 67 6f 70 0a |ESULTIS CGLogop.| 00000890 20 20 20 20 20 20 43 41 53 45 20 73 2e 66 70 6c | CASE s.fpl| 000008a0 75 73 3a 0a 20 20 20 20 20 20 43 41 53 45 20 73 |us:. CASE s| 000008b0 2e 66 6d 69 6e 75 73 3a 0a 20 20 20 20 20 20 43 |.fminus:. C| 000008c0 41 53 45 20 73 2e 66 6d 75 6c 74 3a 0a 20 20 20 |ASE s.fmult:. | 000008d0 20 20 20 43 41 53 45 20 73 2e 66 64 69 76 3a 20 | CASE s.fdiv: | 000008e0 20 52 45 53 55 4c 54 49 53 20 43 47 46 6f 70 20 | RESULTIS CGFop | 000008f0 7d 3b 0a 20 20 20 53 74 69 6e 64 4f 72 41 73 73 |};. StindOrAss| 00000900 4f 70 28 66 2c 20 72 29 20 7d 0a 0a 41 4e 44 20 |Op(f, r) }..AND | 00000910 53 74 69 6e 64 4f 72 41 73 73 4f 70 28 78 2c 20 |StindOrAssOp(x, | 00000920 72 29 20 42 45 20 7b 0a 20 20 20 4c 45 54 20 73 |r) BE {. LET s| 00000930 2c 20 6d 2c 20 61 20 3d 20 30 2c 20 30 2c 20 30 |, m, a = 0, 0, 0| 00000940 3b 0a 20 20 20 4c 45 54 20 74 2c 20 69 6e 64 2c |;. LET t, ind,| 00000950 20 6e 2c 20 6b 20 3d 20 68 31 21 61 72 67 31 2c | n, k = h1!arg1,| 00000960 20 68 32 21 61 72 67 31 2c 20 68 33 21 61 72 67 | h2!arg1, h3!arg| 00000970 31 2c 20 34 2a 68 34 21 61 72 67 31 3b 0a 20 20 |1, 4*h4!arg1;. | 00000980 20 4c 45 54 20 73 69 6d 70 6c 65 53 4c 6f 63 20 | LET simpleSLoc | 00000990 3d 20 46 41 4c 53 45 3b 0a 20 20 20 4c 45 54 20 |= FALSE;. LET | 000009a0 73 73 20 3d 20 73 73 70 2d 32 3b 0a 0a 20 20 20 |ss = ssp-2;.. | 000009b0 49 46 20 6b 2e 69 73 61 66 72 3e 72 3e 3d 30 20 |IF k.isafr>r>=0 | 000009c0 54 48 45 4e 20 4c 6f 63 6b 28 72 2c 20 6b 2e 72 |THEN Lock(r, k.r| 000009d0 65 67 29 3b 0a 0a 20 20 20 54 45 53 54 20 28 6b |eg);.. TEST (k| 000009e0 2e 6c 76 6c 6f 63 3c 3d 74 3c 3d 6b 2e 6c 76 6c |.lvloc<=t<=k.lvl| 000009f0 61 62 29 20 26 20 69 6e 64 3c 30 20 54 48 45 4e |ab) & ind<0 THEN| 00000a00 0a 20 20 20 20 20 20 54 45 53 54 20 74 3d 6b 2e |. TEST t=k.| 00000a10 6c 76 6c 61 62 20 54 48 45 4e 20 7b 0a 09 20 73 |lvlab THEN {.. s| 00000a20 20 3a 3d 20 43 68 65 63 6b 52 4c 4c 6f 61 64 65 | := CheckRLLoade| 00000a30 64 28 29 0a 09 20 6d 2c 20 61 20 3a 3d 20 6e 2c |d().. m, a := n,| 00000a40 20 6b 20 7d 0a 20 20 20 20 20 20 45 4c 53 45 20 | k }. ELSE | 00000a50 7b 0a 09 20 74 2c 20 6e 20 3a 3d 20 74 2d 6b 2e |{.. t, n := t-k.| 00000a60 6c 76 6c 6f 63 2b 6b 2e 6c 6f 63 2c 20 6e 2b 6b |lvloc+k.loc, n+k| 00000a70 2f 34 3b 0a 09 20 68 31 21 61 72 67 31 2c 20 68 |/4;.. h1!arg1, h| 00000a80 32 21 61 72 67 31 2c 20 68 33 21 61 72 67 31 2c |2!arg1, h3!arg1,| 00000a90 20 68 34 21 61 72 67 31 20 3a 3d 20 74 2c 20 2d | h4!arg1 := t, -| 00000aa0 31 2c 20 6e 2c 20 30 3b 0a 09 20 73 69 6d 70 6c |1, n, 0;.. simpl| 00000ab0 65 53 4c 6f 63 20 3a 3d 20 54 52 55 45 20 7d 0a |eSLoc := TRUE }.| 00000ac0 0a 20 20 20 45 4c 53 45 20 54 45 53 54 20 69 6e |. ELSE TEST in| 00000ad0 64 3c 30 20 26 20 54 75 72 6e 49 6e 64 49 6e 74 |d<0 & TurnIndInt| 00000ae0 6f 53 4c 6f 63 28 61 72 67 31 29 20 54 48 45 4e |oSLoc(arg1) THEN| 00000af0 20 7b 0a 20 20 20 20 20 20 74 2c 20 6e 20 3a 3d | {. t, n :=| 00000b00 20 68 31 21 61 72 67 31 2c 20 68 33 21 61 72 67 | h1!arg1, h3!arg| 00000b10 31 3b 0a 20 20 20 20 20 20 73 69 6d 70 6c 65 53 |1;. simpleS| 00000b20 4c 6f 63 20 3a 3d 20 54 52 55 45 20 7d 0a 0a 20 |Loc := TRUE }.. | 00000b30 20 20 45 4c 53 45 20 7b 0a 20 20 20 20 20 20 54 | ELSE {. T| 00000b40 45 53 54 20 69 6e 64 3c 30 20 26 20 74 7e 3d 6b |EST ind<0 & t~=k| 00000b50 2e 73 68 72 65 67 20 54 48 45 4e 20 7b 0a 09 20 |.shreg THEN {.. | 00000b60 61 20 3a 3d 20 6b 3b 20 68 34 21 61 72 67 31 20 |a := k; h4!arg1 | 00000b70 3a 3d 20 30 20 7d 0a 20 20 20 20 20 20 45 4c 53 |:= 0 }. ELS| 00000b80 45 0a 09 20 4d 6f 76 65 54 6f 41 6e 79 52 28 61 |E.. MoveToAnyR(a| 00000b90 72 67 31 29 3b 0a 20 20 20 20 20 20 73 20 3a 3d |rg1);. s :=| 00000ba0 20 4c 6f 61 64 41 64 64 72 65 73 73 28 61 72 67 | LoadAddress(arg| 00000bb0 31 29 3b 0a 20 20 20 20 20 20 4c 6f 63 6b 28 73 |1);. Lock(s| 00000bc0 2c 20 6b 2e 72 65 67 29 3b 0a 20 20 20 20 20 20 |, k.reg);. | 00000bd0 54 45 53 54 20 6c 6f 63 61 6c 73 53 61 66 65 20 |TEST localsSafe | 00000be0 54 48 45 4e 20 7b 0a 09 20 46 6c 75 73 68 50 65 |THEN {.. FlushPe| 00000bf0 6e 64 69 6e 67 4c 6f 61 64 73 45 78 63 65 70 74 |ndingLoadsExcept| 00000c00 4c 6f 63 61 6c 73 28 29 3b 0a 09 20 46 6c 75 73 |Locals();.. Flus| 00000c10 68 50 65 6e 64 69 6e 67 53 74 6f 72 65 73 45 78 |hPendingStoresEx| 00000c20 63 65 70 74 4c 6f 63 61 6c 73 41 6e 64 49 72 65 |ceptLocalsAndIre| 00000c30 67 73 28 29 20 7d 0a 20 20 20 20 20 20 45 4c 53 |gs() }. ELS| 00000c40 45 20 7b 0a 09 20 46 6c 75 73 68 50 65 6e 64 69 |E {.. FlushPendi| 00000c50 6e 67 4c 6f 61 64 73 28 29 3b 0a 09 20 46 6c 75 |ngLoads();.. Flu| 00000c60 73 68 50 65 6e 64 69 6e 67 53 74 6f 72 65 73 28 |shPendingStores(| 00000c70 29 20 7d 20 7d 3b 0a 0a 20 20 20 54 45 53 54 20 |) } };.. TEST | 00000c80 78 3e 3d 30 20 54 48 45 4e 20 7b 0a 20 20 20 20 |x>=0 THEN {. | 00000c90 20 20 49 46 20 7e 73 69 6d 70 6c 65 53 4c 6f 63 | IF ~simpleSLoc| 00000ca0 20 54 48 45 4e 0a 09 20 54 45 53 54 20 78 3d 43 | THEN.. TEST x=C| 00000cb0 47 46 6f 70 20 54 48 45 4e 20 7b 0a 09 20 20 20 |GFop THEN {.. | 00000cc0 20 72 20 3a 3d 20 4e 65 78 74 46 52 28 29 3b 0a | r := NextFR();.| 00000cd0 09 20 20 20 20 47 65 6e 43 50 44 54 28 66 2e 6c |. GenCPDT(f.l| 00000ce0 64 2c 20 72 2c 20 73 2c 20 6d 2c 20 61 29 3b 0a |d, r, s, m, a);.| 00000cf0 09 20 20 20 20 53 74 61 63 6b 28 73 73 70 2d 31 |. Stack(ssp-1| 00000d00 29 3b 0a 09 20 20 20 20 4c 6f 61 64 28 6b 2e 66 |);.. Load(k.f| 00000d10 72 65 67 2c 20 72 29 20 7d 0a 09 20 45 4c 53 45 |reg, r) }.. ELSE| 00000d20 20 7b 0a 09 20 20 20 20 54 45 53 54 20 72 3c 30 | {.. TEST r<0| 00000d30 20 54 48 45 4e 0a 09 20 20 20 20 20 20 20 72 20 | THEN.. r | 00000d40 3a 3d 20 4e 65 78 74 52 28 29 0a 09 20 20 20 20 |:= NextR().. | 00000d50 45 4c 53 45 0a 09 20 20 20 20 20 20 20 46 72 65 |ELSE.. Fre| 00000d60 65 52 65 67 28 72 29 3b 0a 09 20 20 20 20 47 65 |eReg(r);.. Ge| 00000d70 6e 4f 70 54 6f 53 74 6f 72 65 28 66 2e 6c 64 72 |nOpToStore(f.ldr| 00000d80 2c 20 72 2c 20 73 2c 20 6d 2c 20 61 29 3b 0a 09 |, r, s, m, a);..| 00000d90 20 20 20 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 | FlushPending| 00000da0 4c 6f 61 64 73 46 6f 72 52 65 67 28 72 29 3b 0a |LoadsForReg(r);.| 00000db0 09 20 20 20 20 53 74 61 63 6b 28 73 73 70 2d 31 |. Stack(ssp-1| 00000dc0 29 3b 0a 09 20 20 20 20 4c 6f 61 64 28 6b 2e 72 |);.. Load(k.r| 00000dd0 65 67 2c 20 72 29 20 7d 3b 0a 0a 20 20 20 20 20 |eg, r) };.. | 00000de0 20 53 77 61 70 53 53 28 61 72 67 31 2c 20 61 72 | SwapSS(arg1, ar| 00000df0 67 32 29 3b 0a 20 20 20 20 20 20 78 28 6f 70 2c |g2);. x(op,| 00000e00 20 46 41 4c 53 45 29 3b 0a 20 20 20 20 20 20 72 | FALSE);. r| 00000e10 20 3a 3d 20 68 33 21 61 72 67 31 20 7d 0a 0a 20 | := h3!arg1 }.. | 00000e20 20 20 45 4c 53 45 20 53 74 61 63 6b 28 73 73 70 | ELSE Stack(ssp| 00000e30 2d 31 29 3b 0a 0a 20 20 20 54 45 53 54 20 73 69 |-1);.. TEST si| 00000e40 6d 70 6c 65 53 4c 6f 63 20 54 48 45 4e 20 7b 0a |mpleSLoc THEN {.| 00000e50 20 20 20 20 20 20 4c 45 54 20 72 74 20 3d 20 68 | LET rt = h| 00000e60 31 21 61 72 67 31 3b 0a 20 20 20 20 20 20 47 65 |1!arg1;. Ge| 00000e70 6e 53 74 6f 72 65 28 74 2c 20 6e 29 3b 0a 20 20 |nStore(t, n);. | 00000e80 20 20 20 20 49 46 20 72 74 3d 6b 2e 72 65 67 20 | IF rt=k.reg | 00000e90 26 20 72 3c 6b 2e 69 73 61 66 72 20 54 48 45 4e |& r<k.isafr THEN| 00000ea0 20 55 6e 6c 6f 63 6b 28 72 2c 20 6b 2e 72 65 67 | Unlock(r, k.reg| 00000eb0 29 20 7d 0a 20 20 20 45 4c 53 45 20 54 45 53 54 |) }. ELSE TEST| 00000ec0 20 78 3d 43 47 46 6f 70 20 7c 20 72 3e 3d 6b 2e | x=CGFop | r>=k.| 00000ed0 69 73 61 66 72 20 54 48 45 4e 0a 20 20 20 20 20 |isafr THEN. | 00000ee0 20 47 65 6e 43 50 44 54 28 66 2e 73 74 2c 20 72 | GenCPDT(f.st, r| 00000ef0 26 31 35 2c 20 73 2c 20 6d 2c 20 61 29 0a 20 20 |&15, s, m, a). | 00000f00 20 45 4c 53 45 20 54 45 53 54 20 6c 6f 63 61 6c | ELSE TEST local| 00000f10 73 53 61 66 65 20 26 20 74 3d 6b 2e 6c 6f 63 20 |sSafe & t=k.loc | 00000f20 26 20 69 6e 64 3c 30 20 54 48 45 4e 20 7b 0a 20 |& ind<0 THEN {. | 00000f30 20 20 20 20 20 4d 6f 76 65 54 6f 52 53 6f 6d 65 | MoveToRSome| 00000f40 54 69 6d 65 28 72 2c 20 61 72 67 31 29 3b 0a 20 |Time(r, arg1);. | 00000f50 20 20 20 20 20 41 64 64 54 6f 50 65 6e 64 69 6e | AddToPendin| 00000f60 67 53 74 6f 72 65 73 28 72 2c 20 6b 2e 69 72 65 |gStores(r, k.ire| 00000f70 67 2c 20 73 2c 20 46 41 4c 53 45 2c 20 61 2f 34 |g, s, FALSE, a/4| 00000f80 29 20 7d 0a 20 20 20 45 4c 53 45 20 7b 0a 20 20 |) }. ELSE {. | 00000f90 20 20 20 20 4d 6f 76 65 54 6f 52 28 72 2c 20 61 | MoveToR(r, a| 00000fa0 72 67 31 29 3b 0a 20 20 20 20 20 20 47 65 6e 46 |rg1);. GenF| 00000fb0 32 28 66 2e 73 74 72 2c 20 72 2c 20 73 2c 20 6d |2(f.str, r, s, m| 00000fc0 2c 20 61 29 20 7d 3b 0a 0a 20 20 20 55 6e 6c 6f |, a) };.. Unlo| 00000fd0 63 6b 28 73 2c 20 6b 2e 72 65 67 29 3b 0a 20 20 |ck(s, k.reg);. | 00000fe0 20 49 46 20 7e 73 69 6d 70 6c 65 53 4c 6f 63 20 | IF ~simpleSLoc | 00000ff0 54 48 45 4e 20 7b 0a 20 20 20 20 20 20 54 45 53 |THEN {. TES| 00001000 54 20 4c 6f 63 61 6c 73 53 61 66 65 20 54 48 45 |T LocalsSafe THE| 00001010 4e 0a 09 20 44 69 73 63 61 72 64 4e 6f 6e 4c 6f |N.. DiscardNonLo| 00001020 63 61 6c 52 65 67 73 28 29 0a 20 20 20 20 20 20 |calRegs(). | 00001030 45 4c 53 45 0a 09 20 44 69 73 63 61 72 64 4e 6f |ELSE.. DiscardNo| 00001040 6e 43 6f 6e 73 74 52 65 67 73 28 29 3b 0a 20 20 |nConstRegs();. | 00001050 20 20 20 20 53 74 61 63 6b 28 73 73 29 20 7d 20 | Stack(ss) } | 00001060 7d 0a 0a 41 4e 44 20 43 67 53 74 63 61 72 28 6e |}..AND CgStcar(n| 00001070 2c 20 76 61 63 61 72 29 20 42 45 20 7b 0a 20 20 |, vacar) BE {. | 00001080 20 4c 45 54 20 69 6e 64 2c 20 6b 20 3d 20 68 32 | LET ind, k = h2| 00001090 21 61 72 67 31 2c 20 68 34 21 61 72 67 31 3b 0a |!arg1, h4!arg1;.| 000010a0 20 20 20 4c 45 54 20 72 20 3d 20 3f 3b 0a 20 20 | LET r = ?;. | 000010b0 20 4c 45 54 20 73 20 3d 20 30 3b 0a 20 20 20 54 | LET s = 0;. T| 000010c0 45 53 54 20 68 31 21 61 72 67 32 3d 6b 2e 66 72 |EST h1!arg2=k.fr| 000010d0 65 67 20 54 48 45 4e 0a 20 20 20 20 20 20 72 20 |eg THEN. r | 000010e0 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 46 52 28 61 |:= MoveToAnyFR(a| 000010f0 72 67 32 29 2b 6b 2e 69 73 61 66 72 0a 20 20 20 |rg2)+k.isafr. | 00001100 45 4c 53 45 20 7b 0a 20 20 20 20 20 20 72 20 3a |ELSE {. r :| 00001110 3d 20 4d 6f 76 65 54 6f 41 6e 79 43 52 53 6f 6d |= MoveToAnyCRSom| 00001120 65 54 69 6d 65 28 61 72 67 32 29 3b 0a 20 20 20 |eTime(arg2);. | 00001130 20 20 20 4c 6f 63 6b 28 72 2c 20 6b 2e 72 65 67 | Lock(r, k.reg| 00001140 29 20 7d 3b 0a 20 20 20 54 45 53 54 20 69 6e 64 |) };. TEST ind| 00001150 3c 30 20 26 20 68 31 21 61 72 67 31 7e 3d 6b 2e |<0 & h1!arg1~=k.| 00001160 73 68 72 65 67 20 54 48 45 4e 0a 20 20 20 20 20 |shreg THEN. | 00001170 20 6e 2c 20 68 34 21 61 72 67 31 20 3a 3d 20 6e | n, h4!arg1 := n| 00001180 2b 6b 2c 20 30 0a 20 20 20 45 4c 53 45 0a 20 20 |+k, 0. ELSE. | 00001190 20 20 20 20 4d 6f 76 65 54 6f 41 6e 79 52 28 61 | MoveToAnyR(a| 000011a0 72 67 31 29 3b 0a 0a 20 20 20 73 20 3a 3d 20 28 |rg1);.. s := (| 000011b0 76 61 63 61 72 20 2d 3e 20 4d 6f 76 65 54 6f 41 |vacar -> MoveToA| 000011c0 6e 79 43 52 28 61 72 67 31 29 2c 0a 09 09 20 20 |nyCR(arg1),... | 000011d0 4c 6f 61 64 43 61 72 41 64 64 28 61 72 67 31 29 |LoadCarAdd(arg1)| 000011e0 29 3b 0a 20 20 20 54 45 53 54 20 72 3e 3d 6b 2e |);. TEST r>=k.| 000011f0 69 73 61 66 72 20 54 48 45 4e 20 7b 0a 20 20 20 |isafr THEN {. | 00001200 20 20 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 4c | FlushPendingL| 00001210 6f 61 64 73 45 78 63 65 70 74 4c 6f 63 61 6c 73 |oadsExceptLocals| 00001220 28 29 3b 0a 20 20 20 20 20 20 46 6c 75 73 68 50 |();. FlushP| 00001230 65 6e 64 69 6e 67 53 74 6f 72 65 73 45 78 63 65 |endingStoresExce| 00001240 70 74 4c 6f 63 61 6c 73 41 6e 64 49 72 65 67 73 |ptLocalsAndIregs| 00001250 28 29 3b 0a 20 20 20 20 20 20 47 65 6e 43 50 44 |();. GenCPD| 00001260 54 28 66 2e 73 74 2c 20 72 26 31 35 2c 20 73 2c |T(f.st, r&15, s,| 00001270 20 30 2c 20 6e 2f 42 79 74 65 73 50 65 72 57 6f | 0, n/BytesPerWo| 00001280 72 64 29 20 7d 0a 20 20 20 45 4c 53 45 20 7b 0a |rd) }. ELSE {.| 00001290 20 20 20 20 20 20 41 64 64 54 6f 50 65 6e 64 69 | AddToPendi| 000012a0 6e 67 53 74 6f 72 65 73 28 72 2c 20 6b 2e 69 72 |ngStores(r, k.ir| 000012b0 65 67 2c 20 73 2c 20 46 41 4c 53 45 2c 20 6e 2f |eg, s, FALSE, n/| 000012c0 42 79 74 65 73 50 65 72 57 6f 72 64 29 3b 0a 20 |BytesPerWord);. | 000012d0 20 20 20 20 20 55 6e 4c 6f 63 6b 28 72 2c 20 6b | UnLock(r, k| 000012e0 2e 72 65 67 29 20 7d 3b 0a 20 20 20 53 74 61 63 |.reg) };. Stac| 000012f0 6b 28 73 73 70 2d 32 29 20 7d 0a 0a 41 4e 44 20 |k(ssp-2) }..AND | 00001300 43 47 53 68 69 66 74 28 73 68 29 20 42 45 0a 20 |CGShift(sh) BE. | 00001310 20 20 54 45 53 54 20 68 32 21 61 72 67 32 3c 30 | TEST h2!arg2<0| 00001320 20 26 20 28 6b 2e 6c 76 6c 6f 63 3c 3d 68 31 21 | & (k.lvloc<=h1!| 00001330 61 72 67 32 3c 3d 6b 2e 6c 76 6c 61 62 29 20 26 |arg2<=k.lvlab) &| 00001340 0a 09 49 73 43 6f 6e 73 74 28 61 72 67 31 29 20 |..IsConst(arg1) | 00001350 26 20 68 33 21 61 72 67 31 3d 32 20 26 20 73 68 |& h3!arg1=2 & sh| 00001360 3d 73 68 2e 61 73 6c 20 54 48 45 4e 20 7b 0a 20 |=sh.asl THEN {. | 00001370 20 20 20 20 20 68 31 21 61 72 67 32 20 3a 3d 20 | h1!arg2 := | 00001380 68 31 21 61 72 67 32 2b 6b 2e 6c 76 73 3b 0a 20 |h1!arg2+k.lvs;. | 00001390 20 20 20 20 20 68 34 21 61 72 67 32 20 3a 3d 20 | h4!arg2 := | 000013a0 28 68 34 21 61 72 67 32 29 3c 3c 32 3b 0a 20 20 |(h4!arg2)<<2;. | 000013b0 20 20 20 20 53 74 61 63 6b 28 73 73 70 2d 31 29 | Stack(ssp-1)| 000013c0 20 7d 0a 20 20 20 45 4c 53 45 20 7b 0a 20 20 20 | }. ELSE {. | 000013d0 20 20 20 4c 45 54 20 73 20 3d 20 3f 3b 0a 20 20 | LET s = ?;. | 000013e0 20 20 20 20 4c 45 54 20 64 65 66 65 72 72 65 64 | LET deferred| 000013f0 53 68 69 66 74 20 3d 20 4e 75 6c 6c 3b 0a 20 20 |Shift = Null;. | 00001400 20 20 20 20 4c 45 54 20 72 20 3d 20 46 69 6e 64 | LET r = Find| 00001410 53 6f 75 72 63 65 41 6e 64 44 65 73 74 69 6e 61 |SourceAndDestina| 00001420 74 69 6f 6e 52 65 67 69 73 74 65 72 73 28 40 73 |tionRegisters(@s| 00001430 2c 20 61 72 67 32 2c 20 46 41 4c 53 45 29 3b 0a |, arg2, FALSE);.| 00001440 20 20 20 20 20 20 54 45 53 54 20 49 73 43 6f 6e | TEST IsCon| 00001450 73 74 28 61 72 67 31 29 20 54 48 45 4e 0a 09 20 |st(arg1) THEN.. | 00001460 54 45 53 54 20 73 3d 72 20 54 48 45 4e 0a 09 20 |TEST s=r THEN.. | 00001470 20 20 20 64 65 66 65 72 72 65 64 53 68 69 66 74 | deferredShift| 00001480 20 3a 3d 20 73 68 2a 33 32 2b 68 33 21 61 72 67 | := sh*32+h3!arg| 00001490 31 0a 09 20 45 4c 53 45 0a 09 20 20 20 20 53 68 |1.. ELSE.. Sh| 000014a0 69 66 74 52 65 67 69 73 74 65 72 44 53 28 72 2c |iftRegisterDS(r,| 000014b0 20 73 2c 20 73 68 2c 20 68 33 21 61 72 67 31 29 | s, sh, h3!arg1)| 000014c0 0a 20 20 20 20 20 20 45 4c 53 45 0a 09 20 53 68 |. ELSE.. Sh| 000014d0 69 66 74 52 65 67 69 73 74 65 72 44 53 28 72 2c |iftRegisterDS(r,| 000014e0 20 73 2c 20 73 68 2c 20 2d 4d 6f 76 65 54 6f 41 | s, sh, -MoveToA| 000014f0 6e 79 43 52 28 61 72 67 31 29 29 3b 0a 0a 20 20 |nyCR(arg1));.. | 00001500 20 20 20 20 55 6e 6c 6f 63 6b 28 73 2c 20 6b 2e | Unlock(s, k.| 00001510 72 65 67 29 3b 0a 20 20 20 20 20 20 4c 6f 73 65 |reg);. Lose| 00001520 52 28 72 2c 20 64 65 66 65 72 72 65 64 53 68 69 |R(r, deferredShi| 00001530 66 74 29 20 7d 0a 0a 41 4e 44 20 43 47 4c 6f 67 |ft) }..AND CGLog| 00001540 6f 70 28 6c 6f 67 6f 70 2c 20 72 65 61 64 41 68 |op(logop, readAh| 00001550 65 61 64 29 20 42 45 20 7b 0a 20 20 20 4c 45 54 |ead) BE {. LET| 00001560 20 78 2c 20 79 20 3d 20 61 72 67 31 2c 20 61 72 | x, y = arg1, ar| 00001570 67 32 3b 0a 20 20 20 49 46 20 43 6c 61 73 73 28 |g2;. IF Class(| 00001580 61 72 67 31 2c 20 54 52 55 45 29 3c 43 6c 61 73 |arg1, TRUE)<Clas| 00001590 73 28 61 72 67 32 2c 20 54 52 55 45 29 20 54 48 |s(arg2, TRUE) TH| 000015a0 45 4e 20 78 2c 20 79 20 3a 3d 20 61 72 67 32 2c |EN x, y := arg2,| 000015b0 20 61 72 67 31 3b 0a 20 20 20 7b 20 20 4c 45 54 | arg1;. { LET| 000015c0 20 73 20 3d 20 49 73 49 6e 41 52 65 67 69 73 74 | s = IsInARegist| 000015d0 65 72 28 79 29 3b 0a 20 20 20 20 20 20 4c 45 54 |er(y);. LET| 000015e0 20 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 4c | r = -1;. L| 000015f0 45 54 20 6e 65 78 74 4f 70 65 72 61 6e 64 20 3d |ET nextOperand =| 00001600 20 3f 3b 0a 20 20 20 20 20 20 4c 45 54 20 69 73 | ?;. LET is| 00001610 63 66 2c 20 6c 6e 70 65 6e 64 69 6e 67 20 3d 20 |cf, lnpending = | 00001620 46 41 4c 53 45 2c 20 46 41 4c 53 45 3b 0a 20 20 |FALSE, FALSE;. | 00001630 20 20 20 20 4c 45 54 20 66 20 3d 20 56 41 4c 4f | LET f = VALO| 00001640 46 20 53 57 49 54 43 48 4f 4e 20 6c 6f 67 6f 70 |F SWITCHON logop| 00001650 20 49 4e 54 4f 20 7b 0a 09 20 43 41 53 45 20 73 | INTO {.. CASE s| 00001660 2e 6c 6f 67 61 6e 64 3a 20 52 45 53 55 4c 54 49 |.logand: RESULTI| 00001670 53 20 66 2e 61 6e 64 0a 09 20 43 41 53 45 20 73 |S f.and.. CASE s| 00001680 2e 6c 6f 67 6f 72 3a 09 52 45 53 55 4c 54 49 53 |.logor:.RESULTIS| 00001690 20 66 2e 6f 72 72 0a 09 20 43 41 53 45 20 73 2e | f.orr.. CASE s.| 000016a0 65 71 76 3a 0a 09 20 43 41 53 45 20 73 2e 6e 65 |eqv:.. CASE s.ne| 000016b0 71 76 3a 09 52 45 53 55 4c 54 49 53 20 66 2e 65 |qv:.RESULTIS f.e| 000016c0 6f 72 20 7d 3b 0a 0a 20 20 20 20 20 20 49 46 20 |or };.. IF | 000016d0 72 65 61 64 41 68 65 61 64 20 54 48 45 4e 20 7b |readAhead THEN {| 000016e0 0a 09 20 6f 70 20 3a 3d 20 52 65 61 64 4f 70 28 |.. op := ReadOp(| 000016f0 29 3b 0a 09 20 54 45 53 54 20 6f 70 3d 73 2e 6c |);.. TEST op=s.l| 00001700 6e 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 6c 6e |n THEN {.. ln| 00001710 70 65 6e 64 69 6e 67 20 3a 3d 20 54 52 55 45 3b |pending := TRUE;| 00001720 0a 09 20 20 20 20 6e 65 78 74 4f 70 65 72 61 6e |.. nextOperan| 00001730 64 20 3a 3d 20 52 65 61 64 4e 28 29 3b 0a 09 20 |d := ReadN();.. | 00001740 20 20 20 6f 70 20 3a 3d 20 52 65 61 64 4f 70 28 | op := ReadOp(| 00001750 29 3b 0a 0a 09 20 20 20 20 49 46 20 6e 65 78 74 |);... IF next| 00001760 4f 70 65 72 61 6e 64 3d 30 20 26 0a 09 20 20 20 |Operand=0 &.. | 00001770 20 20 20 20 28 6f 70 3d 73 2e 65 71 20 7c 20 6f | (op=s.eq | o| 00001780 70 3d 73 2e 6e 65 29 20 26 0a 09 20 20 20 20 20 |p=s.ne) &.. | 00001790 20 20 28 6c 6f 67 6f 70 3d 73 2e 6c 6f 67 61 6e | (logop=s.logan| 000017a0 64 20 7c 20 6c 6f 67 6f 70 3d 73 2e 6e 65 71 76 |d | logop=s.neqv| 000017b0 29 0a 09 20 20 20 20 20 20 20 54 48 45 4e 20 69 |).. THEN i| 000017c0 73 63 66 20 3a 3d 20 54 52 55 45 20 7d 0a 0a 09 |scf := TRUE }...| 000017d0 20 45 4c 53 45 20 49 46 20 6f 70 3d 73 2e 72 65 | ELSE IF op=s.re| 000017e0 73 20 7c 20 6f 70 3d 73 2e 66 6e 72 6e 20 54 48 |s | op=s.fnrn TH| 000017f0 45 4e 0a 09 20 20 20 20 72 20 3a 3d 20 31 20 7d |EN.. r := 1 }| 00001800 3b 0a 0a 20 20 20 20 20 20 54 45 53 54 20 73 3d |;.. TEST s=| 00001810 4e 75 6c 6c 20 7c 0a 09 20 20 20 28 7e 4c 6f 63 |Null |.. (~Loc| 00001820 6b 65 64 28 73 2c 20 6b 2e 72 65 67 29 20 26 20 |ked(s, k.reg) & | 00001830 5b 28 68 31 21 79 3d 6b 2e 6c 6f 63 20 26 20 68 |[(h1!y=k.loc & h| 00001840 33 21 79 3e 3d 73 73 70 2d 32 29 20 7c 0a 09 09 |3!y>=ssp-2) |...| 00001850 09 20 2f 2a 20 61 6e 20 68 65 75 72 69 73 74 69 |. /* an heuristi| 00001860 63 20 74 6f 20 61 76 6f 69 64 20 63 6f 6e 73 75 |c to avoid consu| 00001870 6d 69 6e 67 20 72 65 67 69 73 74 65 72 73 0a 09 |ming registers..| 00001880 09 09 20 20 20 20 6f 76 65 72 2d 72 61 70 69 64 |.. over-rapid| 00001890 6c 79 20 2a 2f 0a 09 09 09 20 20 68 31 21 79 3d |ly */.... h1!y=| 000018a0 6b 2e 72 65 67 5d 29 20 54 48 45 4e 20 7b 0a 09 |k.reg]) THEN {..| 000018b0 20 73 20 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 52 | s := MoveToAnyR| 000018c0 28 79 29 3b 0a 09 20 49 46 20 7e 69 73 63 66 20 |(y);.. IF ~iscf | 000018d0 26 20 72 3c 30 20 54 48 45 4e 20 72 20 3a 3d 20 |& r<0 THEN r := | 000018e0 73 20 7d 0a 20 20 20 20 20 20 45 4c 53 45 20 7b |s }. ELSE {| 000018f0 0a 09 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 4c |.. FlushPendingL| 00001900 6f 61 64 73 46 6f 72 52 65 67 28 73 29 3b 0a 09 |oadsForReg(s);..| 00001910 20 4c 6f 63 6b 28 73 2c 20 6b 2e 72 65 67 29 3b | Lock(s, k.reg);| 00001920 0a 09 20 49 46 20 7e 69 73 63 66 20 26 20 72 3c |.. IF ~iscf & r<| 00001930 30 20 54 48 45 4e 20 72 20 3a 3d 20 4e 65 78 74 |0 THEN r := Next| 00001940 52 28 29 20 7d 3b 0a 0a 20 20 20 20 20 20 54 45 |R() };.. TE| 00001950 53 54 20 69 73 63 66 20 54 48 45 4e 20 7b 0a 09 |ST iscf THEN {..| 00001960 20 54 45 53 54 20 6c 6f 67 6f 70 3d 73 2e 6c 6f | TEST logop=s.lo| 00001970 67 61 6e 64 20 54 48 45 4e 0a 09 20 20 20 20 66 |gand THEN.. f| 00001980 2c 20 72 20 3a 3d 20 66 2e 74 73 74 73 2c 20 30 |, r := f.tsts, 0| 00001990 0a 09 20 45 4c 53 45 0a 09 20 20 20 20 66 2c 20 |.. ELSE.. f, | 000019a0 72 20 3a 3d 20 66 2e 74 65 71 73 2c 20 30 0a 09 |r := f.teqs, 0..| 000019b0 20 49 46 20 28 70 65 6e 64 69 6e 67 4d 61 73 6b | IF (pendingMask| 000019c0 20 7e 3d 20 6d 2e 61 6c 77 61 79 73 29 20 54 48 | ~= m.always) TH| 000019d0 45 4e 20 7b 0a 09 20 20 20 20 53 74 6f 72 65 28 |EN {.. Store(| 000019e0 30 2c 20 73 73 70 2d 34 29 3b 0a 09 20 20 20 20 |0, ssp-4);.. | 000019f0 46 6c 75 73 68 50 65 6e 64 69 6e 67 53 74 6f 72 |FlushPendingStor| 00001a00 65 73 28 29 0a 09 20 7d 0a 20 20 20 20 20 20 7d |es().. }. }| 00001a10 20 45 4c 53 45 20 7b 0a 09 20 46 6c 75 73 68 50 | ELSE {.. FlushP| 00001a20 65 6e 64 69 6e 67 55 73 65 73 4f 66 52 65 67 28 |endingUsesOfReg(| 00001a30 72 29 3b 0a 09 20 49 46 20 66 3d 66 2e 61 6e 64 |r);.. IF f=f.and| 00001a40 20 26 20 49 73 43 6f 6e 73 74 28 78 29 20 26 20 | & IsConst(x) & | 00001a50 45 69 67 68 74 42 69 74 73 4f 72 46 65 77 65 72 |EightBitsOrFewer| 00001a60 28 7e 68 33 21 78 29 20 54 48 45 4e 20 7b 0a 09 |(~h3!x) THEN {..| 00001a70 20 20 20 20 66 20 3a 3d 20 66 2e 62 69 63 3b 20 | f := f.bic; | 00001a80 68 33 21 78 20 3a 3d 20 7e 68 33 21 78 20 7d 20 |h3!x := ~h3!x } | 00001a90 7d 3b 0a 0a 20 20 20 20 20 20 47 65 6e 46 44 53 |};.. GenFDS| 00001aa0 28 66 2c 20 72 2c 20 73 2c 20 78 29 3b 0a 20 20 |(f, r, s, x);. | 00001ab0 20 20 20 20 49 46 20 6c 6f 67 6f 70 3d 73 2e 65 | IF logop=s.e| 00001ac0 71 76 20 54 48 45 4e 20 47 65 6e 52 52 28 66 2e |qv THEN GenRR(f.| 00001ad0 6d 76 6e 2c 20 72 2c 20 30 2c 20 72 29 0a 20 20 |mvn, r, 0, r). | 00001ae0 20 20 20 20 55 6e 6c 6f 63 6b 28 73 2c 20 6b 2e | Unlock(s, k.| 00001af0 72 65 67 29 3b 0a 20 20 20 20 20 20 54 45 53 54 |reg);. TEST| 00001b00 20 72 7e 3d 30 20 54 48 45 4e 0a 09 20 4c 6f 73 | r~=0 THEN.. Los| 00001b10 65 28 72 2c 20 6b 2e 72 65 67 29 0a 20 20 20 20 |e(r, k.reg). | 00001b20 20 20 45 4c 53 45 0a 09 20 53 74 61 63 6b 28 73 | ELSE.. Stack(s| 00001b30 73 70 2d 31 29 3b 0a 0a 20 20 20 20 20 20 49 46 |sp-1);.. IF| 00001b40 20 6c 6e 70 65 6e 64 69 6e 67 20 54 48 45 4e 20 | lnpending THEN | 00001b50 4c 6f 61 64 28 6b 2e 6e 75 6d 62 65 72 2c 20 6e |Load(k.number, n| 00001b60 65 78 74 4f 70 65 72 61 6e 64 29 3b 0a 20 20 20 |extOperand);. | 00001b70 20 20 20 49 46 20 69 73 63 66 20 54 48 45 4e 20 | IF iscf THEN | 00001b80 43 47 52 65 6c 6f 70 58 28 6f 70 2c 20 52 65 61 |CGRelopX(op, Rea| 00001b90 64 4f 70 28 29 2c 20 46 41 4c 53 45 29 20 7d 20 |dOp(), FALSE) } | 00001ba0 7d 0a 0a 41 4e 44 20 43 47 52 65 6c 6f 70 28 72 |}..AND CGRelop(r| 00001bb0 65 6c 6f 70 2c 20 6e 65 78 74 6f 70 29 20 42 45 |elop, nextop) BE| 00001bc0 0a 20 20 20 43 47 52 65 6c 6f 70 58 28 72 65 6c |. CGRelopX(rel| 00001bd0 6f 70 2c 20 6e 65 78 74 6f 70 2c 20 54 52 55 45 |op, nextop, TRUE| 00001be0 29 0a 0a 41 4e 44 20 43 47 52 65 6c 6f 70 58 28 |)..AND CGRelopX(| 00001bf0 72 65 6c 6f 70 2c 20 6e 65 78 74 6f 70 2c 20 63 |relop, nextop, c| 00001c00 6f 6d 70 6e 65 65 64 65 64 29 20 42 45 20 7b 0a |ompneeded) BE {.| 00001c10 20 20 20 6f 70 20 3a 3d 20 6e 65 78 74 6f 70 3b | op := nextop;| 00001c20 0a 20 20 20 54 45 53 54 20 6f 70 3d 73 2e 6a 74 |. TEST op=s.jt| 00001c30 20 7c 20 6f 70 3d 73 2e 6a 66 20 54 48 45 4e 20 | | op=s.jf THEN | 00001c40 7b 0a 20 20 20 20 20 20 4c 45 54 20 63 20 3d 20 |{. LET c = | 00001c50 3f 3b 0a 20 20 20 20 20 20 4c 45 54 20 6c 20 3d |?;. LET l =| 00001c60 20 52 65 61 64 4c 28 29 3b 0a 20 20 20 20 20 20 | ReadL();. | 00001c70 4c 45 54 20 78 20 3d 20 54 72 61 6e 73 66 65 72 |LET x = Transfer| 00001c80 72 65 64 4c 61 62 65 6c 28 6c 29 3b 0a 0a 20 20 |redLabel(l);.. | 00001c90 20 20 20 20 54 45 53 54 20 78 7e 3d 30 20 54 48 | TEST x~=0 TH| 00001ca0 45 4e 20 7b 0a 09 20 53 74 6f 72 65 28 30 2c 20 |EN {.. Store(0, | 00001cb0 73 73 70 2d 33 29 3b 0a 09 20 46 6c 75 73 68 50 |ssp-3);.. FlushP| 00001cc0 65 6e 64 69 6e 67 53 74 6f 72 65 73 28 29 20 7d |endingStores() }| 00001cd0 0a 20 20 20 20 20 20 45 4c 53 45 0a 09 20 46 6c |. ELSE.. Fl| 00001ce0 75 73 68 50 65 6e 64 69 6e 67 53 74 6f 72 65 73 |ushPendingStores| 00001cf0 45 78 63 65 70 74 4c 6f 63 61 6c 73 28 29 3b 0a |ExceptLocals();.| 00001d00 0a 20 20 20 20 20 20 63 20 3a 3d 20 43 6f 6e 64 |. c := Cond| 00001d10 69 74 69 6f 6e 58 28 72 65 6c 6f 70 2c 20 6f 70 |itionX(relop, op| 00001d20 3d 73 2e 6a 74 2c 20 63 6f 6d 70 6e 65 65 64 65 |=s.jt, compneede| 00001d30 64 29 3b 0a 20 20 20 20 20 20 53 61 76 65 53 74 |d);. SaveSt| 00001d40 61 74 65 46 6f 72 4c 61 62 28 6c 29 3b 0a 2f 2f |ateForLab(l);.//| 00001d50 20 20 20 20 49 46 20 78 7e 3d 30 20 54 48 45 4e | IF x~=0 THEN| 00001d60 20 44 65 6c 4c 6f 63 73 41 62 6f 76 65 28 30 2c | DelLocsAbove(0,| 00001d70 20 46 41 4c 53 45 29 3b 0a 20 20 20 20 20 20 43 | FALSE);. C| 00001d80 6f 6e 64 4a 75 6d 70 28 63 2c 20 6c 29 3b 0a 20 |ondJump(c, l);. | 00001d90 20 20 20 20 20 49 46 20 72 65 67 54 65 73 74 65 | IF regTeste| 00001da0 64 41 67 61 69 6e 73 74 5a 65 72 6f 7e 3d 4e 75 |dAgainstZero~=Nu| 00001db0 6c 6c 20 26 20 63 3d 6d 2e 6e 65 20 26 20 63 6f |ll & c=m.ne & co| 00001dc0 6d 70 6e 65 65 64 65 64 20 54 48 45 4e 0a 09 20 |mpneeded THEN.. | 00001dd0 41 64 64 52 65 67 49 6e 66 6f 28 6b 2e 72 65 67 |AddRegInfo(k.reg| 00001de0 2c 20 72 65 67 54 65 73 74 65 64 41 67 61 69 6e |, regTestedAgain| 00001df0 73 74 5a 65 72 6f 2c 20 6b 2e 6e 75 6d 62 65 72 |stZero, k.number| 00001e00 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 75 6e |, 0);. coun| 00001e10 74 46 6c 61 67 20 3a 3d 20 63 6f 75 6e 74 69 6e |tFlag := countin| 00001e20 67 3b 0a 20 20 20 20 20 20 6f 70 20 3a 3d 20 52 |g;. op := R| 00001e30 65 61 64 4f 70 28 29 20 7d 0a 20 20 20 45 4c 53 |eadOp() }. ELS| 00001e40 45 20 7b 0a 20 20 20 20 20 20 4c 45 54 20 72 20 |E {. LET r | 00001e50 3d 20 4e 65 78 74 52 28 29 3b 0a 20 20 20 20 20 |= NextR();. | 00001e60 20 4c 6f 63 6b 28 72 2c 20 6b 2e 72 65 67 29 3b | Lock(r, k.reg);| 00001e70 0a 20 20 20 20 20 20 49 46 20 70 65 6e 64 69 6e |. IF pendin| 00001e80 67 4c 61 62 7e 3d 4e 75 6c 6c 20 54 48 45 4e 0a |gLab~=Null THEN.| 00001e90 09 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 49 6e |. FlushPendingIn| 00001ea0 73 74 73 28 4e 75 6c 6c 2c 20 46 41 4c 53 45 29 |sts(Null, FALSE)| 00001eb0 3b 0a 20 20 20 20 20 20 47 65 6e 46 31 4b 28 66 |;. GenF1K(f| 00001ec0 2e 6d 6f 76 2c 20 72 2c 20 30 2c 20 30 29 3b 0a |.mov, r, 0, 0);.| 00001ed0 20 20 20 20 20 20 46 31 49 6e 73 74 28 66 2e 6d | F1Inst(f.m| 00001ee0 76 6e 2c 20 72 2c 20 30 2c 20 72 2c 20 30 2c 20 |vn, r, 0, r, 0, | 00001ef0 4e 75 6c 6c 2c 20 30 2c 0a 09 20 20 20 20 20 63 |Null, 0,.. c| 00001f00 6f 6e 64 69 74 69 6f 6e 58 28 72 65 6c 6f 70 2c |onditionX(relop,| 00001f10 20 54 52 55 45 2c 20 63 6f 6d 70 6e 65 65 64 65 | TRUE, compneede| 00001f20 64 29 29 3b 0a 20 20 20 20 20 20 4c 6f 61 64 28 |d));. Load(| 00001f30 6b 2e 72 65 67 2c 20 72 29 3b 0a 20 20 20 20 20 |k.reg, r);. | 00001f40 20 55 6e 4c 6f 63 6b 28 72 2c 20 6b 2e 72 65 67 | UnLock(r, k.reg| 00001f50 29 20 7d 20 7d 0a 0a 41 4e 44 20 43 6f 6e 64 69 |) } }..AND Condi| 00001f60 74 69 6f 6e 28 72 65 6c 6f 70 2c 20 62 29 20 3d |tion(relop, b) =| 00001f70 20 43 6f 6e 64 69 74 69 6f 6e 58 28 72 65 6c 6f | ConditionX(relo| 00001f80 70 2c 20 62 2c 20 54 52 55 45 29 0a 0a 41 4e 44 |p, b, TRUE)..AND| 00001f90 20 43 6f 6e 64 69 74 69 6f 6e 58 28 72 65 6c 6f | ConditionX(relo| 00001fa0 70 2c 20 62 2c 20 63 6f 6d 70 6e 65 65 64 65 64 |p, b, compneeded| 00001fb0 29 20 3d 20 56 41 4c 4f 46 20 7b 0a 20 20 20 4c |) = VALOF {. L| 00001fc0 45 54 20 78 2c 20 79 20 3d 20 61 72 67 31 2c 20 |ET x, y = arg1, | 00001fd0 61 72 67 32 3b 0a 20 20 20 4c 45 54 20 6b 2c 20 |arg2;. LET k, | 00001fe0 6d 65 72 67 65 6b 20 3d 20 30 2c 20 46 41 4c 53 |mergek = 0, FALS| 00001ff0 45 3b 0a 20 20 20 4c 45 54 20 66 20 3d 20 66 2e |E;. LET f = f.| 00002000 63 6d 70 73 3b 0a 0a 20 20 20 49 46 20 63 6f 6d |cmps;.. IF com| 00002010 70 6e 65 65 64 65 64 20 54 48 45 4e 20 7b 0a 20 |pneeded THEN {. | 00002020 20 20 20 20 20 4c 45 54 20 69 31 2c 20 69 32 20 | LET i1, i2 | 00002030 3d 20 68 32 21 61 72 67 31 2c 20 68 32 21 61 72 |= h2!arg1, h2!ar| 00002040 67 32 3b 0a 20 20 20 20 20 20 49 46 20 69 31 3c |g2;. IF i1<| 00002050 30 20 26 20 68 34 21 61 72 67 31 7e 3d 30 20 26 |0 & h4!arg1~=0 &| 00002060 20 68 31 21 61 72 67 31 7e 3d 6b 2e 73 68 72 65 | h1!arg1~=k.shre| 00002070 67 20 26 0a 09 20 69 32 3c 30 20 26 20 68 34 21 |g &.. i2<0 & h4!| 00002080 61 72 67 32 7e 3d 30 20 26 20 68 31 21 61 72 67 |arg2~=0 & h1!arg| 00002090 32 7e 3d 6b 2e 73 68 72 65 67 20 54 48 45 4e 20 |2~=k.shreg THEN | 000020a0 7b 0a 09 20 6b 20 3a 3d 20 68 34 21 61 72 67 31 |{.. k := h4!arg1| 000020b0 2d 68 34 21 61 72 67 32 3b 0a 09 20 68 34 21 61 |-h4!arg2;.. h4!a| 000020c0 72 67 31 2c 20 68 34 21 61 72 67 32 20 3a 3d 20 |rg1, h4!arg2 := | 000020d0 30 2c 20 30 3b 0a 09 20 6d 65 72 67 65 6b 20 3a |0, 0;.. mergek :| 000020e0 3d 20 54 52 55 45 20 7d 3b 0a 0a 20 20 20 20 20 |= TRUE };.. | 000020f0 20 49 46 20 43 6c 61 73 73 28 61 72 67 31 2c 20 | IF Class(arg1, | 00002100 54 52 55 45 29 3c 43 6c 61 73 73 28 61 72 67 32 |TRUE)<Class(arg2| 00002110 2c 20 54 52 55 45 29 20 54 48 45 4e 20 7b 0a 09 |, TRUE) THEN {..| 00002120 20 78 2c 20 79 20 3a 3d 20 61 72 67 32 2c 20 61 | x, y := arg2, a| 00002130 72 67 31 3b 0a 09 20 72 65 6c 6f 70 20 3a 3d 20 |rg1;.. relop := | 00002140 52 65 76 65 72 73 65 28 72 65 6c 6f 70 29 3b 0a |Reverse(relop);.| 00002150 09 20 6b 20 3a 3d 20 2d 6b 20 7d 3b 0a 0a 20 20 |. k := -k };.. | 00002160 20 2f 2a 20 4e 6f 77 20 61 20 62 69 74 20 6f 66 | /* Now a bit of| 00002170 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 64 65 | special case de| 00002180 74 65 63 74 69 6f 6e 20 77 68 69 63 68 20 73 61 |tection which sa| 00002190 79 73 20 69 66 20 62 6f 74 68 0a 20 20 20 20 20 |ys if both. | 000021a0 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 69 6e | operands are in| 000021b0 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 69 | the stack and i| 000021c0 6e 20 61 64 6a 61 63 65 6e 74 20 6c 6f 63 61 74 |n adjacent locat| 000021d0 69 6f 6e 73 2c 0a 20 20 20 20 20 20 75 73 65 20 |ions,. use | 000021e0 61 20 4c 44 4d 20 74 6f 20 65 78 74 72 61 63 74 |a LDM to extract| 000021f0 20 74 68 65 6d 2e 20 20 54 68 69 73 20 69 73 20 | them. This is | 00002200 77 6f 72 74 68 20 64 6f 69 6e 67 20 65 76 65 6e |worth doing even| 00002210 0a 20 20 20 20 20 20 69 66 20 74 68 65 72 65 20 |. if there | 00002220 69 73 20 64 65 66 65 72 6d 65 6e 74 20 6f 66 20 |is deferment of | 00002230 72 65 67 69 73 74 65 72 20 6c 6f 61 64 69 6e 67 |register loading| 00002240 2c 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 |, because it. | 00002250 20 20 20 63 61 6e 20 65 6e 73 75 72 65 20 74 68 | can ensure th| 00002260 61 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 |at registers get| 00002270 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 72 | allocated the r| 00002280 69 67 68 74 20 77 61 79 0a 20 20 20 20 20 20 72 |ight way. r| 00002290 6f 75 6e 64 20 28 61 6e 64 20 69 74 20 77 69 6c |ound (and it wil| 000022a0 6c 20 6f 66 74 65 6e 20 62 65 20 61 70 70 6c 69 |l often be appli| 000022b0 63 61 62 6c 65 20 74 6f 20 46 4f 52 20 6c 6f 6f |cable to FOR loo| 000022c0 70 73 29 0a 20 20 20 2a 2f 0a 20 20 20 20 20 20 |ps). */. | 000022d0 49 46 20 49 73 49 6e 54 68 65 53 74 61 63 6b 28 |IF IsInTheStack(| 000022e0 78 29 20 26 20 49 73 49 6e 54 68 65 53 74 61 63 |x) & IsInTheStac| 000022f0 6b 28 79 29 20 26 20 75 73 65 73 46 72 61 6d 65 |k(y) & usesFrame| 00002300 20 26 20 72 65 6c 6f 70 3c 73 2e 66 61 64 64 20 | & relop<s.fadd | 00002310 54 48 45 4e 20 7b 0a 09 20 4c 45 54 20 6c 6f 63 |THEN {.. LET loc| 00002320 31 2c 20 6c 6f 63 32 20 3d 20 68 33 21 78 2c 20 |1, loc2 = h3!x, | 00002330 68 33 21 79 3b 0a 09 20 49 46 20 5b 6c 6f 63 31 |h3!y;.. IF [loc1| 00002340 3d 28 6c 6f 63 32 2b 31 29 20 7c 20 6c 6f 63 32 |=(loc2+1) | loc2| 00002350 3d 28 6c 6f 63 31 2b 31 29 5d 20 26 0a 09 20 20 |=(loc1+1)] &.. | 00002360 20 20 4c 6f 6f 6b 46 6f 72 28 78 2c 20 4e 6f 74 | LookFor(x, Not| 00002370 41 64 64 72 29 3d 4e 75 6c 6c 20 26 0a 09 20 20 |Addr)=Null &.. | 00002380 20 20 4c 6f 6f 6b 46 6f 72 28 79 2c 20 4e 6f 74 | LookFor(y, Not| 00002390 41 64 64 72 29 3d 4e 75 6c 6c 20 54 48 45 4e 20 |Addr)=Null THEN | 000023a0 7b 0a 09 20 20 20 20 4c 45 54 20 72 2c 20 73 20 |{.. LET r, s | 000023b0 3d 20 4e 65 78 74 52 28 29 2c 20 3f 3b 0a 09 20 |= NextR(), ?;.. | 000023c0 20 20 20 4c 45 54 20 62 20 3d 20 72 2e 30 3b 0a | LET b = r.0;.| 000023d0 09 20 20 20 20 4c 45 54 20 74 6f 70 6c 6f 63 20 |. LET toploc | 000023e0 3d 20 6c 6f 63 31 3e 6c 6f 63 32 20 2d 3e 20 6c |= loc1>loc2 -> l| 000023f0 6f 63 31 2b 31 2c 20 6c 6f 63 32 2b 31 3b 0a 09 |oc1+1, loc2+1;..| 00002400 20 20 20 20 4c 45 54 20 77 62 20 3d 20 66 2e 77 | LET wb = f.w| 00002410 62 3b 0a 0a 09 20 20 20 20 4c 6f 63 6b 28 72 2c |b;... Lock(r,| 00002420 20 6b 2e 72 65 67 29 3b 20 73 20 3a 3d 20 4e 65 | k.reg); s := Ne| 00002430 78 74 52 28 29 3b 20 55 6e 6c 6f 63 6b 28 72 2c |xtR(); Unlock(r,| 00002440 20 6b 2e 72 65 67 29 3b 0a 09 20 20 20 20 49 46 | k.reg);.. IF| 00002450 20 28 28 28 72 2d 73 29 20 4e 45 51 56 20 28 6c | (((r-s) NEQV (l| 00002460 6f 63 31 2d 6c 6f 63 32 29 29 20 4e 45 51 56 20 |oc1-loc2)) NEQV | 00002470 6e 65 78 74 53 74 61 63 6b 57 6f 72 64 29 3c 30 |nextStackWord)<0| 00002480 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 2f 2f 20 | THEN {.. // | 00002490 74 68 65 20 72 65 67 69 73 74 65 72 73 20 68 61 |the registers ha| 000024a0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 |ve been allocate| 000024b0 64 20 74 68 65 20 77 72 6f 6e 67 0a 09 20 20 20 |d the wrong.. | 000024c0 20 2f 2f 20 77 61 79 20 72 6f 75 6e 64 20 2d 20 | // way round - | 000024d0 73 77 61 70 20 74 68 65 6d 0a 09 20 20 20 20 20 |swap them.. | 000024e0 20 20 4c 45 54 20 74 20 3d 20 72 3b 20 72 20 3a | LET t = r; r :| 000024f0 3d 20 73 3b 20 73 20 3a 3d 20 74 20 7d 3b 0a 0a |= s; s := t };..| 00002500 09 20 20 20 20 54 45 53 54 20 74 6f 70 6c 6f 63 |. TEST toploc| 00002510 3d 54 4f 53 4f 66 66 73 65 74 20 54 48 45 4e 0a |=TOSOffset THEN.| 00002520 09 20 20 20 20 20 20 20 62 2c 20 77 62 20 3a 3d |. b, wb :=| 00002530 20 72 2e 74 73 2c 20 30 0a 09 20 20 20 20 45 4c | r.ts, 0.. EL| 00002540 53 45 20 7b 0a 09 20 20 20 20 20 20 20 49 46 20 |SE {.. IF | 00002550 74 6f 70 6c 6f 63 7e 3d 52 30 4f 66 66 73 65 74 |toploc~=R0Offset| 00002560 20 54 48 45 4e 0a 09 09 20 20 53 65 74 52 74 6f | THEN... SetRto| 00002570 52 70 6c 75 73 4b 28 72 2e 30 2c 20 72 2e 70 2c |RplusK(r.0, r.p,| 00002580 20 6e 65 78 74 53 74 61 63 6b 57 6f 72 64 2a 74 | nextStackWord*t| 00002590 6f 70 6c 6f 63 29 3b 0a 09 20 20 20 20 20 20 20 |oploc);.. | 000025a0 52 30 4f 66 66 73 65 74 20 3a 3d 20 74 6f 70 6c |R0Offset := topl| 000025b0 6f 63 2d 32 20 7d 3b 0a 0a 09 20 20 20 20 46 34 |oc-2 };... F4| 000025c0 49 6e 73 74 28 66 2e 6c 64 6d 2c 20 62 2c 20 28 |Inst(f.ldm, b, (| 000025d0 31 3c 3c 72 29 2b 28 31 3c 3c 73 29 2c 20 72 65 |1<<r)+(1<<s), re| 000025e0 76 65 72 73 65 64 53 74 61 63 6b 20 2d 3e 20 66 |versedStack -> f| 000025f0 2e 70 72 65 75 70 2b 77 62 2c 0a 09 09 09 09 09 |.preup+wb,......| 00002600 09 09 20 20 20 20 20 66 2e 70 72 65 64 6f 77 6e |.. f.predown| 00002610 2b 77 62 29 3b 0a 0a 09 20 20 20 20 4d 6f 76 65 |+wb);... Move| 00002620 53 54 6f 52 28 6b 2e 72 65 67 2c 20 72 2c 20 6b |SToR(k.reg, r, k| 00002630 2e 6c 6f 63 2c 20 68 33 21 78 29 3b 0a 09 20 20 |.loc, h3!x);.. | 00002640 20 20 4d 6f 76 65 53 54 6f 52 28 6b 2e 72 65 67 | MoveSToR(k.reg| 00002650 2c 20 73 2c 20 6b 2e 6c 6f 63 2c 20 68 33 21 79 |, s, k.loc, h3!y| 00002660 29 3b 0a 09 20 20 20 20 68 31 21 78 2c 20 68 33 |);.. h1!x, h3| 00002670 21 78 20 3a 3d 20 6b 2e 72 65 67 2c 20 72 3b 0a |!x := k.reg, r;.| 00002680 09 20 20 20 20 68 31 21 79 2c 20 68 33 21 79 20 |. h1!y, h3!y | 00002690 3a 3d 20 6b 2e 72 65 67 2c 20 73 20 7d 20 7d 3b |:= k.reg, s } };| 000026a0 0a 0a 20 20 20 20 20 20 49 46 20 6d 65 72 67 65 |.. IF merge| 000026b0 6b 20 54 48 45 4e 20 68 34 21 78 20 3a 3d 20 6b |k THEN h4!x := k| 000026c0 3b 0a 20 20 20 20 20 20 72 65 67 54 65 73 74 65 |;. regTeste| 000026d0 64 41 67 61 69 6e 73 74 5a 65 72 6f 20 3a 3d 20 |dAgainstZero := | 000026e0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 54 45 53 54 |Null;. TEST| 000026f0 20 72 65 6c 6f 70 3e 73 2e 66 61 64 64 20 54 48 | relop>s.fadd TH| 00002700 45 4e 0a 09 20 43 47 46 43 6f 6d 70 61 72 65 28 |EN.. CGFCompare(| 00002710 79 2c 20 78 29 0a 20 20 20 20 20 20 45 4c 53 45 |y, x). ELSE| 00002720 20 7b 0a 09 20 4c 45 54 20 72 20 3d 20 3f 3b 0a | {.. LET r = ?;.| 00002730 09 20 4c 45 54 20 69 6e 64 20 3d 20 68 32 21 79 |. LET ind = h2!y| 00002740 3b 0a 09 20 49 46 20 30 3c 69 6e 64 3c 43 61 72 |;.. IF 0<ind<Car| 00002750 4d 61 72 6b 20 26 20 49 73 43 6f 6e 73 74 28 78 |Mark & IsConst(x| 00002760 29 20 26 0a 09 20 20 20 20 28 72 65 6c 6f 70 3d |) &.. (relop=| 00002770 73 2e 65 71 20 7c 20 72 65 6c 6f 70 3d 73 2e 6e |s.eq | relop=s.n| 00002780 65 29 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 4c |e) THEN {.. L| 00002790 45 54 20 73 69 7a 65 20 3d 20 69 6e 64 2f 33 32 |ET size = ind/32| 000027a0 3b 0a 09 20 20 20 20 4c 45 54 20 73 68 69 66 74 |;.. LET shift| 000027b0 20 3d 20 69 6e 64 20 52 45 4d 20 33 32 3b 0a 09 | = ind REM 32;..| 000027c0 20 20 20 20 4c 45 54 20 6b 20 3d 20 68 33 21 78 | LET k = h3!x| 000027d0 3b 0a 09 20 20 20 20 49 46 20 28 73 69 7a 65 3c |;.. IF (size<| 000027e0 3d 38 20 26 20 6b 3d 30 29 20 7c 20 28 73 69 7a |=8 & k=0) | (siz| 000027f0 65 3d 31 20 26 20 6b 3d 31 29 20 54 48 45 4e 20 |e=1 & k=1) THEN | 00002800 7b 0a 09 20 20 20 20 20 20 20 68 32 21 79 20 3a |{.. h2!y :| 00002810 3d 20 30 3b 0a 09 20 20 20 20 20 20 20 68 33 21 |= 0;.. h3!| 00002820 78 20 3a 3d 20 5b 28 2d 31 29 3e 3e 28 33 32 2d |x := [(-1)>>(32-| 00002830 73 69 7a 65 29 5d 3c 3c 73 68 69 66 74 3b 0a 09 |size)]<<shift;..| 00002840 20 20 20 20 20 20 20 49 46 20 6b 3d 31 20 54 48 | IF k=1 TH| 00002850 45 4e 20 62 20 3a 3d 20 7e 62 3b 0a 09 20 20 20 |EN b := ~b;.. | 00002860 20 20 20 20 66 20 3a 3d 20 66 2e 74 73 74 73 20 | f := f.tsts | 00002870 7d 20 7d 3b 0a 0a 09 20 72 20 3a 3d 20 4d 6f 76 |} };... r := Mov| 00002880 65 54 6f 41 6e 79 43 52 28 79 29 3b 0a 09 20 49 |eToAnyCR(y);.. I| 00002890 46 20 49 73 43 6f 6e 73 74 28 78 29 20 26 20 66 |F IsConst(x) & f| 000028a0 3d 66 2e 63 6d 70 73 20 54 48 45 4e 20 7b 0a 09 |=f.cmps THEN {..| 000028b0 20 20 20 20 4c 45 54 20 6b 20 3d 20 68 33 21 78 | LET k = h3!x| 000028c0 3b 0a 09 20 20 20 20 4c 45 54 20 6d 20 3d 20 4d |;.. LET m = M| 000028d0 61 73 6b 46 6f 72 28 72 65 6c 6f 70 2c 20 62 29 |askFor(relop, b)| 000028e0 3b 0a 09 20 20 20 20 49 46 20 6b 3d 30 20 54 48 |;.. IF k=0 TH| 000028f0 45 4e 20 72 65 67 54 65 73 74 65 64 41 67 61 69 |EN regTestedAgai| 00002900 6e 73 74 5a 65 72 6f 20 3a 3d 20 72 3b 0a 09 20 |nstZero := r;.. | 00002910 20 20 20 49 46 20 4c 6f 6f 6b 46 6f 72 53 4c 6f | IF LookForSLo| 00002920 63 28 4e 6f 74 41 64 64 72 2c 20 6b 2e 6e 75 6d |c(NotAddr, k.num| 00002930 62 65 72 2c 20 6b 29 3d 4e 75 6c 6c 20 54 48 45 |ber, k)=Null THE| 00002940 4e 20 7b 0a 09 20 20 20 20 20 20 20 43 6f 6d 70 |N {.. Comp| 00002950 61 72 65 41 67 61 69 6e 73 74 4b 28 72 2c 20 6b |areAgainstK(r, k| 00002960 2c 20 20 6d 29 3b 0a 09 20 20 20 20 20 20 20 53 |, m);.. S| 00002970 74 61 63 6b 28 73 73 70 2d 32 29 3b 0a 09 20 20 |tack(ssp-2);.. | 00002980 20 20 20 20 20 52 45 53 55 4c 54 49 53 20 6d 20 | RESULTIS m | 00002990 7d 20 7d 3b 0a 09 20 47 65 6e 46 28 66 2c 20 72 |} };.. GenF(f, r| 000029a0 2c 20 78 29 20 7d 20 7d 3b 0a 20 20 20 53 74 61 |, x) } };. Sta| 000029b0 63 6b 28 73 73 70 2d 32 29 3b 0a 20 20 20 52 45 |ck(ssp-2);. RE| 000029c0 53 55 4c 54 49 53 20 4d 61 73 6b 46 6f 72 28 72 |SULTIS MaskFor(r| 000029d0 65 6c 6f 70 2c 20 62 29 20 7d 0a 0a 41 4e 44 20 |elop, b) }..AND | 000029e0 4d 61 73 6b 46 6f 72 28 72 65 6c 6f 70 2c 20 62 |MaskFor(relop, b| 000029f0 29 20 3d 20 56 41 4c 4f 46 20 53 57 49 54 43 48 |) = VALOF SWITCH| 00002a00 4f 4e 20 72 65 6c 6f 70 20 49 4e 54 4f 20 7b 0a |ON relop INTO {.| 00002a10 20 20 20 43 41 53 45 20 73 2e 6e 65 3a 0a 20 20 | CASE s.ne:. | 00002a20 20 43 41 53 45 20 73 2e 66 6e 65 3a 20 62 20 3a | CASE s.fne: b :| 00002a30 3d 20 7e 62 3b 0a 20 20 20 43 41 53 45 20 73 2e |= ~b;. CASE s.| 00002a40 65 71 3a 0a 20 20 20 43 41 53 45 20 73 2e 66 65 |eq:. CASE s.fe| 00002a50 71 3a 20 52 45 53 55 4c 54 49 53 20 62 20 2d 3e |q: RESULTIS b ->| 00002a60 20 6d 2e 65 71 2c 20 6d 2e 6e 65 0a 0a 20 20 20 | m.eq, m.ne.. | 00002a70 43 41 53 45 20 73 2e 6c 73 3a 0a 20 20 20 43 41 |CASE s.ls:. CA| 00002a80 53 45 20 73 2e 66 6c 73 3a 20 62 20 3a 3d 20 7e |SE s.fls: b := ~| 00002a90 62 3b 0a 20 20 20 43 41 53 45 20 73 2e 67 65 3a |b;. CASE s.ge:| 00002aa0 0a 20 20 20 43 41 53 45 20 73 2e 66 67 65 3a 20 |. CASE s.fge: | 00002ab0 52 45 53 55 4c 54 49 53 20 62 20 2d 3e 20 6d 2e |RESULTIS b -> m.| 00002ac0 67 65 2c 20 6d 2e 6c 74 0a 0a 20 20 20 43 41 53 |ge, m.lt.. CAS| 00002ad0 45 20 73 2e 67 72 3a 0a 20 20 20 43 41 53 45 20 |E s.gr:. CASE | 00002ae0 73 2e 66 67 72 3a 20 62 20 3a 3d 20 7e 62 3b 0a |s.fgr: b := ~b;.| 00002af0 20 20 20 43 41 53 45 20 73 2e 6c 65 3a 0a 20 20 | CASE s.le:. | 00002b00 20 43 41 53 45 20 73 2e 66 6c 65 3a 20 52 45 53 | CASE s.fle: RES| 00002b10 55 4c 54 49 53 20 62 20 2d 3e 20 6d 2e 6c 65 2c |ULTIS b -> m.le,| 00002b20 20 6d 2e 67 74 0a 0a 20 20 20 43 41 53 45 20 73 | m.gt.. CASE s| 00002b30 2e 6c 6c 73 3a 20 62 20 3a 3d 20 7e 62 3b 0a 20 |.lls: b := ~b;. | 00002b40 20 20 43 41 53 45 20 73 2e 6c 67 65 3a 20 52 45 | CASE s.lge: RE| 00002b50 53 55 4c 54 49 53 20 62 20 2d 3e 20 6d 2e 67 65 |SULTIS b -> m.ge| 00002b60 75 2c 20 6d 2e 6c 74 75 0a 0a 20 20 20 43 41 53 |u, m.ltu.. CAS| 00002b70 45 20 73 2e 6c 67 72 3a 20 62 20 3a 3d 20 7e 62 |E s.lgr: b := ~b| 00002b80 3b 0a 20 20 20 43 41 53 45 20 73 2e 6c 6c 65 3a |;. CASE s.lle:| 00002b90 20 52 45 53 55 4c 54 49 53 20 62 20 2d 3e 20 6d | RESULTIS b -> m| 00002ba0 2e 6c 65 75 2c 20 6d 2e 67 74 75 20 7d 0a 0a 41 |.leu, m.gtu }..A| 00002bb0 4e 44 20 52 65 76 65 72 73 65 28 72 65 6c 6f 70 |ND Reverse(relop| 00002bc0 29 20 3d 20 56 41 4c 4f 46 20 53 57 49 54 43 48 |) = VALOF SWITCH| 00002bd0 4f 4e 20 72 65 6c 6f 70 20 49 4e 54 4f 20 7b 0a |ON relop INTO {.| 00002be0 20 20 20 43 41 53 45 20 73 2e 6c 73 3a 20 20 52 | CASE s.ls: R| 00002bf0 45 53 55 4c 54 49 53 20 73 2e 67 72 0a 20 20 20 |ESULTIS s.gr. | 00002c00 43 41 53 45 20 73 2e 67 72 3a 20 20 52 45 53 55 |CASE s.gr: RESU| 00002c10 4c 54 49 53 20 73 2e 6c 73 0a 20 20 20 43 41 53 |LTIS s.ls. CAS| 00002c20 45 20 73 2e 6c 65 3a 20 20 52 45 53 55 4c 54 49 |E s.le: RESULTI| 00002c30 53 20 73 2e 67 65 0a 20 20 20 43 41 53 45 20 73 |S s.ge. CASE s| 00002c40 2e 67 65 3a 20 20 52 45 53 55 4c 54 49 53 20 73 |.ge: RESULTIS s| 00002c50 2e 6c 65 0a 0a 20 20 20 43 41 53 45 20 73 2e 6c |.le.. CASE s.l| 00002c60 6c 73 3a 20 52 45 53 55 4c 54 49 53 20 73 2e 6c |ls: RESULTIS s.l| 00002c70 67 72 0a 20 20 20 43 41 53 45 20 73 2e 6c 67 72 |gr. CASE s.lgr| 00002c80 3a 20 52 45 53 55 4c 54 49 53 20 73 2e 6c 6c 73 |: RESULTIS s.lls| 00002c90 0a 20 20 20 43 41 53 45 20 73 2e 6c 6c 65 3a 20 |. CASE s.lle: | 00002ca0 52 45 53 55 4c 54 49 53 20 73 2e 6c 67 65 0a 20 |RESULTIS s.lge. | 00002cb0 20 20 43 41 53 45 20 73 2e 6c 67 65 3a 20 52 45 | CASE s.lge: RE| 00002cc0 53 55 4c 54 49 53 20 73 2e 6c 6c 65 0a 0a 20 20 |SULTIS s.lle.. | 00002cd0 20 43 41 53 45 20 73 2e 66 6c 73 3a 20 52 45 53 | CASE s.fls: RES| 00002ce0 55 4c 54 49 53 20 73 2e 66 67 72 0a 20 20 20 43 |ULTIS s.fgr. C| 00002cf0 41 53 45 20 73 2e 66 67 72 3a 20 52 45 53 55 4c |ASE s.fgr: RESUL| 00002d00 54 49 53 20 73 2e 66 6c 73 0a 20 20 20 43 41 53 |TIS s.fls. CAS| 00002d10 45 20 73 2e 66 6c 65 3a 20 52 45 53 55 4c 54 49 |E s.fle: RESULTI| 00002d20 53 20 73 2e 66 67 65 0a 20 20 20 43 41 53 45 20 |S s.fge. CASE | 00002d30 73 2e 66 67 65 3a 20 52 45 53 55 4c 54 49 53 20 |s.fge: RESULTIS | 00002d40 73 2e 66 6c 65 0a 0a 20 20 20 44 45 46 41 55 4c |s.fle.. DEFAUL| 00002d50 54 3a 20 20 20 20 52 45 53 55 4c 54 49 53 20 72 |T: RESULTIS r| 00002d60 65 6c 6f 70 20 7d 0a 0a 41 4e 44 20 43 6f 6d 70 |elop }..AND Comp| 00002d70 6c 65 6d 65 6e 74 43 6f 6e 64 69 74 69 6f 6e 28 |lementCondition(| 00002d80 6d 61 73 6b 29 20 3d 20 56 41 4c 4f 46 20 53 57 |mask) = VALOF SW| 00002d90 49 54 43 48 4f 4e 20 6d 61 73 6b 20 49 4e 54 4f |ITCHON mask INTO| 00002da0 20 7b 0a 20 20 20 43 41 53 45 20 6d 2e 65 71 3a | {. CASE m.eq:| 00002db0 20 20 52 45 53 55 4c 54 49 53 20 6d 2e 6e 65 0a | RESULTIS m.ne.| 00002dc0 20 20 20 43 41 53 45 20 6d 2e 6e 65 3a 20 20 52 | CASE m.ne: R| 00002dd0 45 53 55 4c 54 49 53 20 6d 2e 65 71 0a 0a 20 20 |ESULTIS m.eq.. | 00002de0 20 43 41 53 45 20 6d 2e 6c 74 3a 20 20 52 45 53 | CASE m.lt: RES| 00002df0 55 4c 54 49 53 20 6d 2e 67 65 0a 20 20 20 43 41 |ULTIS m.ge. CA| 00002e00 53 45 20 6d 2e 67 65 3a 20 20 52 45 53 55 4c 54 |SE m.ge: RESULT| 00002e10 49 53 20 6d 2e 6c 74 0a 0a 20 20 20 43 41 53 45 |IS m.lt.. CASE| 00002e20 20 6d 2e 67 74 3a 20 20 52 45 53 55 4c 54 49 53 | m.gt: RESULTIS| 00002e30 20 6d 2e 6c 65 0a 20 20 20 43 41 53 45 20 6d 2e | m.le. CASE m.| 00002e40 6c 65 3a 20 20 52 45 53 55 4c 54 49 53 20 6d 2e |le: RESULTIS m.| 00002e50 67 74 0a 0a 20 20 20 43 41 53 45 20 6d 2e 6c 74 |gt.. CASE m.lt| 00002e60 75 3a 20 52 45 53 55 4c 54 49 53 20 6d 2e 67 65 |u: RESULTIS m.ge| 00002e70 75 0a 20 20 20 43 41 53 45 20 6d 2e 67 65 75 3a |u. CASE m.geu:| 00002e80 20 52 45 53 55 4c 54 49 53 20 6d 2e 6c 74 75 0a | RESULTIS m.ltu.| 00002e90 0a 20 20 20 43 41 53 45 20 6d 2e 67 74 75 3a 20 |. CASE m.gtu: | 00002ea0 52 45 53 55 4c 54 49 53 20 6d 2e 6c 65 75 0a 20 |RESULTIS m.leu. | 00002eb0 20 20 43 41 53 45 20 6d 2e 6c 65 75 3a 20 52 45 | CASE m.leu: RE| 00002ec0 53 55 4c 54 49 53 20 6d 2e 67 74 75 0a 0a 20 20 |SULTIS m.gtu.. | 00002ed0 20 43 41 53 45 20 6d 2e 61 6c 77 61 79 73 3a 20 | CASE m.always: | 00002ee0 52 45 53 55 4c 54 49 53 20 6d 2e 6e 65 76 65 72 |RESULTIS m.never| 00002ef0 0a 20 20 20 43 41 53 45 20 6d 2e 6e 65 76 65 72 |. CASE m.never| 00002f00 3a 0a 20 20 20 43 41 53 45 20 4e 75 6c 6c 3a 20 |:. CASE Null: | 00002f10 20 52 45 53 55 4c 54 49 53 20 6d 2e 61 6c 77 61 | RESULTIS m.alwa| 00002f20 79 73 20 7d 0a 0a 0a 41 4e 44 20 43 47 53 6c 63 |ys }...AND CGSlc| 00002f30 74 53 74 28 29 20 42 45 20 7b 0a 20 20 20 4c 45 |tSt() BE {. LE| 00002f40 54 20 73 69 7a 65 20 3d 20 52 65 61 64 4e 28 29 |T size = ReadN()| 00002f50 0a 20 20 20 4c 45 54 20 73 68 69 66 74 20 3d 20 |. LET shift = | 00002f60 52 65 61 64 4e 28 29 3b 0a 20 20 20 4c 45 54 20 |ReadN();. LET | 00002f70 6f 66 66 73 65 74 20 3d 20 52 65 61 64 4e 28 29 |offset = ReadN()| 00002f80 3b 0a 20 20 20 4c 45 54 20 73 69 6d 70 6c 65 53 |;. LET simpleS| 00002f90 4c 6f 63 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 |Loc = FALSE;. | 00002fa0 49 46 20 68 32 21 61 72 67 31 3e 3d 30 20 54 48 |IF h2!arg1>=0 TH| 00002fb0 45 4e 20 4d 6f 76 65 54 6f 41 6e 79 52 28 61 72 |EN MoveToAnyR(ar| 00002fc0 67 31 29 3b 0a 0a 20 20 20 49 46 20 73 69 7a 65 |g1);.. IF size| 00002fd0 3d 30 20 26 20 68 31 21 61 72 67 31 7e 3d 6b 2e |=0 & h1!arg1~=k.| 00002fe0 73 68 72 65 67 20 54 48 45 4e 20 7b 0a 20 20 20 |shreg THEN {. | 00002ff0 20 20 20 68 34 21 61 72 67 31 20 3a 3d 20 68 34 | h4!arg1 := h4| 00003000 21 61 72 67 31 2b 6f 66 66 73 65 74 3b 0a 20 20 |!arg1+offset;. | 00003010 20 20 20 20 43 47 53 74 69 6e 64 28 29 3b 0a 20 | CGStind();. | 00003020 20 20 20 20 20 52 45 54 55 52 4e 20 7d 3b 0a 0a | RETURN };..| 00003030 20 20 20 7b 20 20 4c 45 54 20 62 2c 20 6d 20 3d | { LET b, m =| 00003040 20 2d 31 2c 20 30 3b 0a 20 20 20 20 20 20 4c 45 | -1, 0;. LE| 00003050 54 20 6e 2c 20 74 2c 20 6b 20 3d 20 68 33 21 61 |T n, t, k = h3!a| 00003060 72 67 31 2c 20 68 31 21 61 72 67 31 2c 20 68 34 |rg1, h1!arg1, h4| 00003070 21 61 72 67 31 3b 0a 20 20 20 20 20 20 4c 45 54 |!arg1;. LET| 00003080 20 63 6c 61 73 73 6f 66 73 65 6c 20 3d 20 54 79 | classofsel = Ty| 00003090 70 65 4f 66 46 69 65 6c 64 28 73 69 7a 65 2c 20 |peOfField(size, | 000030a0 73 68 69 66 74 29 3b 0a 20 20 20 20 20 20 4c 45 |shift);. LE| 000030b0 54 20 61 20 3d 20 34 2a 6f 66 66 73 65 74 3b 0a |T a = 4*offset;.| 000030c0 0a 20 20 20 20 20 20 49 46 20 74 7e 3d 6b 2e 73 |. IF t~=k.s| 000030d0 68 72 65 67 20 54 48 45 4e 20 61 20 3a 3d 20 61 |hreg THEN a := a| 000030e0 2b 34 2a 6b 3b 0a 20 20 20 20 20 20 53 57 49 54 |+4*k;. SWIT| 000030f0 43 48 4f 4e 20 74 20 49 4e 54 4f 20 7b 0a 09 20 |CHON t INTO {.. | 00003100 43 41 53 45 20 6b 2e 6c 76 6c 6f 63 3a 0a 09 20 |CASE k.lvloc:.. | 00003110 43 41 53 45 20 6b 2e 6c 76 67 6c 6f 62 3a 0a 09 |CASE k.lvglob:..| 00003120 20 43 41 53 45 20 6b 2e 6c 76 73 74 61 74 69 63 | CASE k.lvstatic| 00003130 3a 0a 09 20 20 20 20 74 2c 20 6e 20 3a 3d 20 74 |:.. t, n := t| 00003140 2b 6b 2e 6c 6f 63 2d 6b 2e 6c 76 6c 6f 63 2c 20 |+k.loc-k.lvloc, | 00003150 61 2f 34 2b 6e 3b 0a 09 20 20 20 20 68 31 21 61 |a/4+n;.. h1!a| 00003160 72 67 31 2c 20 68 32 21 61 72 67 31 2c 20 68 33 |rg1, h2!arg1, h3| 00003170 21 61 72 67 31 2c 20 68 34 21 61 72 67 31 20 3a |!arg1, h4!arg1 :| 00003180 3d 20 74 2c 20 2d 31 2c 20 6e 2c 20 30 3b 0a 09 |= t, -1, n, 0;..| 00003190 20 20 20 20 73 69 6d 70 6c 65 53 4c 6f 63 20 3a | simpleSLoc :| 000031a0 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 45 4e 44 |= TRUE;.. END| 000031b0 43 41 53 45 0a 0a 09 20 43 41 53 45 20 6b 2e 6c |CASE... CASE k.l| 000031c0 76 6c 61 62 3a 0a 09 20 20 20 20 62 2c 20 6d 20 |vlab:.. b, m | 000031d0 3a 3d 20 43 68 65 63 6b 52 4c 4c 6f 61 64 65 64 |:= CheckRLLoaded| 000031e0 28 29 2c 20 6e 3b 0a 09 20 20 20 20 45 4e 44 43 |(), n;.. ENDC| 000031f0 41 53 45 0a 0a 09 20 44 45 46 41 55 4c 54 3a 0a |ASE... DEFAULT:.| 00003200 09 20 20 20 20 46 6c 75 73 68 50 65 6e 64 69 6e |. FlushPendin| 00003210 67 53 74 6f 72 65 73 28 29 3b 0a 09 20 20 20 20 |gStores();.. | 00003220 68 34 21 61 72 67 31 20 3a 3d 20 30 3b 0a 09 20 |h4!arg1 := 0;.. | 00003230 20 20 20 62 20 3a 3d 20 4c 6f 61 64 41 64 64 72 | b := LoadAddr| 00003240 65 73 73 28 61 72 67 31 29 3b 0a 09 20 20 20 20 |ess(arg1);.. | 00003250 4c 6f 63 6b 28 62 2c 20 6b 2e 72 65 67 29 3b 0a |Lock(b, k.reg);.| 00003260 09 20 20 20 20 54 45 53 54 20 6c 6f 63 61 6c 73 |. TEST locals| 00003270 53 61 66 65 20 54 48 45 4e 20 7b 0a 09 20 20 20 |Safe THEN {.. | 00003280 20 20 20 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 | FlushPending| 00003290 4c 6f 61 64 73 45 78 63 65 70 74 4c 6f 63 61 6c |LoadsExceptLocal| 000032a0 73 28 29 3b 0a 09 20 20 20 20 20 20 20 46 6c 75 |s();.. Flu| 000032b0 73 68 50 65 6e 64 69 6e 67 53 74 6f 72 65 73 45 |shPendingStoresE| 000032c0 78 63 65 70 74 4c 6f 63 61 6c 73 41 6e 64 49 72 |xceptLocalsAndIr| 000032d0 65 67 73 28 29 20 7d 0a 09 20 20 20 20 45 4c 53 |egs() }.. ELS| 000032e0 45 20 7b 0a 09 20 20 20 20 20 20 20 46 6c 75 73 |E {.. Flus| 000032f0 68 50 65 6e 64 69 6e 67 4c 6f 61 64 73 28 29 3b |hPendingLoads();| 00003300 0a 09 20 20 20 20 20 20 20 46 6c 75 73 68 50 65 |.. FlushPe| 00003310 6e 64 69 6e 67 53 74 6f 72 65 73 28 29 20 7d 20 |ndingStores() } | 00003320 7d 3b 0a 0a 20 20 20 20 20 20 54 45 53 54 20 63 |};.. TEST c| 00003330 6c 61 73 73 6f 66 73 65 6c 3d 62 79 74 65 66 69 |lassofsel=bytefi| 00003340 65 6c 64 20 26 20 7e 73 69 6d 70 6c 65 53 4c 6f |eld & ~simpleSLo| 00003350 63 20 54 48 45 4e 0a 09 20 47 65 6e 46 32 28 66 |c THEN.. GenF2(f| 00003360 2e 73 74 72 62 2c 20 4d 6f 76 65 54 6f 41 6e 79 |.strb, MoveToAny| 00003370 43 52 28 61 72 67 32 29 2c 20 62 2c 20 6d 2c 20 |CR(arg2), b, m, | 00003380 61 2b 73 68 69 66 74 2f 38 29 0a 0a 20 20 20 20 |a+shift/8).. | 00003390 20 20 45 4c 53 45 20 54 45 53 54 20 68 31 21 61 | ELSE TEST h1!a| 000033a0 72 67 32 3d 6b 2e 6e 75 6d 62 65 72 20 54 48 45 |rg2=k.number THE| 000033b0 4e 20 7b 0a 09 20 4c 45 54 20 6d 61 73 6b 20 3d |N {.. LET mask =| 000033c0 20 28 2d 31 3e 3e 28 54 61 72 67 65 74 57 6f 72 | (-1>>(TargetWor| 000033d0 64 53 69 7a 65 2d 73 69 7a 65 29 29 3c 3c 73 68 |dSize-size))<<sh| 000033e0 69 66 74 3b 0a 09 20 4c 45 54 20 72 2c 20 6e 31 |ift;.. LET r, n1| 000033f0 20 3d 20 4e 65 78 74 52 28 29 2c 20 28 68 33 21 | = NextR(), (h3!| 00003400 61 72 67 32 29 3c 3c 73 68 69 66 74 3b 0a 09 20 |arg2)<<shift;.. | 00003410 4c 45 54 20 73 20 3d 20 72 3b 0a 09 20 54 45 53 |LET s = r;.. TES| 00003420 54 20 73 69 6d 70 6c 65 53 4c 6f 63 20 54 48 45 |T simpleSLoc THE| 00003430 4e 20 7b 0a 09 20 20 20 20 73 20 3a 3d 20 49 73 |N {.. s := Is| 00003440 49 6e 41 52 65 67 69 73 74 65 72 28 61 72 67 31 |InARegister(arg1| 00003450 29 3b 0a 09 20 20 20 20 49 46 20 73 3d 4e 75 6c |);.. IF s=Nul| 00003460 6c 20 54 48 45 4e 20 73 20 3a 3d 20 72 3b 0a 09 |l THEN s := r;..| 00003470 20 20 20 20 4d 6f 76 65 54 6f 52 28 73 2c 20 61 | MoveToR(s, a| 00003480 72 67 31 29 3b 0a 09 20 20 20 20 68 33 21 61 72 |rg1);.. h3!ar| 00003490 67 31 20 3a 3d 20 72 3b 0a 09 20 20 20 20 44 69 |g1 := r;.. Di| 000034a0 73 63 61 72 64 52 65 67 28 72 2c 20 6b 2e 72 65 |scardReg(r, k.re| 000034b0 67 29 20 7d 0a 09 20 45 4c 53 45 0a 09 20 20 20 |g) }.. ELSE.. | 000034c0 20 47 65 6e 46 32 28 66 2e 6c 64 72 2c 20 72 2c | GenF2(f.ldr, r,| 000034d0 20 62 2c 20 6d 2c 20 61 29 3b 0a 09 20 49 46 20 | b, m, a);.. IF | 000034e0 6e 31 7e 3d 6d 61 73 6b 20 54 48 45 4e 20 7b 0a |n1~=mask THEN {.| 000034f0 09 20 20 20 20 54 45 53 54 20 73 69 7a 65 3c 3d |. TEST size<=| 00003500 31 36 20 54 48 45 4e 0a 09 20 20 20 20 20 20 20 |16 THEN.. | 00003510 47 65 6e 46 31 4b 28 66 2e 62 69 63 2c 20 72 2c |GenF1K(f.bic, r,| 00003520 20 73 2c 20 6d 61 73 6b 29 0a 09 20 20 20 20 45 | s, mask).. E| 00003530 4c 53 45 0a 09 20 20 20 20 20 20 20 47 65 6e 46 |LSE.. GenF| 00003540 31 4b 28 66 2e 61 6e 64 2c 20 72 2c 20 73 2c 20 |1K(f.and, r, s, | 00003550 7e 6d 61 73 6b 29 3b 0a 09 20 20 20 20 73 20 3a |~mask);.. s :| 00003560 3d 20 72 20 7d 3b 0a 09 20 49 46 20 28 6e 31 26 |= r };.. IF (n1&| 00003570 6d 61 73 6b 29 7e 3d 30 20 54 48 45 4e 0a 09 20 |mask)~=0 THEN.. | 00003580 20 20 20 47 65 6e 46 31 4b 28 66 2e 6f 72 72 2c | GenF1K(f.orr,| 00003590 20 72 2c 20 73 2c 20 6e 31 26 6d 61 73 6b 29 3b | r, s, n1&mask);| 000035a0 0a 09 20 54 45 53 54 20 73 69 6d 70 6c 65 53 4c |.. TEST simpleSL| 000035b0 6f 63 20 54 48 45 4e 0a 09 20 20 20 20 47 65 6e |oc THEN.. Gen| 000035c0 53 74 6f 72 65 28 74 2c 20 6e 29 0a 09 20 45 4c |Store(t, n).. EL| 000035d0 53 45 0a 09 20 20 20 20 47 65 6e 46 32 28 66 2e |SE.. GenF2(f.| 000035e0 73 74 72 2c 20 72 2c 20 62 2c 20 6d 2c 20 61 29 |str, r, b, m, a)| 000035f0 20 7d 0a 0a 20 20 20 20 20 20 45 4c 53 45 20 7b | }.. ELSE {| 00003600 0a 09 20 4c 45 54 20 6d 61 73 6b 20 3d 20 28 2d |.. LET mask = (-| 00003610 31 3e 3e 28 54 61 72 67 65 74 57 6f 72 64 53 69 |1>>(TargetWordSi| 00003620 7a 65 2d 73 69 7a 65 29 29 3c 3c 73 68 69 66 74 |ze-size))<<shift| 00003630 3b 0a 09 20 4c 45 54 20 72 2c 20 73 20 3d 20 4e |;.. LET r, s = N| 00003640 75 6c 6c 2c 20 4e 75 6c 6c 3b 0a 09 20 4c 45 54 |ull, Null;.. LET| 00003650 20 69 32 20 3d 20 68 32 21 61 72 67 32 3b 0a 09 | i2 = h2!arg2;..| 00003660 20 4c 45 54 20 72 65 61 6c 73 68 69 66 74 20 3d | LET realshift =| 00003670 20 73 68 69 66 74 3b 0a 09 20 49 46 20 30 3c 69 | shift;.. IF 0<i| 00003680 32 3c 43 61 72 4d 61 72 6b 20 54 48 45 4e 20 7b |2<CarMark THEN {| 00003690 0a 09 20 20 20 20 4c 45 54 20 73 69 7a 65 32 2c |.. LET size2,| 000036a0 20 73 68 69 66 74 32 20 3d 20 69 32 2f 33 32 2c | shift2 = i2/32,| 000036b0 20 69 32 20 52 45 4d 20 33 32 3b 0a 09 20 20 20 | i2 REM 32;.. | 000036c0 20 49 46 20 73 69 7a 65 32 3e 3d 73 69 7a 65 20 | IF size2>=size | 000036d0 54 48 45 4e 20 7b 0a 09 20 20 20 20 20 20 20 68 |THEN {.. h| 000036e0 32 21 61 72 67 32 20 3a 3d 20 30 3b 0a 09 20 20 |2!arg2 := 0;.. | 000036f0 20 20 20 20 20 73 68 69 66 74 20 3a 3d 20 73 68 | shift := sh| 00003700 69 66 74 2d 73 68 69 66 74 32 20 7d 20 7d 3b 0a |ift-shift2 } };.| 00003710 09 20 72 20 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 |. r := MoveToAny| 00003720 52 28 61 72 67 32 29 3b 0a 09 20 54 45 53 54 20 |R(arg2);.. TEST | 00003730 73 69 6d 70 6c 65 53 4c 6f 63 20 54 48 45 4e 20 |simpleSLoc THEN | 00003740 7b 0a 09 20 20 20 20 73 20 3a 3d 20 49 73 49 6e |{.. s := IsIn| 00003750 41 52 65 67 69 73 74 65 72 28 61 72 67 31 29 3b |ARegister(arg1);| 00003760 0a 09 20 20 20 20 54 45 53 54 20 73 3d 4e 75 6c |.. TEST s=Nul| 00003770 6c 20 54 48 45 4e 0a 09 20 20 20 20 20 20 20 73 |l THEN.. s| 00003780 20 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 43 52 28 | := MoveToAnyCR(| 00003790 61 72 67 31 29 0a 09 20 20 20 20 45 4c 53 45 0a |arg1).. ELSE.| 000037a0 09 20 20 20 20 20 20 20 4d 6f 76 65 54 6f 52 28 |. MoveToR(| 000037b0 73 2c 20 61 72 67 31 29 3b 0a 09 20 20 20 20 68 |s, arg1);.. h| 000037c0 33 21 61 72 67 31 20 3a 3d 20 72 3b 0a 09 20 20 |3!arg1 := r;.. | 000037d0 20 20 44 69 73 63 61 72 64 52 65 67 28 72 2c 20 | DiscardReg(r, | 000037e0 6b 2e 72 65 67 29 20 7d 0a 09 20 45 4c 53 45 20 |k.reg) }.. ELSE | 000037f0 7b 0a 09 20 20 20 20 73 20 3a 3d 20 4e 65 78 74 |{.. s := Next| 00003800 52 28 29 3b 0a 09 20 20 20 20 47 65 6e 46 32 28 |R();.. GenF2(| 00003810 66 2e 6c 64 72 2c 20 73 2c 20 62 2c 20 6d 2c 20 |f.ldr, s, b, m, | 00003820 61 29 20 7d 3b 0a 0a 09 20 54 45 53 54 20 28 73 |a) };... TEST (s| 00003830 69 7a 65 2b 72 65 61 6c 73 68 69 66 74 29 3d 33 |ize+realshift)=3| 00003840 32 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 4c 45 |2 THEN {.. LE| 00003850 54 20 73 31 20 3d 20 73 69 6d 70 6c 65 53 6c 6f |T s1 = simpleSlo| 00003860 63 20 2d 3e 20 4e 65 78 74 52 28 29 2c 20 73 3b |c -> NextR(), s;| 00003870 0a 09 20 20 20 20 54 45 53 54 20 73 68 69 66 74 |.. TEST shift| 00003880 3d 30 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 20 |=0 THEN {.. | 00003890 20 20 53 68 69 66 74 52 65 67 69 73 74 65 72 44 | ShiftRegisterD| 000038a0 53 28 73 31 2c 20 73 2c 20 73 68 2e 61 73 6c 2c |S(s1, s, sh.asl,| 000038b0 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 20 20 20 | size);.. | 000038c0 46 31 49 6e 73 74 28 66 2e 65 6f 72 2c 20 72 2c |F1Inst(f.eor, r,| 000038d0 20 72 2c 20 73 31 2c 20 30 2c 20 73 68 2e 6c 73 | r, s1, 0, sh.ls| 000038e0 72 2c 20 73 69 7a 65 2c 20 6d 2e 61 6c 77 61 79 |r, size, m.alway| 000038f0 73 29 20 7d 0a 09 20 20 20 20 45 4c 53 45 20 7b |s) }.. ELSE {| 00003900 0a 09 20 20 20 20 20 20 20 54 45 53 54 20 73 69 |.. TEST si| 00003910 7a 65 3c 3d 31 36 20 54 48 45 4e 0a 09 09 20 20 |ze<=16 THEN... | 00003920 47 65 6e 46 31 4b 28 66 2e 62 69 63 2c 20 73 31 |GenF1K(f.bic, s1| 00003930 2c 20 73 2c 20 6d 61 73 6b 29 0a 09 20 20 20 20 |, s, mask).. | 00003940 20 20 20 45 4c 53 45 0a 09 09 20 20 47 65 6e 46 | ELSE... GenF| 00003950 31 4b 28 66 2e 61 6e 64 2c 20 73 31 2c 20 73 2c |1K(f.and, s1, s,| 00003960 20 7e 6d 61 73 6b 29 3b 0a 09 20 20 20 20 20 20 | ~mask);.. | 00003970 20 54 45 53 54 20 73 68 69 66 74 3e 30 20 54 48 | TEST shift>0 TH| 00003980 45 4e 0a 09 09 20 20 46 31 49 6e 73 74 28 66 2e |EN... F1Inst(f.| 00003990 65 6f 72 2c 20 72 2c 20 73 31 2c 20 72 2c 20 30 |eor, r, s1, r, 0| 000039a0 2c 20 73 68 2e 61 73 6c 2c 20 73 68 69 66 74 2c |, sh.asl, shift,| 000039b0 20 6d 2e 61 6c 77 61 79 73 29 0a 09 20 20 20 20 | m.always).. | 000039c0 20 20 20 45 4c 53 45 0a 09 09 20 20 46 31 49 6e | ELSE... F1In| 000039d0 73 74 28 66 2e 65 6f 72 2c 20 72 2c 20 73 31 2c |st(f.eor, r, s1,| 000039e0 20 72 2c 20 30 2c 20 73 68 2e 6c 73 72 2c 20 2d | r, 0, sh.lsr, -| 000039f0 73 68 69 66 74 2c 20 6d 2e 61 6c 77 61 79 73 29 |shift, m.always)| 00003a00 20 7d 20 7d 0a 0a 09 20 45 4c 53 45 20 7b 0a 09 | } }... ELSE {..| 00003a10 20 20 20 20 54 45 53 54 20 73 68 69 66 74 3e 30 | TEST shift>0| 00003a20 20 54 48 45 4e 0a 09 20 20 20 20 20 20 20 46 31 | THEN.. F1| 00003a30 49 6e 73 74 28 66 2e 65 6f 72 2c 20 72 2c 20 73 |Inst(f.eor, r, s| 00003a40 2c 20 72 2c 20 30 2c 20 73 68 2e 61 73 6c 2c 20 |, r, 0, sh.asl, | 00003a50 73 68 69 66 74 2c 20 6d 2e 61 6c 77 61 79 73 29 |shift, m.always)| 00003a60 0a 09 20 20 20 20 45 4c 53 45 20 54 45 53 54 20 |.. ELSE TEST | 00003a70 73 68 69 66 74 3c 30 20 54 48 45 4e 0a 09 20 20 |shift<0 THEN.. | 00003a80 20 20 20 20 20 46 31 49 6e 73 74 28 66 2e 65 6f | F1Inst(f.eo| 00003a90 72 2c 20 72 2c 20 73 2c 20 72 2c 20 30 2c 20 73 |r, r, s, r, 0, s| 00003aa0 68 2e 6c 73 72 2c 20 2d 73 68 69 66 74 2c 20 6d |h.lsr, -shift, m| 00003ab0 2e 61 6c 77 61 79 73 29 0a 09 20 20 20 20 45 4c |.always).. EL| 00003ac0 53 45 0a 09 20 20 20 20 20 20 20 47 65 6e 52 52 |SE.. GenRR| 00003ad0 28 66 2e 65 6f 72 2c 20 72 2c 20 73 2c 20 72 29 |(f.eor, r, s, r)| 00003ae0 3b 0a 0a 09 20 20 20 20 54 45 53 54 20 72 65 61 |;... TEST rea| 00003af0 6c 73 68 69 66 74 3d 30 20 54 48 45 4e 20 7b 0a |lshift=0 THEN {.| 00003b00 09 20 20 20 20 20 20 20 53 68 69 66 74 52 65 67 |. ShiftReg| 00003b10 69 73 74 65 72 28 72 2c 20 73 68 2e 61 73 6c 2c |ister(r, sh.asl,| 00003b20 20 33 32 2d 73 69 7a 65 29 3b 0a 09 20 20 20 20 | 32-size);.. | 00003b30 20 20 20 46 31 49 6e 73 74 28 66 2e 65 6f 72 2c | F1Inst(f.eor,| 00003b40 20 72 2c 20 73 2c 20 72 2c 20 30 2c 20 73 68 2e | r, s, r, 0, sh.| 00003b50 6c 73 72 2c 20 33 32 2d 73 69 7a 65 2c 20 6d 2e |lsr, 32-size, m.| 00003b60 61 6c 77 61 79 73 29 20 7d 0a 09 20 20 20 20 45 |always) }.. E| 00003b70 4c 53 45 20 7b 0a 09 20 20 20 20 20 20 20 54 45 |LSE {.. TE| 00003b80 53 54 20 73 69 7a 65 3e 3d 31 36 20 54 48 45 4e |ST size>=16 THEN| 00003b90 0a 09 09 20 20 47 65 6e 46 31 4b 28 66 2e 62 69 |... GenF1K(f.bi| 00003ba0 63 2c 20 72 2c 20 72 2c 20 7e 6d 61 73 6b 29 0a |c, r, r, ~mask).| 00003bb0 09 20 20 20 20 20 20 20 45 4c 53 45 0a 09 09 20 |. ELSE... | 00003bc0 20 47 65 6e 46 31 4b 28 66 2e 61 6e 64 2c 20 72 | GenF1K(f.and, r| 00003bd0 2c 20 72 2c 20 6d 61 73 6b 29 3b 0a 09 20 20 20 |, r, mask);.. | 00003be0 20 20 20 20 47 65 6e 52 52 28 66 2e 65 6f 72 2c | GenRR(f.eor,| 00003bf0 20 72 2c 20 73 2c 20 72 29 20 7d 20 7d 3b 0a 09 | r, s, r) } };..| 00003c00 20 54 45 53 54 20 73 69 6d 70 6c 65 53 4c 6f 63 | TEST simpleSLoc| 00003c10 20 54 48 45 4e 0a 09 20 20 20 20 47 65 6e 53 74 | THEN.. GenSt| 00003c20 6f 72 65 28 74 2c 20 6e 29 0a 09 20 45 4c 53 45 |ore(t, n).. ELSE| 00003c30 0a 09 20 20 20 20 47 65 6e 46 32 28 66 2e 73 74 |.. GenF2(f.st| 00003c40 72 2c 20 72 2c 20 62 2c 20 6d 2c 20 61 29 20 7d |r, r, b, m, a) }| 00003c50 3b 0a 20 20 20 20 20 20 54 45 53 54 20 73 69 6d |;. TEST sim| 00003c60 70 6c 65 53 4c 6f 63 20 54 48 45 4e 0a 09 20 53 |pleSLoc THEN.. S| 00003c70 74 61 63 6b 28 73 73 70 2d 31 29 0a 20 20 20 20 |tack(ssp-1). | 00003c80 20 20 45 4c 53 45 20 7b 0a 09 20 44 69 73 63 61 | ELSE {.. Disca| 00003c90 72 64 52 65 67 73 28 29 3b 0a 09 20 53 74 61 63 |rdRegs();.. Stac| 00003ca0 6b 28 73 73 70 2d 32 29 20 7d 3b 0a 0a 20 20 20 |k(ssp-2) };.. | 00003cb0 20 20 20 49 46 20 62 3e 3d 30 20 54 48 45 4e 20 | IF b>=0 THEN | 00003cc0 55 6e 6c 6f 63 6b 28 62 2c 20 6b 2e 72 65 67 29 |Unlock(b, k.reg)| 00003cd0 20 7d 20 7d 0a 0a 41 4e 44 20 43 47 42 79 74 65 | } }..AND CGByte| 00003ce0 41 70 28 6f 70 29 20 42 45 20 7b 0a 20 20 20 4c |Ap(op) BE {. L| 00003cf0 45 54 20 61 2c 20 72 2c 20 78 20 3d 20 3f 2c 20 |ET a, r, x = ?, | 00003d00 3f 2c 20 4e 75 6c 6c 3b 0a 20 20 20 4c 45 54 20 |?, Null;. LET | 00003d10 73 68 2c 20 6d 20 3d 20 73 68 2e 61 73 6c 2c 20 |sh, m = sh.asl, | 00003d20 30 3b 0a 20 20 20 4c 45 54 20 62 20 3d 20 3f 3b |0;. LET b = ?;| 00003d30 0a 0a 20 20 20 54 45 53 54 20 49 73 43 6f 6e 73 |.. TEST IsCons| 00003d40 74 28 61 72 67 31 29 20 26 20 28 2d 6b 34 3c 3d |t(arg1) & (-k4<=| 00003d50 68 33 21 61 72 67 31 3c 3d 6b 34 29 20 26 20 68 |h3!arg1<=k4) & h| 00003d60 32 21 61 72 67 32 3c 30 0a 20 20 20 20 20 20 54 |2!arg2<0. T| 00003d70 48 45 4e 20 53 57 49 54 43 48 4f 4e 20 68 31 21 |HEN SWITCHON h1!| 00003d80 61 72 67 32 20 49 4e 54 4f 20 7b 0a 09 20 43 41 |arg2 INTO {.. CA| 00003d90 53 45 20 6b 2e 6c 76 6c 6f 63 3a 0a 09 20 20 20 |SE k.lvloc:.. | 00003da0 20 61 20 3a 3d 20 68 33 21 61 72 67 31 2b 34 2a | a := h3!arg1+4*| 00003db0 68 34 21 61 72 67 32 3b 0a 09 20 20 20 20 62 20 |h4!arg2;.. b | 00003dc0 3a 3d 20 6c 69 6e 6b 61 67 65 4e 6f 74 53 74 6f |:= linkageNotSto| 00003dd0 72 65 64 20 2d 3e 20 72 2e 74 73 2c 20 72 2e 70 |red -> r.ts, r.p| 00003de0 3b 0a 09 20 20 20 20 49 46 20 7e 75 73 65 73 46 |;.. IF ~usesF| 00003df0 72 61 6d 65 20 54 48 45 4e 20 62 2c 20 61 20 3a |rame THEN b, a :| 00003e00 3d 20 72 2e 74 73 2c 20 61 2d 34 2a 73 61 76 65 |= r.ts, a-4*save| 00003e10 53 70 61 63 65 53 69 7a 65 3b 0a 09 20 20 20 20 |SpaceSize;.. | 00003e20 61 20 3a 3d 20 61 2b 6e 65 78 74 53 74 61 63 6b |a := a+nextStack| 00003e30 57 6f 72 64 2a 68 33 21 61 72 67 32 3b 0a 09 20 |Word*h3!arg2;.. | 00003e40 20 20 20 45 4e 44 43 41 53 45 0a 0a 09 20 43 41 | ENDCASE... CA| 00003e50 53 45 20 6b 2e 6c 76 73 74 61 74 69 63 3a 0a 09 |SE k.lvstatic:..| 00003e60 20 20 20 20 61 2c 20 62 20 3a 3d 20 68 33 21 61 | a, b := h3!a| 00003e70 72 67 31 2b 34 2a 28 68 34 21 61 72 67 32 2b 68 |rg1+4*(h4!arg2+h| 00003e80 33 21 61 72 67 32 29 2c 20 43 68 65 63 6b 52 4c |3!arg2), CheckRL| 00003e90 4c 6f 61 64 65 64 28 29 3b 0a 09 20 20 20 20 45 |Loaded();.. E| 00003ea0 4e 44 43 41 53 45 0a 0a 09 20 43 41 53 45 20 6b |NDCASE... CASE k| 00003eb0 2e 6c 76 67 6c 6f 62 3a 0a 09 20 20 20 20 61 2c |.lvglob:.. a,| 00003ec0 20 62 20 3a 3d 20 68 33 21 61 72 67 31 2b 34 2a | b := h3!arg1+4*| 00003ed0 28 68 34 21 61 72 67 32 2b 68 33 21 61 72 67 32 |(h4!arg2+h3!arg2| 00003ee0 29 2c 20 72 2e 67 3b 0a 09 20 20 20 20 45 4e 44 |), r.g;.. END| 00003ef0 43 41 53 45 0a 0a 09 20 43 41 53 45 20 6b 2e 6c |CASE... CASE k.l| 00003f00 76 6c 61 62 3a 0a 09 20 20 20 20 61 2c 20 6d 20 |vlab:.. a, m | 00003f10 3a 3d 20 68 33 21 61 72 67 31 2b 34 2a 68 34 21 |:= h3!arg1+4*h4!| 00003f20 61 72 67 32 2c 20 68 33 21 61 72 67 32 3b 0a 09 |arg2, h3!arg2;..| 00003f30 20 20 20 20 62 20 3a 3d 20 43 68 65 63 6b 52 4c | b := CheckRL| 00003f40 4c 6f 61 64 65 64 28 29 3b 0a 09 20 20 20 20 45 |Loaded();.. E| 00003f50 4e 44 43 41 53 45 3b 0a 0a 09 20 44 45 46 41 55 |NDCASE;... DEFAU| 00003f60 4c 54 3a 0a 09 20 20 20 20 49 46 20 68 31 21 61 |LT:.. IF h1!a| 00003f70 72 67 32 7e 3d 6b 2e 73 68 72 65 67 20 54 48 45 |rg2~=k.shreg THE| 00003f80 4e 20 7b 0a 09 20 20 20 20 20 20 20 61 20 3a 3d |N {.. a :=| 00003f90 20 68 33 21 61 72 67 31 2b 6e 65 78 74 53 74 61 | h3!arg1+nextSta| 00003fa0 63 6b 57 6f 72 64 2a 68 34 21 61 72 67 32 3b 0a |ckWord*h4!arg2;.| 00003fb0 09 20 20 20 20 20 20 20 68 34 21 61 72 67 32 20 |. h4!arg2 | 00003fc0 3a 3d 20 30 20 7d 3b 0a 09 20 20 20 20 62 20 3a |:= 0 };.. b :| 00003fd0 3d 20 4c 6f 61 64 41 64 64 72 65 73 73 28 61 72 |= LoadAddress(ar| 00003fe0 67 32 29 20 7d 0a 0a 20 20 20 45 4c 53 45 20 54 |g2) }.. ELSE T| 00003ff0 45 53 54 20 49 73 43 6f 6e 73 74 28 61 72 67 32 |EST IsConst(arg2| 00004000 29 20 26 20 68 33 21 61 72 67 32 3d 30 20 54 48 |) & h3!arg2=0 TH| 00004010 45 4e 20 7b 0a 20 20 20 20 20 20 20 2f 2f 20 73 |EN {. // s| 00004020 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 30 |pecial case of 0| 00004030 25 73 6f 6d 65 74 68 69 6e 67 2e 0a 20 20 20 20 |%something.. | 00004040 20 20 20 2f 2f 20 62 65 63 61 75 73 65 20 74 68 | // because th| 00004050 69 73 20 69 73 20 61 20 63 6f 6e 73 74 72 75 63 |is is a construc| 00004060 74 20 6d 75 63 68 20 75 73 65 64 20 69 6e 20 4c |t much used in L| 00004070 69 73 70 2c 0a 20 20 20 20 20 20 20 2f 2f 20 77 |isp,. // w| 00004080 68 65 72 65 20 74 68 65 20 73 6f 6d 65 74 68 69 |here the somethi| 00004090 6e 67 20 69 73 20 61 20 74 61 67 67 65 64 20 70 |ng is a tagged p| 000040a0 6f 69 6e 74 65 72 2c 20 49 20 6d 61 73 6b 0a 20 |ointer, I mask. | 000040b0 20 20 20 20 20 20 2f 2f 20 6f 75 74 20 70 6f 74 | // out pot| 000040c0 65 6e 74 69 61 6c 20 74 61 67 20 62 69 74 73 0a |ential tag bits.| 000040d0 20 20 20 20 20 20 54 45 53 54 20 68 32 21 61 72 | TEST h2!ar| 000040e0 67 31 3c 30 20 26 20 68 34 21 61 72 67 31 7e 3d |g1<0 & h4!arg1~=| 000040f0 30 20 54 48 45 4e 20 7b 0a 09 20 61 20 3a 3d 20 |0 THEN {.. a := | 00004100 68 34 21 61 72 67 31 3b 0a 09 20 68 34 21 61 72 |h4!arg1;.. h4!ar| 00004110 67 31 20 3a 3d 20 30 20 7d 0a 20 20 20 20 20 20 |g1 := 0 }. | 00004120 45 4c 53 45 0a 09 20 61 20 3a 3d 20 30 3b 0a 20 |ELSE.. a := 0;. | 00004130 20 20 20 20 20 62 20 3a 3d 20 4c 6f 61 64 43 61 | b := LoadCa| 00004140 72 41 64 64 28 61 72 67 31 29 20 7d 0a 0a 20 20 |rAdd(arg1) }.. | 00004150 20 45 4c 53 45 20 7b 0a 20 20 20 20 20 20 78 20 | ELSE {. x | 00004160 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 43 52 28 61 |:= MoveToAnyCR(a| 00004170 72 67 31 29 3b 20 4c 6f 63 6b 28 78 2c 20 6b 2e |rg1); Lock(x, k.| 00004180 72 65 67 29 3b 0a 20 20 20 20 20 20 54 45 53 54 |reg);. TEST| 00004190 20 68 32 21 61 72 67 32 3c 30 20 54 48 45 4e 20 | h2!arg2<0 THEN | 000041a0 7b 0a 09 20 49 46 20 6b 2e 6c 76 6c 6f 63 3c 3d |{.. IF k.lvloc<=| 000041b0 68 31 21 61 72 67 32 3c 3d 6b 2e 6c 76 6c 61 62 |h1!arg2<=k.lvlab| 000041c0 20 54 48 45 4e 20 7b 0a 09 20 20 20 20 68 31 21 | THEN {.. h1!| 000041d0 61 72 67 32 2c 20 73 68 20 3a 3d 20 68 31 21 61 |arg2, sh := h1!a| 000041e0 72 67 32 2b 6b 2e 6c 76 73 2c 20 4e 75 6c 6c 3b |rg2+k.lvs, Null;| 000041f0 0a 09 20 20 20 20 68 34 21 61 72 67 32 20 3a 3d |.. h4!arg2 :=| 00004200 20 68 34 21 61 72 67 32 2a 34 20 7d 3b 0a 09 20 | h4!arg2*4 };.. | 00004210 62 20 3a 3d 20 4c 6f 6f 6b 46 6f 72 28 61 72 67 |b := LookFor(arg| 00004220 32 2c 20 53 68 69 66 74 65 64 55 70 29 3b 0a 09 |2, ShiftedUp);..| 00004230 20 54 45 53 54 20 62 3e 3d 30 20 26 20 68 34 21 | TEST b>=0 & h4!| 00004240 61 72 67 32 3d 30 20 54 48 45 4e 0a 09 20 20 20 |arg2=0 THEN.. | 00004250 20 73 68 20 3a 3d 20 4e 75 6c 6c 0a 09 20 45 4c | sh := Null.. EL| 00004260 53 45 0a 09 20 20 20 20 62 20 3a 3d 20 4d 6f 76 |SE.. b := Mov| 00004270 65 54 6f 41 6e 79 43 52 28 61 72 67 32 29 20 7d |eToAnyCR(arg2) }| 00004280 0a 20 20 20 20 20 20 45 4c 53 45 0a 09 20 62 20 |. ELSE.. b | 00004290 3a 3d 20 4d 6f 76 65 54 6f 41 6e 79 43 52 28 61 |:= MoveToAnyCR(a| 000042a0 72 67 32 29 20 7d 3b 0a 0a 20 20 20 46 6c 75 73 |rg2) };.. Flus| 000042b0 68 50 65 6e 64 69 6e 67 4c 6f 61 64 73 28 29 3b |hPendingLoads();| 000042c0 0a 20 20 20 46 6c 75 73 68 50 65 6e 64 69 6e 67 |. FlushPending| 000042d0 53 74 6f 72 65 73 28 29 3b 0a 20 20 20 4c 6f 63 |Stores();. Loc| 000042e0 6b 28 62 2c 20 6b 2e 72 65 67 29 3b 0a 20 20 20 |k(b, k.reg);. | 000042f0 54 45 53 54 20 6f 70 3d 73 2e 70 75 74 62 79 74 |TEST op=s.putbyt| 00004300 65 20 54 48 45 4e 20 7b 0a 20 20 20 20 20 20 72 |e THEN {. r| 00004310 20 3a 3d 20 4c 6f 61 64 41 72 67 33 54 6f 53 6f | := LoadArg3ToSo| 00004320 6d 65 43 52 28 29 3b 0a 20 20 20 20 20 20 54 45 |meCR();. TE| 00004330 53 54 20 78 3d 4e 75 6c 6c 20 54 48 45 4e 0a 09 |ST x=Null THEN..| 00004340 20 47 65 6e 46 32 28 66 2e 73 74 72 62 2c 20 72 | GenF2(f.strb, r| 00004350 2c 20 62 2c 20 6d 2c 20 61 29 0a 20 20 20 20 20 |, b, m, a). | 00004360 20 45 4c 53 45 0a 09 20 46 32 49 6e 73 74 28 66 | ELSE.. F2Inst(f| 00004370 2e 73 74 72 62 2c 20 72 2c 20 78 2c 20 30 2c 20 |.strb, r, x, 0, | 00004380 62 2c 20 66 2e 70 72 65 75 70 2c 20 73 68 2c 20 |b, f.preup, sh, | 00004390 32 2c 20 6d 2e 61 6c 77 61 79 73 29 3b 0a 20 20 |2, m.always);. | 000043a0 20 20 20 20 54 45 53 54 20 4c 6f 63 61 6c 73 53 | TEST LocalsS| 000043b0 61 66 65 20 54 48 45 4e 0a 09 20 44 69 73 63 61 |afe THEN.. Disca| 000043c0 72 64 4e 6f 6e 4c 6f 63 61 6c 52 65 67 73 28 29 |rdNonLocalRegs()| 000043d0 0a 20 20 20 20 20 20 45 4c 53 45 0a 09 20 44 69 |. ELSE.. Di| 000043e0 73 63 61 72 64 4e 6f 6e 43 6f 6e 73 74 52 65 67 |scardNonConstReg| 000043f0 73 28 29 3b 0a 20 20 20 20 20 20 53 74 61 63 6b |s();. Stack| 00004400 28 73 73 70 2d 33 29 20 7d 0a 0a 20 20 20 45 4c |(ssp-3) }.. EL| 00004410 53 45 20 7b 0a 20 20 20 20 20 20 72 20 3a 3d 20 |SE {. r := | 00004420 4e 65 78 74 52 28 29 3b 0a 20 20 20 20 20 20 54 |NextR();. T| 00004430 45 53 54 20 78 3d 4e 75 6c 6c 20 54 48 45 4e 0a |EST x=Null THEN.| 00004440 09 20 47 65 6e 46 32 28 66 2e 6c 64 72 62 2c 20 |. GenF2(f.ldrb, | 00004450 72 2c 20 62 2c 20 6d 2c 20 61 29 0a 20 20 20 20 |r, b, m, a). | 00004460 20 20 45 4c 53 45 0a 09 20 46 32 49 6e 73 74 28 | ELSE.. F2Inst(| 00004470 66 2e 6c 64 72 62 2c 20 72 2c 20 78 2c 20 30 2c |f.ldrb, r, x, 0,| 00004480 20 62 2c 20 66 2e 70 72 65 75 70 2c 20 73 68 2c | b, f.preup, sh,| 00004490 20 32 2c 20 6d 2e 61 6c 77 61 79 73 29 3b 0a 20 | 2, m.always);. | 000044a0 20 20 20 20 20 44 69 73 63 61 72 64 52 65 67 28 | DiscardReg(| 000044b0 72 2c 20 6b 2e 72 65 67 29 3b 0a 20 20 20 20 20 |r, k.reg);. | 000044c0 20 4c 6f 73 65 28 72 2c 20 6b 2e 72 65 67 29 3b | Lose(r, k.reg);| 000044d0 0a 20 20 20 20 20 20 55 6e 4c 6f 63 6b 28 62 2c |. UnLock(b,| 000044e0 20 6b 2e 72 65 67 29 3b 0a 20 20 20 20 20 20 49 | k.reg);. I| 000044f0 46 20 78 7e 3d 4e 75 6c 6c 20 54 48 45 4e 20 55 |F x~=Null THEN U| 00004500 6e 4c 6f 63 6b 28 78 2c 20 6b 2e 72 65 67 29 20 |nLock(x, k.reg) | 00004510 7d 20 7d 0a |} }.| 00004514