:TITLE[Jump.mc...June 21, 1982 9:36 PM, van Melle]; * A few more instructions can be removed by putting the jump distance * directly into lspLN and doing the pfetch sooner. * NILPOP can be expanded. * The only use of the stack is in NILPOP. Jumps: T ← 1c, goto[lspDojump], opcode[200]; T ← 2c, goto[lspDojump], opcode[201]; T ← 3c, goto[lspDojump], opcode[202]; T ← 4c, goto[lspDojump], opcode[203]; T ← 5c, goto[lspDojump], opcode[204]; T ← 6c, goto[lspDojump], opcode[205]; T ← 7c, goto[lspDojump], opcode[206]; T ← 10c, goto[lspDojump], opcode[207]; T ← 11c, goto[lspDojump], opcode[210]; T ← 12c, goto[lspDojump], opcode[211]; T ← 13c, goto[lspDojump], opcode[212]; T ← 14c, goto[lspDojump], opcode[213]; T ← 15c, goto[lspDojump], opcode[214]; T ← 16c, goto[lspDojump], opcode[215]; T ← 17c, goto[lspDojump], opcode[216]; T ← 20c, goto[lspDojump], opcode[217]; Fjumps: T ← 1c, goto[lspFjump], opcode[220]; T ← 2c, goto[lspFjump], opcode[221]; T ← 3c, goto[lspFjump], opcode[222]; T ← 4c, goto[lspFjump], opcode[223]; T ← 5c, goto[lspFjump], opcode[224]; T ← 6c, goto[lspFjump], opcode[225]; T ← 7c, goto[lspFjump], opcode[226]; T ← 10c, goto[lspFjump], opcode[227]; T ← 11c, goto[lspFjump], opcode[230]; T ← 12c, goto[lspFjump], opcode[231]; T ← 13c, goto[lspFjump], opcode[232]; T ← 14c, goto[lspFjump], opcode[233]; T ← 15c, goto[lspFjump], opcode[234]; T ← 16c, goto[lspFjump], opcode[235]; T ← 17c, goto[lspFjump], opcode[236]; T ← 20c, goto[lspFjump], opcode[237]; Tjumps: T ← 1c, goto[lspTJump], opcode[240]; T ← 2c, goto[lspTJump], opcode[241]; T ← 3c, goto[lspTJump], opcode[242]; T ← 4c, goto[lspTJump], opcode[243]; T ← 5c, goto[lspTJump], opcode[244]; T ← 6c, goto[lspTJump], opcode[245]; T ← 7c, goto[lspTJump], opcode[246]; T ← 10c, goto[lspTJump], opcode[247]; T ← 11c, goto[lspTJump], opcode[250]; T ← 12c, goto[lspTJump], opcode[251]; T ← 13c, goto[lspTJump], opcode[252]; T ← 14c, goto[lspTJump], opcode[253]; T ← 15c, goto[lspTJump], opcode[254]; T ← 16c, goto[lspTJump], opcode[255]; T ← 17c, goto[lspTJump], opcode[256]; T ← 20c, goto[lspTJump], opcode[257]; @FJumpx: * nop, opcode[262]; T ← NextData[IBuf], opcode[262]; T ← (Form-2[AllOnes]) + T, skip[noH2bit8]; * T←T-2 T ← (lhmask[AllOnes]) + T; * Signextend T lspFJump: lspLN ← T, call[lspNilpop]; T ← lspLN, skip[alu=0]; * Skip if TOS = NIL goto[PopChk6]; goto[lspDojumpPop]; @TJumpx: * nop, opcode[263]; T ← NextData[IBuf], opcode[263]; T ← (Form-2[AllOnes]) + T, skip[noH2bit8]; T ← (lhmask[AllOnes]) + T; lspTJump: lspLN ← T, call[lspNilpop]; T ← lspLN, skip[alu#0]; * Skip if TOS # NIL goto[PopChk6]; goto[lspDojumpPop]; @Jumpx: * nop, opcode[260]; * Unconditional jump T ← NextData[IBuf], opcode[260]; T ← (Form-2[AllOnes]) + T, skip[noH2bit8]; T ← (lhmask[AllOnes]) + T, goto[lspDojump]; goto[lspDojump]; @NFJumpx: * nop, opcode[264]; * Jump if TOS = NIL, pop if no branch T ← NextData[IBuf], opcode[264]; * Jump if TOS = NIL, pop if no branch T ← (Form-2[AllOnes]) + T, skip[noH2bit8]; T ← (lhmask[AllOnes]) + T; call[lspNilpop], lspLN ← T; skip[alu=0], T ← lspLN; goto[PopChk6]; Stack&+2, goto[lspDojump]; @NTJumpx: * nop, opcode[265]; * Jump if TOS # NIL, pop if no branch T ← NextData[IBuf], opcode[265]; * Jump if TOS # NIL, pop if no branch T ← (Form-2[AllOnes]) + T, skip[noH2bit8]; T ← (lhmask[AllOnes]) + T; call[lspNilpop], lspLN ← T; skip[alu#0], T ← lspLN; goto[PopChk6]; Stack&+2, goto[lspDojump]; @Jumpxx: * nop, opcode[261]; * Jump offset in alpha,beta T ← NextData[IBuf], opcode[261]; * Jump offset in alpha,beta lspLN ← T; T ← 3c; T ← (NextData[IBuf]) - T; T ← (lsh[lspLN, 10]) + T, goto[lspDojump]; lspNilpop: T ← Stack&-1, useCtask; * No task, because alu result tested T ← (Stack&-1) or T, return; lspDojump: T ← (PCFReg) + T; lspLN ← T, goto[AddIlx1, alu>=0]; T ← 100000c; T ← (rsh[lspLN, 1]) or T, goto[AddIlx2]; AddIlx1: T ← rsh[lspLN, 1]; AddIlx2: PFetch4[PCB, IBuf]; * See comment in FETCH.0mc PCB ← T; PCF ← lspLN; PCB ← (PCB) and not (3c), goto[lspNextInstP6]; * Fault will happen right after this inst lspDojumpPop: T ← (PCFReg) + T; lspLN ← T, goto[AddIlx3, alu>=0]; T ← 100000c; T ← (rsh[lspLN, 1]) or T, goto[AddIlx4]; AddIlx3: T ← rsh[lspLN, 1]; AddIlx4: PFetch4[PCB, IBuf]; * See comment in FETCH.0mc PCB ← T; PCF ← lspLN; PCB ← (PCB) and not (3c), goto[PopChk6]; * Fault will happen right after this inst :END[Jump];