ack/mach/proto/fp/nrm_ext.c

80 lines
1.7 KiB
C
Raw Normal View History

1988-04-07 11:40:46 +00:00
/*
(c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
See the copyright notice in the ACK home directory, in the file "Copyright".
*/
/* $Header$ */
1988-04-07 10:57:49 +00:00
/********************************************************/
/*
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
}