: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];