Minix2.0/src/lib/float/nrm_ext.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: nrm_ext.c,v 1.5 93/01/05 12:06:11 ceriel Exp $ */

/********************************************************/
/*
	NORMALIZE an EXTENDED FORMAT NUMBER
*/
/********************************************************/

#include "FP_shift.h"
#include "FP_types.h"

void
nrm_ext(e1)
EXTEND	*e1;
{
		/* 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 ((e1->m1 | e1->m2) == 0L)
		return;

		/* if top word is zero mov low word	*/
		/* to top word, adjust exponent value	*/
	if (e1->m1 == 0L)	{
		e1->m1 = e1->m2;
		e1->m2 = 0L;
		e1->exp -= 32;
	}
	if ((e1->m1 & NORMBIT) == 0) {
		unsigned long l = ((unsigned long)NORMBIT >> 1);
		int cnt = -1;

		while (! (l & e1->m1)) {
			l >>= 1;
			cnt--;
		}
		e1->exp += cnt;
		b64_sft(&(e1->mantissa), cnt);
	}
}