Home | History | Annotate | Line # | Download | only in gen
      1  1.1  matt /*	$NetBSD: infinityl_ieee754.c,v 1.1 2011/01/17 23:53:03 matt Exp $	*/
      2  1.1  matt 
      3  1.1  matt /*
      4  1.1  matt  * IEEE-compatible infinityl.c for 64-bit or 128-bit long double format.
      5  1.1  matt  * This is public domain.
      6  1.1  matt  */
      7  1.1  matt 
      8  1.1  matt #include <sys/cdefs.h>
      9  1.1  matt #if defined(LIBC_SCCS) && !defined(lint)
     10  1.1  matt __RCSID("$NetBSD: infinityl_ieee754.c,v 1.1 2011/01/17 23:53:03 matt Exp $");
     11  1.1  matt #endif /* LIBC_SCCS and not lint */
     12  1.1  matt 
     13  1.1  matt #include <math.h>
     14  1.1  matt #include <machine/endian.h>
     15  1.1  matt #include <machine/ieee.h>
     16  1.1  matt 
     17  1.1  matt #ifdef __HAVE_LONG_DOUBLE
     18  1.1  matt #define	LDBL_EXPBITS		EXT_EXPBITS
     19  1.1  matt #define	LDBL_EXP_INFNAN		EXT_EXP_INFNAN
     20  1.1  matt #else
     21  1.1  matt #define	LDBL_EXPBITS		DBL_EXPBITS
     22  1.1  matt #define	LDBL_EXP_INFNAN		DBL_EXP_INFNAN
     23  1.1  matt #endif
     24  1.1  matt 
     25  1.1  matt #define	EXP_INFNAN		(LDBL_EXP_INFNAN << (31 - LDBL_EXPBITS))
     26  1.1  matt 
     27  1.1  matt const union __long_double_u __infinityl = { {
     28  1.1  matt #if BYTE_ORDER == BIG_ENDIAN
     29  1.1  matt 	[0] = (EXP_INFNAN >> 24) & 0x7f,
     30  1.1  matt 	[1] = (EXP_INFNAN >> 16) & 0xff,
     31  1.1  matt 	[2] = (EXP_INFNAN >>  8) & 0xff,
     32  1.1  matt 	[3] = (EXP_INFNAN >>  0) & 0xff,
     33  1.1  matt #else
     34  1.1  matt 	[sizeof(long double)-4] = (EXP_INFNAN >>  0) & 0xff,
     35  1.1  matt 	[sizeof(long double)-3] = (EXP_INFNAN >>  8) & 0xff,
     36  1.1  matt 	[sizeof(long double)-2] = (EXP_INFNAN >> 16) & 0xff,
     37  1.1  matt 	[sizeof(long double)-1] = (EXP_INFNAN >> 24) & 0x7f,
     38  1.1  matt #endif
     39  1.1  matt } };
     40