80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
/*
|
|
(c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*/
|
|
|
|
/* $Header$ */
|
|
|
|
/********************************************************/
|
|
/*
|
|
NORMALIZE an EXTENDED FORMAT NUMBER
|
|
*/
|
|
/********************************************************/
|
|
|
|
#include "FP_shift.h"
|
|
#include "FP_types.h"
|
|
|
|
nrm_ext(e1)
|
|
EXTEND *e1;
|
|
{
|
|
register unsigned long *mant_1;
|
|
register unsigned long *mant_2;
|
|
|
|
/* local CAST conversion */
|
|
#ifdef PRT_EXT
|
|
prt_ext("before NRM_EXT() e1:",e1);
|
|
#endif PRT_EXT
|
|
mant_1 = (unsigned long *) &e1->m1;
|
|
/*
|
|
THIS RESULTS IN A BAD CODE !!!!
|
|
ANOTHER BUG IN EM CODE MAYBE????
|
|
mant_2 = (unsigned long *) &e1->m2;
|
|
*/
|
|
/* statement that works */
|
|
mant_2 = mant_1 + 1;
|
|
|
|
/* we assume that the mantissa != 0 */
|
|
/* if it is then just return */
|
|
/* to let it be a problem elsewhere */
|
|
/* THAT IS, The exponent is not set to */
|
|
/* zero. If we don't test here an */
|
|
/* infinite loop is generated when */
|
|
/* mantissa is zero */
|
|
|
|
if ((*mant_1 | *mant_2) == 0L)
|
|
return;
|
|
|
|
/* if top word is zero mov low word */
|
|
/* to top word, adjust exponent value */
|
|
if (*mant_1 == 0L) {
|
|
*mant_1++ = e1->m2;
|
|
*mant_1-- = 0L;
|
|
e1->exp -= 32;
|
|
}
|
|
#ifdef OLD
|
|
/* check that e1->m1 is not too large */
|
|
if (*mant_1 & CARRYBIT) { /* carry occured */
|
|
e1->exp++; /* increase exponent */
|
|
*mant_2 >>= 1; /* right shift mantissa */
|
|
if ((short) *mant_1 & 01)
|
|
*mant_2 |= CARRYBIT;
|
|
*mant_1 >>= 1;
|
|
}
|
|
#endif
|
|
|
|
|
|
while ((*mant_1 & NORMBIT) == 0) {
|
|
e1->exp--;
|
|
*mant_1 <<= 1;
|
|
if ((*mant_2 & CARRYBIT) == 0)
|
|
; /* empty statement */
|
|
else {
|
|
*mant_1 += 1;
|
|
}
|
|
*mant_2 <<= 1;
|
|
}
|
|
#ifdef PRT_EXT
|
|
prt_ext("after NRM_EXT() e1:",e1);
|
|
#endif PRT_EXT
|
|
}
|