{
file name: FloatSubs.mc

created: T.Tokunaga 28-Mar-85 19:52:40   
Last Edited:
}

{ *******************************denormalization code*********************
enter with floatTemp,~Q, holding the 32 bit quantity, L0 prepared for return, temp1Low holding shift count

	note: 	Q is negatived
		temp1Low is destroyed
denomalized result in floatTemp,Q , and A[15] is sticky bit 
**************************************************************************}

	
deNormC2: 
	temp1Low ← - temp1Low - 1,	c2;
	
deNormA:
	temp1Low ← temp1Low + 1, NZeroBr,		c3;
	
	Ybus ← Q and 1, ZeroBr, BRANCH[deNormA1, $],	c1;
	floatTemp ← DRShift1 floatTemp, SE ← 0, BRANCH[deNormA, deNormB],	c2;
	
deNormA1:	{ sticky bit = 0 }
	Q ← ~ Q, L3Disp, CANCELBR[$],	c2;
	RET[deNormRets],		c3;
	
deNormB:	{ sticky bit will be 1}
	temp1Low ← temp1Low + 1,  NZeroBr,	c3;
	BRANCH[deNormB1, $],	c1;
	floatTemp ← DRShift1 floatTemp, SE ← 0, GOTO[deNormB],	c2;
	
deNormB1:
	Q ← ~Q, L3Disp,		c2;
	Q ← Q or 1,	RET[deNormRets],			c3;

	
	
{****************** divide loop *************************************** 
	dividend in	<floatT,Q>
	divisor	 in	<divosrHigh,divisorLow>

	bit count  in divCount, performs bitCount subtractions

	return link = L3

	will accumulate bots in divResult, <floatT, Q> will hold th remainder

************************************************************************}	
fptDivideLoopC2: 
	Noop,					c2;
fptDivideLoopC3:
	divResult ← 0,   GOTO[fptDivSubA],		c3;
	
{in this part of the loop, the contents of <floatT,Q>  are positive }

fptDivSub:
	Noop,						c2;
	divResult ← LShift1 (divResult), SE ← 1, 	c3;
	
fptDivSubA:
	Q ← Q - divisorLow,  CarryBr,						c1; { subtraction of LawHalf  of fractional part }
	divCount ← divCount - 1, ZeroBr, BRANCH[fptDivSub1, fptDivSub0],	c2;

fptDivSub0:
	floatT ← floatT - divisorHigh, CarryBr, BRANCH[$, fptDivSubExit1],		c3; {subtraction of highhalf,no borrow from Lowhalf}
	floatT ← DLShift1 floatT, SE ← 1, { Q.15 ← 0} BRANCH[fptDivAdd, fptDivSub],	c1; 
	
fptDivSub1:
	floatT ← floatT - divisorHigh - 1, CarryBr, BRANCH[$, fptDivSubExit2],		c3; {subtraction of highhalf, borrow from lowhalf}
	floatT ← DLShift1 floatT, SE ← 1, {Q.15 ← 0} BRANCH[fptDivAdd, fptDivSub],	c1;
	
fptDivSubExit1:
	BRANCH[fptDivAddExit, fptDivSubExit],			c1;
fptDivSubExit2:
	BRANCH[fptDivAddExit, fptDivSubExit],			c1;
	
fptDivSubExit:
	divResult ← LShift1 (divResult), SE ← 1, GOTO[fptDivLoopExit],	c2;
	
{In this part of the loop, the contents of <floatT, Q> are negative ( 2's complement)}

fptDivAdd:
	Noop,						c2;
	divResult ← LShift1 (divResult), SE ← 0,	c3;
	
	Q ← Q + divisorLow, CarryBr,					c1;
	divCount ← divCount - 1, ZeroBr,BRANCH[fptDivAdd0, fptDivAdd1],	c2;
	
fptDivAdd0:
	floatT ← floatT + divisorHigh, CarryBr, BRANCH[$, fptDivAddExit1],		c3;
	floatT ← DLShift1 floatT, SE ← 1,{Q.15 ← 0}, BRANCH[fptDivAdd, fptDivSub],	c1;
	
fptDivAdd1:
	floatT ← floatT + divisorHigh + 1, CarryBr, BRANCH[$, fptDivAddExit2],		c3;
	floatT ← DLShift1 (floatT), SE ← 1, {Q.15 ← 0} BRANCH[fptDivAdd, fptDivSub],	c1;
	
fptDivAddExit1:
	BRANCH[fptDivAddExit, fptDivSubExit],			c1;
fptDivAddExit2:
	BRANCH[fptDivAddExit, fptDivSubExit],			c1;
	
{We have subtracted one too many times, so add back in to ger correct remainder }

fptDivAddExit:
	divResult ← LShift1 (divResult), SE ← 0,		c2;
	Q ← Q + divisorLow, CarryBr,				c3;
	
	BRANCH[fptDivAX0, fptDivAX1],				c1;
	
fptDivAX1:
	floatT ← floatT + divisorHigh + 1, GOTO[fptDivLoopExit],	c2;
fptDivAX0:
	floatT ← floatT + divisorHigh, GOTO[fptDivLoopExit],		c2;
	
fptDivLoopExit:
	L3Disp,					c3;
	RET[fptDivLoopRets],		c1;