| /* | 
 | * ==================================================== | 
 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | 
 | * | 
 | * Developed at SunPro, a Sun Microsystems, Inc. business. | 
 | * Permission to use, copy, modify, and distribute this | 
 | * software is freely granted, provided that this notice | 
 | * is preserved. | 
 | * ==================================================== | 
 | */ | 
 |  | 
 | #include <inttypes.h> | 
 | #include <float.h> | 
 |  | 
 | typedef unsigned int u_int32_t; | 
 |  | 
 | typedef union | 
 | { | 
 |     double value; | 
 |     struct | 
 |     { | 
 |         u_int32_t lsw; | 
 |         u_int32_t msw; | 
 |     } parts; | 
 | } ieee_double_shape_type; | 
 |  | 
 | typedef union { | 
 |     float value; | 
 |     u_int32_t word; | 
 | } ieee_float_shape_type; | 
 |  | 
 | /* Get two 32 bit ints from a double.  */ | 
 |  | 
 | #define EXTRACT_WORDS(ix0,ix1,d)    \ | 
 | do {                                \ | 
 |     ieee_double_shape_type ew_u;    \ | 
 |     ew_u.value = (d);               \ | 
 |     (ix0) = ew_u.parts.msw;         \ | 
 |     (ix1) = ew_u.parts.lsw;         \ | 
 | } while (0) | 
 |  | 
 | /* Get the most significant 32 bit int from a double.  */ | 
 |  | 
 | #define GET_HIGH_WORD(i,d)          \ | 
 | do {                                \ | 
 |     ieee_double_shape_type gh_u;    \ | 
 |     gh_u.value = (d);               \ | 
 |     (i) = gh_u.parts.msw;           \ | 
 | } while (0) | 
 |  | 
 | /* Get the less significant 32 bit int from a double.  */ | 
 |  | 
 | #define GET_LOW_WORD(i,d)           \ | 
 | do {                                \ | 
 |     ieee_double_shape_type gl_u;    \ | 
 |     gl_u.value = (d);               \ | 
 |     (i) = gl_u.parts.lsw;           \ | 
 | } while (0) | 
 |  | 
 | /* Set a double from two 32 bit ints.  */ | 
 |  | 
 | #define INSERT_WORDS(d,ix0,ix1)     \ | 
 | do {                                \ | 
 |     ieee_double_shape_type iw_u;    \ | 
 |     iw_u.parts.msw = (ix0);         \ | 
 |     iw_u.parts.lsw = (ix1);         \ | 
 |     (d) = iw_u.value;               \ | 
 | } while (0) | 
 |  | 
 | /* Set the more significant 32 bits of a double from an int.  */ | 
 |  | 
 | #define SET_HIGH_WORD(d,v)          \ | 
 | do {                                \ | 
 |     ieee_double_shape_type sh_u;    \ | 
 |     sh_u.value = (d);               \ | 
 |     sh_u.parts.msw = (v);           \ | 
 |     (d) = sh_u.value;               \ | 
 | } while (0) | 
 |  | 
 | /* Set the less significant 32 bits of a double from an int.  */ | 
 |  | 
 | #define SET_LOW_WORD(d,v)           \ | 
 | do {                                \ | 
 |     ieee_double_shape_type sl_u;    \ | 
 |     sl_u.value = (d);               \ | 
 |     sl_u.parts.lsw = (v);           \ | 
 |     (d) = sl_u.value;               \ | 
 | } while (0) | 
 |  | 
 | #define GET_FLOAT_WORD(i,d) do \ | 
 | { \ | 
 |     ieee_float_shape_type gf_u; \ | 
 |     gf_u.value = (d); \ | 
 |     (i) = gf_u.word; \ | 
 | } while(0) | 
 |  | 
 | #define SET_FLOAT_WORD(d,i) do \ | 
 | { \ | 
 |     ieee_float_shape_type gf_u; \ | 
 |     gf_u.word = (i); \ | 
 |     (d) = gf_u.value; \ | 
 | } while(0) | 
 |  | 
 |  | 
 | #ifdef FLT_EVAL_METHOD | 
 | /* | 
 |  * Attempt to get strict C99 semantics for assignment with non-C99 compilers. | 
 |  */ | 
 | #if FLT_EVAL_METHOD == 0 || __GNUC__ == 0 | 
 | #define	STRICT_ASSIGN(type, lval, rval)	((lval) = (rval)) | 
 | #else | 
 | #define	STRICT_ASSIGN(type, lval, rval) do {	\ | 
 | 	volatile type __lval;			\ | 
 | 						\ | 
 | 	if (sizeof(type) >= sizeof(long double))	\ | 
 | 		(lval) = (rval);		\ | 
 | 	else {					\ | 
 | 		__lval = (rval);		\ | 
 | 		(lval) = __lval;		\ | 
 | 	}					\ | 
 | } while (0) | 
 | #endif | 
 | #endif /* FLT_EVAL_METHOD */ | 
 |  | 
 | /* | 
 |  * Mix 0, 1 or 2 NaNs.  First add 0 to each arg.  This normally just turns | 
 |  * signaling NaNs into quiet NaNs by setting a quiet bit.  We do this | 
 |  * because we want to never return a signaling NaN, and also because we | 
 |  * don't want the quiet bit to affect the result.  Then mix the converted | 
 |  * args using the specified operation. | 
 |  * | 
 |  * When one arg is NaN, the result is typically that arg quieted.  When both | 
 |  * args are NaNs, the result is typically the quietening of the arg whose | 
 |  * mantissa is largest after quietening.  When neither arg is NaN, the | 
 |  * result may be NaN because it is indeterminate, or finite for subsequent | 
 |  * construction of a NaN as the indeterminate 0.0L/0.0L. | 
 |  * | 
 |  * Technical complications: the result in bits after rounding to the final | 
 |  * precision might depend on the runtime precision and/or on compiler | 
 |  * optimizations, especially when different register sets are used for | 
 |  * different precisions.  Try to make the result not depend on at least the | 
 |  * runtime precision by always doing the main mixing step in long double | 
 |  * precision.  Try to reduce dependencies on optimizations by adding the | 
 |  * the 0's in different precisions (unless everything is in long double | 
 |  * precision). | 
 |  */ | 
 | #define nan_mix(x, y)		(nan_mix_op((x), (y), +)) | 
 | #define nan_mix_op(x, y, op)	(((x) + 0.0L) op ((y) + 0)) |