ia64 actually uses 80-bit long doubles and must support big and little

endian at compile-time.

Reviewed by:	das
This commit is contained in:
Mike Barcroft 2003-02-26 16:04:34 +00:00
parent b4f721685e
commit ef4a12d2d7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=111555
2 changed files with 27 additions and 3 deletions

View File

@ -27,14 +27,29 @@
* $FreeBSD$
*/
#include <sys/endian.h>
union IEEEl2bits {
long double e;
struct {
unsigned long manl :64;
unsigned long manh :48;
#if _BYTE_ORDER == _LITTLE_ENDIAN
unsigned int manl :32;
unsigned int manh :32;
unsigned int exp :15;
unsigned int sign :1;
unsigned long junk :48;
#else /* _BIG_ENDIAN */
unsigned long junk :48;
unsigned int sign :1;
unsigned int exp :15;
unsigned int manh :32;
unsigned int manl :32;
#endif
} bits;
};
#define mask_nbit_l(u) ((u).bits.manl &= 0x7fffffffffffffff)
#if _BYTE_ORDER == _LITTLE_ENDIAN
#define mask_nbit_l(u) ((u).bits.manh &= 0x7fffffff)
#else /* _BIG_ENDIAN */
#define mask_nbit_l(u) ((u).bits.manh &= 0xffffff7f)
#endif

View File

@ -30,10 +30,19 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/endian.h>
#include <math.h>
/* bytes for +Infinity on an ia64 (IEEE double format) */
#if _BYTE_ORDER == _LITTLE_ENDIAN
const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
#else /* _BIG_ENDIAN */
const union __infinity_un __infinity = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
#endif
/* bytes for NaN */
#if _BYTE_ORDER == _LITTLE_ENDIAN
const union __nan_un __nan = { { 0, 0, 0xc0, 0xff } };
#else /* _BIG_ENDIAN */
const union __nan_un __nan = { { 0xff, 0xc0, 0, 0 } };
#endif