Home | History | Annotate | Line # | Download | only in spmath
      1  1.4       mrg /*	$NetBSD: cnv_float.h,v 1.4 2019/02/06 05:04:41 mrg Exp $	*/
      2  1.1  fredette 
      3  1.1  fredette /*	$OpenBSD: cnv_float.h,v 1.5 2001/03/29 03:58:17 mickey Exp $	*/
      4  1.1  fredette 
      5  1.1  fredette /*
      6  1.1  fredette  * Copyright 1996 1995 by Open Software Foundation, Inc.
      7  1.1  fredette  *              All Rights Reserved
      8  1.1  fredette  *
      9  1.1  fredette  * Permission to use, copy, modify, and distribute this software and
     10  1.1  fredette  * its documentation for any purpose and without fee is hereby granted,
     11  1.1  fredette  * provided that the above copyright notice appears in all copies and
     12  1.1  fredette  * that both the copyright notice and this permission notice appear in
     13  1.1  fredette  * supporting documentation.
     14  1.1  fredette  *
     15  1.1  fredette  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
     16  1.1  fredette  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     17  1.1  fredette  * FOR A PARTICULAR PURPOSE.
     18  1.1  fredette  *
     19  1.1  fredette  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
     20  1.1  fredette  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
     21  1.1  fredette  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
     22  1.1  fredette  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     23  1.1  fredette  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     24  1.1  fredette  */
     25  1.1  fredette /*
     26  1.1  fredette  * pmk1.1
     27  1.1  fredette  */
     28  1.1  fredette /*
     29  1.1  fredette  * (c) Copyright 1986 HEWLETT-PACKARD COMPANY
     30  1.1  fredette  *
     31  1.1  fredette  * To anyone who acknowledges that this file is provided "AS IS"
     32  1.1  fredette  * without any express or implied warranty:
     33  1.1  fredette  *     permission to use, copy, modify, and distribute this file
     34  1.1  fredette  * for any purpose is hereby granted without fee, provided that
     35  1.1  fredette  * the above copyright notice and this notice appears in all
     36  1.1  fredette  * copies, and that the name of Hewlett-Packard Company not be
     37  1.1  fredette  * used in advertising or publicity pertaining to distribution
     38  1.1  fredette  * of the software without specific, written prior permission.
     39  1.1  fredette  * Hewlett-Packard Company makes no representations about the
     40  1.1  fredette  * suitability of this software for any purpose.
     41  1.1  fredette  */
     42  1.1  fredette 
     43  1.1  fredette /*
     44  1.1  fredette  * Some more constants
     45  1.1  fredette  */
     46  1.1  fredette #define SGL_FX_MAX_EXP 30
     47  1.1  fredette #define DBL_FX_MAX_EXP 62
     48  1.1  fredette #define QUAD_FX_MAX_EXP 126
     49  1.1  fredette 
     50  1.1  fredette 
     51  1.1  fredette #define Dintp1(object) (object)
     52  1.1  fredette #define Dintp2(object) (object)
     53  1.1  fredette 
     54  1.1  fredette #define Qintp0(object) (object)
     55  1.1  fredette #define Qintp1(object) (object)
     56  1.1  fredette #define Qintp2(object) (object)
     57  1.1  fredette #define Qintp3(object) (object)
     58  1.1  fredette 
     59  1.1  fredette 
     60  1.1  fredette /*
     61  1.1  fredette  * These macros will be used specifically by the convert instructions.
     62  1.1  fredette  *
     63  1.1  fredette  *
     64  1.1  fredette  * Single format macros
     65  1.1  fredette  */
     66  1.1  fredette 
     67  1.1  fredette #define Sgl_to_dbl_exponent(src_exponent,dest)			\
     68  1.1  fredette     Deposit_dexponent(dest,src_exponent+(DBL_BIAS-SGL_BIAS))
     69  1.1  fredette 
     70  1.1  fredette #define Sgl_to_dbl_mantissa(src_mantissa,destA,destB)	\
     71  1.1  fredette     Deposit_dmantissap1(destA,src_mantissa>>3);		\
     72  1.1  fredette     Dmantissap2(destB) = src_mantissa << 29
     73  1.1  fredette 
     74  1.1  fredette #define Sgl_isinexact_to_fix(sgl_value,exponent)	\
     75  1.1  fredette     ((exponent < (SGL_P - 1)) ?				\
     76  1.2   thorpej      (Sall(sgl_value) << (SGL_EXP_LENGTH + 1 + exponent)) : false)
     77  1.1  fredette 
     78  1.4       mrg #define Int_isinexact_to_sgl(int_value)	((int_value << (33 - SGL_EXP_LENGTH)) != 0)
     79  1.1  fredette 
     80  1.1  fredette #define Sgl_roundnearest_from_int(int_value,sgl_value)			\
     81  1.1  fredette     if (int_value & 1<<(SGL_EXP_LENGTH - 2))   /* round bit */		\
     82  1.4       mrg 	if (((int_value << (34 - SGL_EXP_LENGTH)) != 0) || Slow(sgl_value))	\
     83  1.1  fredette 		Sall(sgl_value)++
     84  1.1  fredette 
     85  1.1  fredette #define Dint_isinexact_to_sgl(dint_valueA,dint_valueB)		\
     86  1.4       mrg     (((Dintp1(dint_valueA) << (33 - SGL_EXP_LENGTH)) != 0) || Dintp2(dint_valueB))
     87  1.1  fredette 
     88  1.1  fredette #define Sgl_roundnearest_from_dint(dint_valueA,dint_valueB,sgl_value)	\
     89  1.1  fredette     if (Dintp1(dint_valueA) & 1<<(SGL_EXP_LENGTH - 2))			\
     90  1.4       mrg 	if (((Dintp1(dint_valueA) << (34 - SGL_EXP_LENGTH)) != 0) ||	\
     91  1.1  fredette 	Dintp2(dint_valueB) || Slow(sgl_value)) Sall(sgl_value)++
     92  1.1  fredette 
     93  1.1  fredette #define Dint_isinexact_to_dbl(dint_value)	\
     94  1.1  fredette     (Dintp2(dint_value) << (33 - DBL_EXP_LENGTH))
     95  1.1  fredette 
     96  1.1  fredette #define Dbl_roundnearest_from_dint(dint_opndB,dbl_opndA,dbl_opndB)	\
     97  1.1  fredette     if (Dintp2(dint_opndB) & 1<<(DBL_EXP_LENGTH - 2))			\
     98  1.1  fredette        if ((Dintp2(dint_opndB) << (34 -DBL_EXP_LENGTH)) || Dlowp2(dbl_opndB))  \
     99  1.1  fredette 	  if ((++Dallp2(dbl_opndB))==0) Dallp1(dbl_opndA)++
    100  1.1  fredette 
    101  1.1  fredette #define Sgl_isone_roundbit(sgl_value,exponent)			\
    102  1.1  fredette     ((Sall(sgl_value) << (SGL_EXP_LENGTH + 1 + exponent)) >> 31)
    103  1.1  fredette 
    104  1.1  fredette #define Sgl_isone_stickybit(sgl_value,exponent)		\
    105  1.1  fredette     (exponent < (SGL_P - 2) ?				\
    106  1.2   thorpej      Sall(sgl_value) << (SGL_EXP_LENGTH + 2 + exponent) : false)
    107  1.1  fredette 
    108  1.1  fredette 
    109  1.1  fredette /*
    110  1.1  fredette  * Double format macros
    111  1.1  fredette  */
    112  1.1  fredette 
    113  1.1  fredette #define Dbl_to_sgl_exponent(src_exponent,dest)			\
    114  1.1  fredette     dest = src_exponent + (SGL_BIAS - DBL_BIAS)
    115  1.1  fredette 
    116  1.1  fredette #define Dbl_to_sgl_mantissa(srcA,srcB,dest,inexact,guard,sticky,odd)	\
    117  1.1  fredette     Shiftdouble(Dmantissap1(srcA),Dmantissap2(srcB),29,dest);	\
    118  1.1  fredette     guard = Dbit3p2(srcB);					\
    119  1.1  fredette     sticky = Dallp2(srcB)<<4;					\
    120  1.1  fredette     inexact = guard | sticky;					\
    121  1.1  fredette     odd = Dbit2p2(srcB)
    122  1.1  fredette 
    123  1.1  fredette #define Dbl_to_sgl_denormalized(srcA,srcB,exp,dest,inexact,guard,sticky,odd,tiny) \
    124  1.1  fredette     Deposit_dexponent(srcA,1);						\
    125  1.2   thorpej     tiny = true;							\
    126  1.1  fredette     if (exp >= -2) {							\
    127  1.1  fredette 	if (exp == 0) {							\
    128  1.1  fredette 	    inexact = Dallp2(srcB) << 3;				\
    129  1.1  fredette 	    guard = inexact >> 31;					\
    130  1.1  fredette 	    sticky = inexact << 1;					\
    131  1.1  fredette 	    Shiftdouble(Dmantissap1(srcA),Dmantissap2(srcB),29,dest);	\
    132  1.1  fredette 	    odd = dest << 31;						\
    133  1.1  fredette 	    if (inexact) {						\
    134  1.1  fredette 		switch(Rounding_mode()) {				\
    135  1.1  fredette 		    case ROUNDPLUS:					\
    136  1.1  fredette 			if (Dbl_iszero_sign(srcA)) {			\
    137  1.1  fredette 			    dest++;					\
    138  1.1  fredette 			    if (Sgl_isone_hidden(dest))	\
    139  1.2   thorpej 				tiny = false;				\
    140  1.1  fredette 			    dest--;					\
    141  1.1  fredette 			}						\
    142  1.1  fredette 			break;						\
    143  1.1  fredette 		    case ROUNDMINUS:					\
    144  1.1  fredette 			if (Dbl_isone_sign(srcA)) {			\
    145  1.1  fredette 			    dest++;					\
    146  1.1  fredette 			    if (Sgl_isone_hidden(dest))	\
    147  1.2   thorpej 				tiny = false;				\
    148  1.1  fredette 			    dest--;					\
    149  1.1  fredette 			}						\
    150  1.1  fredette 			break;						\
    151  1.1  fredette 		    case ROUNDNEAREST:					\
    152  1.1  fredette 			if (guard && (sticky || odd)) {			\
    153  1.1  fredette 			    dest++;					\
    154  1.1  fredette 			    if (Sgl_isone_hidden(dest))	\
    155  1.2   thorpej 				tiny = false;				\
    156  1.1  fredette 			    dest--;					\
    157  1.1  fredette 			}						\
    158  1.1  fredette 			break;						\
    159  1.1  fredette 		}							\
    160  1.1  fredette 	    }								\
    161  1.1  fredette 		/* shift right by one to get correct result */		\
    162  1.1  fredette 		guard = odd;						\
    163  1.1  fredette 		sticky = inexact;					\
    164  1.1  fredette 		inexact |= guard;					\
    165  1.1  fredette 		dest >>= 1;						\
    166  1.1  fredette 		Deposit_dsign(srcA,0);					\
    167  1.1  fredette 		Shiftdouble(Dallp1(srcA),Dallp2(srcB),30,dest);		\
    168  1.1  fredette 		odd = dest << 31;					\
    169  1.1  fredette 	}								\
    170  1.1  fredette 	else {								\
    171  1.1  fredette 	    inexact = Dallp2(srcB) << (2 + exp);			\
    172  1.1  fredette 	    guard = inexact >> 31;					\
    173  1.1  fredette 	    sticky = inexact << 1;					\
    174  1.1  fredette 	    Deposit_dsign(srcA,0);					\
    175  1.1  fredette 	    if (exp == -2) dest = Dallp1(srcA);				\
    176  1.1  fredette 	    else Variable_shift_double(Dallp1(srcA),Dallp2(srcB),30-exp,dest); \
    177  1.1  fredette 	    odd = dest << 31;						\
    178  1.1  fredette 	}								\
    179  1.1  fredette     }									\
    180  1.1  fredette     else {								\
    181  1.1  fredette 	Deposit_dsign(srcA,0);						\
    182  1.1  fredette 	if (exp > (1 - SGL_P)) {					\
    183  1.1  fredette 	    dest = Dallp1(srcA) >> (- 2 - exp);				\
    184  1.1  fredette 	    inexact = Dallp1(srcA) << (34 + exp);			\
    185  1.1  fredette 	    guard = inexact >> 31;					\
    186  1.1  fredette 	    sticky = (inexact << 1) | Dallp2(srcB);			\
    187  1.1  fredette 	    inexact |= Dallp2(srcB);					\
    188  1.1  fredette 	    odd = dest << 31;						\
    189  1.1  fredette 	}								\
    190  1.1  fredette 	else {								\
    191  1.1  fredette 	    dest = 0;							\
    192  1.1  fredette 	    inexact = Dallp1(srcA) | Dallp2(srcB);			\
    193  1.1  fredette 	    if (exp == (1 - SGL_P)) {					\
    194  1.1  fredette 		guard = Dhidden(srcA);					\
    195  1.1  fredette 		sticky = Dmantissap1(srcA) | Dallp2(srcB);		\
    196  1.1  fredette 	    }								\
    197  1.1  fredette 	    else {							\
    198  1.1  fredette 		guard = 0;						\
    199  1.1  fredette 		sticky = inexact;					\
    200  1.1  fredette 	    }								\
    201  1.1  fredette 	    odd = 0;							\
    202  1.1  fredette 	}								\
    203  1.1  fredette     }									\
    204  1.1  fredette     exp = 0
    205  1.1  fredette 
    206  1.1  fredette #define Dbl_isinexact_to_fix(dbl_valueA,dbl_valueB,exponent)		\
    207  1.1  fredette     (exponent < (DBL_P-33) ?						\
    208  1.1  fredette      Dallp2(dbl_valueB) || Dallp1(dbl_valueA) << (DBL_EXP_LENGTH+1+exponent) : \
    209  1.1  fredette      (exponent < (DBL_P-1) ? Dallp2(dbl_valueB) << (exponent + (33-DBL_P)) :   \
    210  1.2   thorpej       false))
    211  1.1  fredette 
    212  1.1  fredette #define Dbl_isoverflow_to_int(exponent,dbl_valueA,dbl_valueB)		\
    213  1.1  fredette     ((exponent > SGL_FX_MAX_EXP + 1) || Dsign(dbl_valueA)==0 ||		\
    214  1.1  fredette      Dmantissap1(dbl_valueA)!=0 || (Dallp2(dbl_valueB)>>21)!=0 )
    215  1.1  fredette 
    216  1.1  fredette #define Dbl_isone_roundbit(dbl_valueA,dbl_valueB,exponent)	      \
    217  1.1  fredette     ((exponent < (DBL_P - 33) ?						\
    218  1.1  fredette       Dallp1(dbl_valueA) >> ((30 - DBL_EXP_LENGTH) - exponent) :	\
    219  1.1  fredette       Dallp2(dbl_valueB) >> ((DBL_P - 2) - exponent)) & 1)
    220  1.1  fredette 
    221  1.1  fredette #define Dbl_isone_stickybit(dbl_valueA,dbl_valueB,exponent)		\
    222  1.1  fredette     (exponent < (DBL_P-34) ?						\
    223  1.1  fredette      (Dallp2(dbl_valueB) || Dallp1(dbl_valueA)<<(DBL_EXP_LENGTH+2+exponent)) : \
    224  1.1  fredette      (exponent<(DBL_P-2) ? (Dallp2(dbl_valueB) << (exponent + (34-DBL_P))) : \
    225  1.2   thorpej       false))
    226  1.1  fredette 
    227  1.1  fredette 
    228  1.1  fredette /* Int macros */
    229  1.1  fredette 
    230  1.1  fredette #define Int_from_sgl_mantissa(sgl_value,exponent)	\
    231  1.1  fredette     Sall(sgl_value) =				\
    232  1.1  fredette 	(unsigned)(Sall(sgl_value) << SGL_EXP_LENGTH)>>(31 - exponent)
    233  1.1  fredette 
    234  1.1  fredette #define Int_from_dbl_mantissa(dbl_valueA,dbl_valueB,exponent)	\
    235  1.1  fredette     Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),22,Dallp1(dbl_valueA)); \
    236  1.1  fredette     if (exponent < 31) Dallp1(dbl_valueA) >>= 30 - exponent;	\
    237  1.1  fredette     else Dallp1(dbl_valueA) <<= 1
    238  1.1  fredette 
    239  1.1  fredette #define Int_negate(int_value) int_value = -int_value
    240  1.1  fredette 
    241  1.1  fredette 
    242  1.1  fredette /* Dint macros */
    243  1.1  fredette 
    244  1.1  fredette #define Dint_from_sgl_mantissa(sgl_value,exponent,dresultA,dresultB)	\
    245  1.1  fredette     {Sall(sgl_value) <<= SGL_EXP_LENGTH;  /*  left-justify  */		\
    246  1.1  fredette     if (exponent <= 31) {						\
    247  1.1  fredette 	Dintp1(dresultA) = 0;						\
    248  1.1  fredette 	Dintp2(dresultB) = (unsigned)Sall(sgl_value) >> (31 - exponent); \
    249  1.1  fredette     }									\
    250  1.1  fredette     else {								\
    251  1.1  fredette 	Dintp1(dresultA) = Sall(sgl_value) >> (63 - exponent);		\
    252  1.1  fredette 	Dintp2(dresultB) = Sall(sgl_value) << (exponent - 31);		\
    253  1.1  fredette     }}
    254  1.1  fredette 
    255  1.1  fredette 
    256  1.1  fredette #define Dint_from_dbl_mantissa(dbl_valueA,dbl_valueB,exponent,destA,destB) \
    257  1.1  fredette     {if (exponent < 32) {						\
    258  1.1  fredette 	Dintp1(destA) = 0;						\
    259  1.1  fredette 	if (exponent <= 20)						\
    260  1.1  fredette 	    Dintp2(destB) = Dallp1(dbl_valueA) >> (20-(exponent));	\
    261  1.1  fredette 	else Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
    262  1.1  fredette 	     (52-(exponent)),Dintp2(destB));				\
    263  1.1  fredette     }									\
    264  1.1  fredette     else {								\
    265  1.1  fredette 	if (exponent <= 52) {						\
    266  1.1  fredette 	    Dintp1(destA) = Dallp1(dbl_valueA) >> (52-(exponent));	\
    267  1.1  fredette 	    if (exponent == 52) Dintp2(destB) = Dallp2(dbl_valueB);	\
    268  1.1  fredette 	    else Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
    269  1.1  fredette 	    52-exponent,Dintp2(destB));					\
    270  1.1  fredette 	}								\
    271  1.1  fredette 	else {								\
    272  1.1  fredette 	    Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
    273  1.1  fredette 	    84-exponent,Dintp1(destA));					\
    274  1.1  fredette 	    Dintp2(destB) = Dallp2(dbl_valueB) << ((exponent)-52);	\
    275  1.1  fredette 	}								\
    276  1.1  fredette     }}
    277  1.1  fredette 
    278  1.1  fredette #define Dint_setzero(dresultA,dresultB)	\
    279  1.1  fredette     Dintp1(dresultA) = 0;	\
    280  1.1  fredette     Dintp2(dresultB) = 0
    281  1.1  fredette 
    282  1.1  fredette #define Dint_setone_sign(dresultA,dresultB)		\
    283  1.1  fredette     Dintp1(dresultA) = ~Dintp1(dresultA);		\
    284  1.1  fredette     if ((Dintp2(dresultB) = -Dintp2(dresultB)) == 0) Dintp1(dresultA)++
    285  1.1  fredette 
    286  1.1  fredette #define Dint_set_minint(dresultA,dresultB)		\
    287  1.1  fredette     Dintp1(dresultA) = 1<<31;				\
    288  1.1  fredette     Dintp2(dresultB) = 0
    289  1.1  fredette 
    290  1.1  fredette #define Dint_isone_lowp2(dresultB)  (Dintp2(dresultB) & 01)
    291  1.1  fredette 
    292  1.1  fredette #define Dint_increment(dresultA,dresultB)		\
    293  1.1  fredette     if ((++Dintp2(dresultB))==0) Dintp1(dresultA)++
    294  1.1  fredette 
    295  1.1  fredette #define Dint_decrement(dresultA,dresultB)		\
    296  1.1  fredette     if ((Dintp2(dresultB)--)==0) Dintp1(dresultA)--
    297  1.1  fredette 
    298  1.1  fredette #define Dint_negate(dresultA,dresultB)			\
    299  1.1  fredette     Dintp1(dresultA) = ~Dintp1(dresultA);		\
    300  1.1  fredette     if ((Dintp2(dresultB) = -Dintp2(dresultB))==0) Dintp1(dresultA)++
    301  1.1  fredette 
    302  1.1  fredette #define Dint_copyfromptr(src,destA,destB) \
    303  1.1  fredette      Dintp1(destA) = src->wd0;		\
    304  1.1  fredette      Dintp2(destB) = src->wd1
    305  1.1  fredette #define Dint_copytoptr(srcA,srcB,dest)	\
    306  1.1  fredette     dest->wd0 = Dintp1(srcA);		\
    307  1.1  fredette     dest->wd1 = Dintp2(srcB)
    308  1.1  fredette 
    309  1.1  fredette 
    310  1.1  fredette /* other macros  */
    311  1.1  fredette 
    312  1.1  fredette #define Find_ms_one_bit(value, position)	\
    313  1.1  fredette     {						\
    314  1.1  fredette 	int var;				\
    315  1.1  fredette 	for (var=8; var >=1; var >>= 1) {	\
    316  1.1  fredette 	    if (value >> (32 - position))	\
    317  1.1  fredette 		position -= var;		\
    318  1.1  fredette 		else position += var;		\
    319  1.1  fredette 	}					\
    320  1.1  fredette 	if ((value >> (32 - position)) == 0)	\
    321  1.1  fredette 	    position--;				\
    322  1.1  fredette 	else position -= 2;			\
    323  1.1  fredette     }
    324  1.1  fredette 
    325  1.1  fredette /*
    326  1.1  fredette  * The following 4 functions handle the assignment of a floating point
    327  1.1  fredette  * number to a 32-bit integer in cases where the floating point number
    328  1.1  fredette  * is too large (or small) to fit in the integer field.
    329  1.1  fredette  *
    330  1.1  fredette  * In all these cases, HP-UX would return an UNIMPLEMENTEDEXCEPTION
    331  1.1  fredette  * resulting in a SIGFPE being sent to the process.  For BSD's math
    332  1.1  fredette  * library (and various other applications), this was unacceptable.
    333  1.1  fredette  * As a result, we now return maxint/minint (like most other OS's)
    334  1.1  fredette  * and either return an INEXACTEXCEPTION (SIGFPE) or set the inexact
    335  1.1  fredette  * flag (so that the program may continue execution).
    336  1.1  fredette  *
    337  1.1  fredette  * After discussing this with Jerry Huck @ HP, the one case where we
    338  1.1  fredette  * differ from BSD is for programs that try to convert a NaN to an
    339  1.1  fredette  * integer; in this case, we will return an UNIMPLEMENTEDEXCEPTION
    340  1.1  fredette  * since doing anything else would be completely unreasonable.
    341  1.1  fredette  *
    342  1.1  fredette  *	jef
    343  1.1  fredette  */
    344  1.1  fredette 
    345  1.1  fredette #define	Dbl_return_overflow(srcp1, srcp2, resultp)	\
    346  1.1  fredette     {						\
    347  1.1  fredette 	if (Dbl_isnan(srcp1, srcp2))		\
    348  1.1  fredette 		return(UNIMPLEMENTEDEXCEPTION);	\
    349  1.1  fredette 	if (Dbl_iszero_sign(srcp1))		\
    350  1.1  fredette 		*resultp = 0x7fffffff;		\
    351  1.1  fredette 	else					\
    352  1.1  fredette 		*resultp = 0x80000000;		\
    353  1.1  fredette 	if (Is_overflowtrap_enabled()) {	\
    354  1.1  fredette 		if (Is_inexacttrap_enabled())	\
    355  1.1  fredette 			return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);	\
    356  1.1  fredette 		else				\
    357  1.1  fredette 			Set_inexactflag();	\
    358  1.1  fredette 		return(OVERFLOWEXCEPTION);	\
    359  1.1  fredette 	}					\
    360  1.1  fredette 	return(NOEXCEPTION);			\
    361  1.1  fredette     }
    362  1.1  fredette 
    363  1.1  fredette #define	Dbl_return_overflow_dbl(srcp1, srcp2, resultp)	\
    364  1.1  fredette     {						\
    365  1.1  fredette 	if (Dbl_isnan(srcp1, srcp2))		\
    366  1.1  fredette 		return(UNIMPLEMENTEDEXCEPTION);	\
    367  1.1  fredette 	if (Dbl_iszero_sign(srcp1)) {		\
    368  1.1  fredette 		Dint_copytoptr(0x7fffffff,0xffffffff,resultp); \
    369  1.1  fredette 	} else {				\
    370  1.1  fredette 		Dint_copytoptr(0x80000000,0x00000000,resultp); \
    371  1.1  fredette 	}					\
    372  1.1  fredette 	if (Is_overflowtrap_enabled()) {	\
    373  1.1  fredette 		if (Is_inexacttrap_enabled())	\
    374  1.1  fredette 			return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);	\
    375  1.1  fredette 		else				\
    376  1.1  fredette 			Set_inexactflag();	\
    377  1.1  fredette 		return(OVERFLOWEXCEPTION);	\
    378  1.1  fredette 	}					\
    379  1.1  fredette 	return(NOEXCEPTION);			\
    380  1.1  fredette     }
    381  1.1  fredette 
    382  1.1  fredette #define	Sgl_return_overflow(src, resultp)	\
    383  1.1  fredette     {						\
    384  1.1  fredette 	if (Sgl_isnan(src))			\
    385  1.1  fredette 		return(UNIMPLEMENTEDEXCEPTION);	\
    386  1.1  fredette 	if (Sgl_iszero_sign(src))		\
    387  1.1  fredette 		*resultp = 0x7fffffff;		\
    388  1.1  fredette 	else					\
    389  1.1  fredette 		*resultp = 0x80000000;		\
    390  1.1  fredette 	if (Is_overflowtrap_enabled()) {	\
    391  1.1  fredette 		if (Is_inexacttrap_enabled())	\
    392  1.1  fredette 			return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);	\
    393  1.1  fredette 		else				\
    394  1.1  fredette 			Set_inexactflag();	\
    395  1.1  fredette 		return(OVERFLOWEXCEPTION);	\
    396  1.1  fredette 	}					\
    397  1.1  fredette 	return(NOEXCEPTION);			\
    398  1.1  fredette     }
    399  1.1  fredette 
    400  1.1  fredette #define	Sgl_return_overflow_dbl(src, resultp)	\
    401  1.1  fredette     {						\
    402  1.1  fredette 	if (Sgl_isnan(src))			\
    403  1.1  fredette 		return(UNIMPLEMENTEDEXCEPTION);	\
    404  1.1  fredette 	if (Sgl_iszero_sign(src)) {		\
    405  1.1  fredette 		Dint_copytoptr(0x7fffffff,0xffffffff,resultp); \
    406  1.1  fredette 	} else {				\
    407  1.1  fredette 		Dint_copytoptr(0x80000000,0x00000000,resultp); \
    408  1.1  fredette 	}					\
    409  1.1  fredette 	if (Is_overflowtrap_enabled()) {	\
    410  1.1  fredette 		if (Is_inexacttrap_enabled())	\
    411  1.1  fredette 			return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);	\
    412  1.1  fredette 		else				\
    413  1.1  fredette 			Set_inexactflag();	\
    414  1.1  fredette 		return(OVERFLOWEXCEPTION);	\
    415  1.1  fredette 	}					\
    416  1.1  fredette 	return(NOEXCEPTION);			\
    417  1.1  fredette     }
    418  1.1  fredette 
    419  1.3     skrll int sgl_to_sgl_fcnvfx(sgl_floating_point *, sgl_floating_point *, unsigned int *);
    420  1.3     skrll int sgl_to_dbl_fcnvfx(sgl_floating_point *, dbl_integer *, unsigned int *);
    421  1.3     skrll int dbl_to_sgl_fcnvfx(dbl_floating_point *, int *, unsigned int *);
    422  1.3     skrll int dbl_to_dbl_fcnvfx(dbl_floating_point *, dbl_integer *, unsigned int *);
    423  1.3     skrll 
    424  1.3     skrll int sgl_to_sgl_fcnvfxt(sgl_floating_point *, int *, unsigned int *);
    425  1.3     skrll int sgl_to_dbl_fcnvfxt(sgl_floating_point *, dbl_integer *, unsigned int *);
    426  1.3     skrll int dbl_to_sgl_fcnvfxt(dbl_floating_point *, int *, unsigned int *);
    427  1.3     skrll int dbl_to_dbl_fcnvfxt(dbl_floating_point *, dbl_integer *, unsigned int *);
    428  1.3     skrll 
    429  1.3     skrll int sgl_to_sgl_fcnvxf(int *, sgl_floating_point *, unsigned int *);
    430  1.3     skrll int sgl_to_dbl_fcnvxf(int *, dbl_floating_point *, unsigned int *);
    431  1.3     skrll int dbl_to_sgl_fcnvxf(dbl_integer *, sgl_floating_point *, unsigned int *);
    432  1.3     skrll int dbl_to_dbl_fcnvxf(dbl_integer *, dbl_floating_point *, unsigned int *);
    433  1.1  fredette 
    434  1.1  fredette 
    435  1.1  fredette 
    436