X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftv%2Fieee754.h;h=7131e5de6cc5d537ecd59a3952e10fac7fb07ca5;hb=6b74d7d8bb06a79c659f229e8024a5cece0b9126;hp=2bb60c79b3bf5d83d1f546909d373e7f99cf72d8;hpb=e3e22fa6f927847099c0bff62457003aa81f2518;p=libfirm diff --git a/ir/tv/ieee754.h b/ir/tv/ieee754.h index 2bb60c79b..7131e5de6 100644 --- a/ir/tv/ieee754.h +++ b/ir/tv/ieee754.h @@ -1,47 +1,68 @@ -/* IEEE754 fp format. - Copyright (C) 1995, 1996 Christian von Roques */ - -/* $Id$ */ - -/* This file was derived from the GNU C Library's ieee754.h which - carried the following copyright notice: - -Copyright (C) 1992 Free Software Foundation, Inc. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* @@@ This is completely non-portable! ISO/IEC DIS 9899, section - 3.5.2.1: An implementation may allocate any addressable storage - unit large enough to hold a bit-field. If enough space remains, a - bit-field that immediately follows another bit-field in a structure - shall be packed into adjacent bits of the same unit. If - insufficient space remains, whether a bit-field that does not fit - is put into the next unit or overlaps adjacent units is - implementation-defined. The order of allocation of bit-fields - within a unit (high-order to low-order or low-order to high-order) - is implementation-defined. */ - -/* Floating point definitions in ieee standard number 754 - only used in target values (/libfirm/ir/tv/tv.c). */ +/* Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + #ifndef _IEEE754_H -#define _IEEE754_H -#ifdef HAVE_CONFIG_H -# include -#endif +#define _IEEE754_H 1 +#include + +#include + +__BEGIN_DECLS + +union ieee754_float + { + float f; + + /* This is the IEEE 754 single-precision format. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:8; + unsigned int mantissa:23; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int mantissa:23; + unsigned int exponent:8; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:8; + unsigned int quiet_nan:1; + unsigned int mantissa:22; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int mantissa:22; + unsigned int quiet_nan:1; + unsigned int exponent:8; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee_nan; + }; + +#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ union ieee754_double @@ -51,75 +72,128 @@ union ieee754_double /* This is the IEEE 754 double-precision format. */ struct { -#ifdef WORDS_BIGENDIAN +#if __BYTE_ORDER == __BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; + /* Together these comprise the mantissa. */ unsigned int mantissa0:20; unsigned int mantissa1:32; -#else +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +# if __FLOAT_WORD_ORDER == BIG_ENDIAN + unsigned int mantissa0:20; + unsigned int exponent:11; + unsigned int negative:1; + unsigned int mantissa1:32; +# else + /* Together these comprise the mantissa. */ unsigned int mantissa1:32; unsigned int mantissa0:20; unsigned int exponent:11; unsigned int negative:1; -#endif +# endif +#endif /* Little endian. */ } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { -#ifdef WORDS_BIGENDIAN +#if __BYTE_ORDER == __BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; unsigned int quiet_nan:1; + /* Together these comprise the mantissa. */ unsigned int mantissa0:19; unsigned int mantissa1:32; #else +# if __FLOAT_WORD_ORDER == BIG_ENDIAN + unsigned int mantissa0:19; + unsigned int quiet_nan:1; + unsigned int exponent:11; + unsigned int negative:1; + unsigned int mantissa1:32; +# else + /* Together these comprise the mantissa. */ unsigned int mantissa1:32; unsigned int mantissa0:19; unsigned int quiet_nan:1; unsigned int exponent:11; unsigned int negative:1; +# endif #endif } ieee_nan; }; -/* bias added to exponent of ieee754_double */ -#define _IEEE754_DOUBLE_BIAS 0x3ff +#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ -union ieee754_float +union ieee854_long_double { - float f; + long double d; - /* This is the ieee754 single-precision format. */ + /* This is the IEEE 854 double-extended-precision format. */ struct { -#ifdef WORDS_BIGENDIAN +#if __BYTE_ORDER == __BIG_ENDIAN unsigned int negative:1; - unsigned int exponent:8; - unsigned int mantissa:23; -#else - unsigned int mantissa:23; - unsigned int exponent:8; + unsigned int exponent:15; + unsigned int empty:16; + unsigned int mantissa0:32; + unsigned int mantissa1:32; +#endif +#if __BYTE_ORDER == __LITTLE_ENDIAN +# if __FLOAT_WORD_ORDER == BIG_ENDIAN + unsigned int exponent:15; + unsigned int negative:1; + unsigned int empty:16; + unsigned int mantissa0:32; + unsigned int mantissa1:32; +# else + unsigned int mantissa1:32; + unsigned int mantissa0:32; + unsigned int exponent:15; unsigned int negative:1; + unsigned int empty:16; +# endif #endif } ieee; - /* This is for extracting information about NaNs. */ + + /* This is for NaNs in the IEEE 854 double-extended-precision format. */ struct { -#ifdef WORDS_BIGENDIAN +#if __BYTE_ORDER == __BIG_ENDIAN unsigned int negative:1; - unsigned int exponent:8; + unsigned int exponent:15; + unsigned int empty:16; + unsigned int one:1; unsigned int quiet_nan:1; - unsigned int mantissa:22; -#else - unsigned int mantissa:22; + unsigned int mantissa0:30; + unsigned int mantissa1:32; +#endif +#if __BYTE_ORDER == __LITTLE_ENDIAN +# if __FLOAT_WORD_ORDER == BIG_ENDIAN + unsigned int exponent:15; + unsigned int negative:1; + unsigned int empty:16; + unsigned int mantissa0:30; unsigned int quiet_nan:1; - unsigned int exponent:8; + unsigned int one:1; + unsigned int mantissa1:32; +# else + unsigned int mantissa1:32; + unsigned int mantissa0:30; + unsigned int quiet_nan:1; + unsigned int one:1; + unsigned int exponent:15; unsigned int negative:1; + unsigned int empty:16; +# endif #endif } ieee_nan; }; -/* bias added to exponent of ieee_float */ -#define _IEEE754_FLOAT_BIAS 0x7f +#define IEEE854_LONG_DOUBLE_BIAS 0x3fff + +__END_DECLS -#endif /* _IEEE754_H */ +#endif /* ieee754.h */