/*	Copyright (c) 1990 UNIX System Laboratories, Inc.	*/
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T	*/
/*	  All Rights Reserved  	*/

/*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF     	*/
/*	UNIX System Laboratories, Inc.                     	*/
/*	The copyright notice above does not evidence any   	*/
/*	actual or intended publication of such source code.	*/


#ident	"@(#)ucbhead:sunfp.h	1.1.3.1"

/*******************************************************************

		PROPRIETARY NOTICE (Combined)

This source code is unpublished proprietary information
constituting, or derived under license from AT&T's UNIX(r) System V.
In addition, portions of such source code were derived from Berkeley
4.3 BSD under license from the Regents of the University of
California.



		Copyright Notice 

Notice of copyright on this source code product does not indicate 
publication.

	(c) 1986,1987,1988,1989  Sun Microsystems, Inc
	(c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
	          All rights reserved.
********************************************************************/ 

#include <fp.h>

	/*	Sun floating-point PRIVATE include file.  */

	/*	PRIVATE MACROS	*/

#ifdef DEBUG
#define PRIVATE
#else
#define PRIVATE static
#endif

#define	DOUBLE_E(n) (n & 0xfffe ) 	/* More significant word of double. */
#define DOUBLE_F(n) (1+DOUBLE_E(n)) 	/* Less significant word of double. */

	/*	PRIVATE CONSTANTS	*/

#define INTEGER_BIAS	   31
#define	SINGLE_BIAS	  127
#define DOUBLE_BIAS	 1023
#define EXTENDED_BIAS	16383

#define DECIMAL_BINARY_INTEGER_SIZE 3088	/* Size of decimal to binary integer 
						conversion buffer. */

#define SINGLE_MAXE	  97		/* Maximum decimal exponent we need to consider. */
#define DOUBLE_MAXE	 771		/* Maximum decimal exponent we need to consider. */
#define EXTENDED_MAXE  12330		/* Maximum decimal exponent we need to consider. */

	/* PRIVATE TYPES 	*/

typedef struct		/* Type for passing partial results of decimal to binary conversion. */
	{		/* Floating point of base B==2**16 with at least 80 significant bits. */
			/* Interpreted as B**exponent * 0.s0s1s2s3s4s5 */
 	int	exponent ;		/* Signed exponent. */
	unsigned significand[6] ;	/* Significand normalized so significand[0] >= 1 ; 
						significand[n] < 2**16. */
					/* Least significant bit can be sticky. */
	}
	big_float ;

typedef unsigned decimal_binary_integer_buffer[DECIMAL_BINARY_INTEGER_SIZE] ;

#ifdef i386
typedef struct					/* Most significant word formats. */
	{
	unsigned significand:	23 ;
	unsigned exponent:	8 ;
	unsigned sign:		1 ;
	}
	single_msw ;

typedef struct
	{
	unsigned significand:	20 ;
	unsigned exponent:	11 ;
	unsigned sign:		1 ;
	}
	double_msw ;

typedef struct
	{
	unsigned unused:	16 ;
	unsigned exponent:	15 ;
	unsigned sign:		1 ;
	}
	extended_msw ;

typedef struct					/* Floating-point formats in detail. */
	{
	single_msw msw ;
	}
	single_formatted ;

typedef struct
	{
	unsigned significand2 ;
	double_msw msw ;
	}
	double_formatted ;

typedef struct
	{
	unsigned significand2 ;
	unsigned significand ;
	extended_msw msw ;
	}
	extended_formatted ;
#else
typedef struct					/* Most significant word formats. */
	{
	unsigned sign:		1 ;
	unsigned exponent:	8 ;
	unsigned significand:	23 ;
	}
	single_msw ;

typedef struct
	{
	unsigned sign:		1 ;
	unsigned exponent:	11 ;
	unsigned significand:	20 ;
	}
	double_msw ;

typedef struct
	{
	unsigned sign:		1 ;
	unsigned exponent:	15 ;
	unsigned unused:	16 ;
	}
	extended_msw ;

typedef struct					/* Floating-point formats in detail. */
	{
	single_msw msw ;
	}
	single_formatted ;

typedef struct
	{
	double_msw msw ;
	unsigned significand2 ;
	}
	double_formatted ;

typedef struct
	{
	extended_msw msw ;
	unsigned significand ;
	unsigned significand2 ;
	}
	extended_formatted ;
#endif

typedef union					/* Floating-point formats equivalenced. */
	{
	single_formatted 	f ;
	single		 	x ;
	}
	single_equivalence ;

typedef union
	{
	double_formatted 	f ;
	double		 	x ;
	}
	double_equivalence ;

typedef union
	{
	extended_formatted  	f ;
	extended	 	x ;
	}
	extended_equivalence ;

typedef struct					/* Unpack floating-point internal format. */
        {
        int 		sign ;
        enum fp_class_type fpclass ;
        int     	exponent ;              /* Unbiased exponent. */
        unsigned 	significand[3] ;	/* Third word is round and sticky. */
        }
        unpacked ;
 
	/* PRIVATE GLOBAL VARIABLES */

fp_exception_field_type _fp_current_exceptions ; /* Current floating-point exceptions. */

enum fp_direction_type
		_fp_current_direction ;	/* Current rounding direction. */

enum fp_precision_type
		_fp_current_precision ; /* Current rounding precision. */

	/* PRIVATE FUNCTIONS */

extern void _fp_normalize (/* pu */) ;
/*        unpacked        *pu ;           /* unpacked operand and result */

extern void _fp_rightshift (/* pu, n */) ;
/*	unpacked *pu ; unsigned n ;	*/
/*      Right shift significand sticky by n bits.  */

extern void _fp_set_exception(/* ex */) ;
/*	enum fp_exception_type ex ;	/* exception to be set in curexcep */ 

extern void _unpack_integer () ; /* pu, px )     *pu gets *px unpacked
unpacked	*pu ;
integer		*px ;
*/

extern void _unpack_single () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern void _unpack_double () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern void _unpack_extended () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern void _pack_integer () ; /* pu, px )		*px gets packed *pu
unpacked	*pu ;
integer		*px ;
*/

extern void _pack_single () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern void _pack_double () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern void _pack_extended () ; /* pu, px )
unpacked	*pu ;
integer		*px ;
*/

extern enum fp_class_type class_single () ;
extern enum fp_class_type class_double () ;
extern enum fp_class_type class_extended () ;

