79 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 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
 | |
| }
 |