home *** CD-ROM | disk | FTP | other *** search
- /* 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 "@(#)//usr/ucbinclude/sunfp.h.sl 1.1 4.0 12/08/90 40247 AT&T-USL"
-
- /*******************************************************************
-
- 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 () ;
-
-