X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Freal.c;h=9df904021562c509488bea8627802a2842e66da6;hb=10c0611466c6e2c29a7c300cdd22ed4be0217e32;hp=3a3f4be50ba525e3e8c68b6e39253010b99e4cb9;hpb=bfd4a3d6d8fc5d3b02c0dcd30a8cd22e64368055;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/real.c b/gcc/real.c index 3a3f4be50ba..9df90402156 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -1,6 +1,7 @@ /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF, and support for XFmode IEEE extended real floating point arithmetic. - Copyright (C) 1993, 94-98, 1999 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000 Free Software Foundation, Inc. Contributed by Stephen L. Moshier (moshier@world.std.com). This file is part of GNU CC. @@ -24,6 +25,7 @@ Boston, MA 02111-1307, USA. */ #include "system.h" #include "tree.h" #include "toplev.h" +#include "tm_p.h" /* To enable support of XFmode extended real floating point, define LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h). @@ -93,7 +95,9 @@ netlib.att.com: netlib/cephes. */ The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support and may deactivate XFmode since `long double' is used to refer - to both modes. + to both modes. Defining INTEL_EXTENDED_IEEE_FORMAT at the same + time enables 80387-style 80-bit floats in a 128-bit padded + image, as seen on IA-64. The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN, contributed by Richard Earnshaw , @@ -242,25 +246,31 @@ unknown arithmetic type A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations in memory, with no holes. */ -#if LONG_DOUBLE_TYPE_SIZE == 96 +#if MAX_LONG_DOUBLE_TYPE_SIZE == 96 || \ + (defined(INTEL_EXTENDED_IEEE_FORMAT) && MAX_LONG_DOUBLE_TYPE_SIZE == 128) /* Number of 16 bit words in external e type format */ -#define NE 6 -#define MAXDECEXP 4932 -#define MINDECEXP -4956 -#define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE) -#define PUT_REAL(e,r) \ -do { \ - if (2*NE < sizeof(*r)) \ - bzero((char *)r, sizeof(*r)); \ - bcopy ((char *) e, (char *) r, 2*NE); \ -} while (0) -#else /* no XFmode */ -#if LONG_DOUBLE_TYPE_SIZE == 128 -#define NE 10 -#define MAXDECEXP 4932 -#define MINDECEXP -4977 -#define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE) -#define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE) +# define NE 6 +# define MAXDECEXP 4932 +# define MINDECEXP -4956 +# define GET_REAL(r,e) memcpy ((char *)(e), (char *)(r), 2*NE) +# define PUT_REAL(e,r) \ + do { \ + memcpy ((char *)(r), (char *)(e), 2*NE); \ + if (2*NE < sizeof(*r)) \ + memset ((char *)(r) + 2*NE, 0, sizeof(*r) - 2*NE); \ + } while (0) +# else /* no XFmode */ +# if MAX_LONG_DOUBLE_TYPE_SIZE == 128 +# define NE 10 +# define MAXDECEXP 4932 +# define MINDECEXP -4977 +# define GET_REAL(r,e) memcpy ((char *)(e), (char *)(r), 2*NE) +# define PUT_REAL(e,r) \ + do { \ + memcpy ((char *)(r), (char *)(e), 2*NE); \ + if (2*NE < sizeof(*r)) \ + memset ((char *)(r) + 2*NE, 0, sizeof(*r) - 2*NE); \ + } while (0) #else #define NE 6 #define MAXDECEXP 4932 @@ -269,34 +279,34 @@ do { \ /* Emulator uses target format internally but host stores it in host endian-ness. */ -#define GET_REAL(r,e) \ -do { \ - if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ - e53toe ((unsigned EMUSHORT *) (r), (e)); \ - else \ - { \ - unsigned EMUSHORT w[4]; \ - w[3] = ((EMUSHORT *) r)[0]; \ - w[2] = ((EMUSHORT *) r)[1]; \ - w[1] = ((EMUSHORT *) r)[2]; \ - w[0] = ((EMUSHORT *) r)[3]; \ - e53toe (w, (e)); \ - } \ +#define GET_REAL(r,e) \ +do { \ + if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ + e53toe ((unsigned EMUSHORT *) (r), (e)); \ + else \ + { \ + unsigned EMUSHORT w[4]; \ + memcpy (&w[3], ((EMUSHORT *) r), sizeof (EMUSHORT)); \ + memcpy (&w[2], ((EMUSHORT *) r) + 1, sizeof (EMUSHORT)); \ + memcpy (&w[1], ((EMUSHORT *) r) + 2, sizeof (EMUSHORT)); \ + memcpy (&w[0], ((EMUSHORT *) r) + 3, sizeof (EMUSHORT)); \ + e53toe (w, (e)); \ + } \ } while (0) -#define PUT_REAL(e,r) \ -do { \ - if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ - etoe53 ((e), (unsigned EMUSHORT *) (r)); \ - else \ - { \ - unsigned EMUSHORT w[4]; \ - etoe53 ((e), w); \ - *((EMUSHORT *) r) = w[3]; \ - *((EMUSHORT *) r + 1) = w[2]; \ - *((EMUSHORT *) r + 2) = w[1]; \ - *((EMUSHORT *) r + 3) = w[0]; \ - } \ +#define PUT_REAL(e,r) \ +do { \ + if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ + etoe53 ((e), (unsigned EMUSHORT *) (r)); \ + else \ + { \ + unsigned EMUSHORT w[4]; \ + etoe53 ((e), w); \ + memcpy (((EMUSHORT *) r), &w[3], sizeof (EMUSHORT)); \ + memcpy (((EMUSHORT *) r) + 1, &w[2], sizeof (EMUSHORT)); \ + memcpy (((EMUSHORT *) r) + 2, &w[1], sizeof (EMUSHORT)); \ + memcpy (((EMUSHORT *) r) + 3, &w[0], sizeof (EMUSHORT)); \ + } \ } while (0) #else /* not REAL_ARITHMETIC */ @@ -330,136 +340,147 @@ do { \ /* The exponent of 1.0 */ #define EXONE (0x3fff) +#if defined(HOST_EBCDIC) +/* bit 8 is significant in EBCDIC */ +#define CHARMASK 0xff +#else +#define CHARMASK 0x7f +#endif + extern int extra_warnings; extern unsigned EMUSHORT ezero[], ehalf[], eone[], etwo[]; extern unsigned EMUSHORT elog2[], esqrt2[]; -static void endian PROTO((unsigned EMUSHORT *, long *, +static void endian PARAMS ((unsigned EMUSHORT *, long *, enum machine_mode)); -static void eclear PROTO((unsigned EMUSHORT *)); -static void emov PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void eclear PARAMS ((unsigned EMUSHORT *)); +static void emov PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #if 0 -static void eabs PROTO((unsigned EMUSHORT *)); -#endif -static void eneg PROTO((unsigned EMUSHORT *)); -static int eisneg PROTO((unsigned EMUSHORT *)); -static int eisinf PROTO((unsigned EMUSHORT *)); -static int eisnan PROTO((unsigned EMUSHORT *)); -static void einfin PROTO((unsigned EMUSHORT *)); -static void enan PROTO((unsigned EMUSHORT *, int)); -static void emovi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void emovo PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void ecleaz PROTO((unsigned EMUSHORT *)); -static void ecleazs PROTO((unsigned EMUSHORT *)); -static void emovz PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void einan PROTO((unsigned EMUSHORT *)); -static int eiisnan PROTO((unsigned EMUSHORT *)); -static int eiisneg PROTO((unsigned EMUSHORT *)); +static void eabs PARAMS ((unsigned EMUSHORT *)); +#endif +static void eneg PARAMS ((unsigned EMUSHORT *)); +static int eisneg PARAMS ((unsigned EMUSHORT *)); +static int eisinf PARAMS ((unsigned EMUSHORT *)); +static int eisnan PARAMS ((unsigned EMUSHORT *)); +static void einfin PARAMS ((unsigned EMUSHORT *)); +#ifdef NANS +static void enan PARAMS ((unsigned EMUSHORT *, int)); +static void einan PARAMS ((unsigned EMUSHORT *)); +static int eiisnan PARAMS ((unsigned EMUSHORT *)); +static int eiisneg PARAMS ((unsigned EMUSHORT *)); +static void make_nan PARAMS ((unsigned EMUSHORT *, int, enum machine_mode)); +#endif +static void emovi PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void emovo PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void ecleaz PARAMS ((unsigned EMUSHORT *)); +static void ecleazs PARAMS ((unsigned EMUSHORT *)); +static void emovz PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #if 0 -static void eiinfin PROTO((unsigned EMUSHORT *)); -#endif -static int eiisinf PROTO((unsigned EMUSHORT *)); -static int ecmpm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void eshdn1 PROTO((unsigned EMUSHORT *)); -static void eshup1 PROTO((unsigned EMUSHORT *)); -static void eshdn8 PROTO((unsigned EMUSHORT *)); -static void eshup8 PROTO((unsigned EMUSHORT *)); -static void eshup6 PROTO((unsigned EMUSHORT *)); -static void eshdn6 PROTO((unsigned EMUSHORT *)); -static void eaddm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void esubm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void m16m PROTO((unsigned int, unsigned short *, +static void eiinfin PARAMS ((unsigned EMUSHORT *)); +#endif +#ifdef INFINITY +static int eiisinf PARAMS ((unsigned EMUSHORT *)); +#endif +static int ecmpm PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void eshdn1 PARAMS ((unsigned EMUSHORT *)); +static void eshup1 PARAMS ((unsigned EMUSHORT *)); +static void eshdn8 PARAMS ((unsigned EMUSHORT *)); +static void eshup8 PARAMS ((unsigned EMUSHORT *)); +static void eshup6 PARAMS ((unsigned EMUSHORT *)); +static void eshdn6 PARAMS ((unsigned EMUSHORT *)); +static void eaddm PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void esubm PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void m16m PARAMS ((unsigned int, unsigned short *, unsigned short *)); -static int edivm PROTO((unsigned short *, unsigned short *)); -static int emulm PROTO((unsigned short *, unsigned short *)); -static void emdnorm PROTO((unsigned EMUSHORT *, int, int, EMULONG, int)); -static void esub PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static int edivm PARAMS ((unsigned short *, unsigned short *)); +static int emulm PARAMS ((unsigned short *, unsigned short *)); +static void emdnorm PARAMS ((unsigned EMUSHORT *, int, int, EMULONG, int)); +static void esub PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void eadd PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void eadd PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void eadd1 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void eadd1 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void ediv PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void ediv PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void emul PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void emul PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void e53toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void e64toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void e113toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void e24toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etoe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void toe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etoe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void toe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etoe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void toe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etoe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void toe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static int ecmp PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void e53toe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void e64toe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void e113toe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void e24toe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoe113 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void toe113 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoe64 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void toe64 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoe53 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void toe53 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoe24 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void toe24 PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static int ecmp PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #if 0 -static void eround PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void eround PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #endif -static void ltoe PROTO((HOST_WIDE_INT *, unsigned EMUSHORT *)); -static void ultoe PROTO((unsigned HOST_WIDE_INT *, unsigned EMUSHORT *)); -static void eifrac PROTO((unsigned EMUSHORT *, HOST_WIDE_INT *, +static void ltoe PARAMS ((HOST_WIDE_INT *, unsigned EMUSHORT *)); +static void ultoe PARAMS ((unsigned HOST_WIDE_INT *, unsigned EMUSHORT *)); +static void eifrac PARAMS ((unsigned EMUSHORT *, HOST_WIDE_INT *, unsigned EMUSHORT *)); -static void euifrac PROTO((unsigned EMUSHORT *, unsigned HOST_WIDE_INT *, +static void euifrac PARAMS ((unsigned EMUSHORT *, unsigned HOST_WIDE_INT *, unsigned EMUSHORT *)); -static int eshift PROTO((unsigned EMUSHORT *, int)); -static int enormlz PROTO((unsigned EMUSHORT *)); +static int eshift PARAMS ((unsigned EMUSHORT *, int)); +static int enormlz PARAMS ((unsigned EMUSHORT *)); #if 0 -static void e24toasc PROTO((unsigned EMUSHORT *, char *, int)); -static void e53toasc PROTO((unsigned EMUSHORT *, char *, int)); -static void e64toasc PROTO((unsigned EMUSHORT *, char *, int)); -static void e113toasc PROTO((unsigned EMUSHORT *, char *, int)); +static void e24toasc PARAMS ((unsigned EMUSHORT *, char *, int)); +static void e53toasc PARAMS ((unsigned EMUSHORT *, char *, int)); +static void e64toasc PARAMS ((unsigned EMUSHORT *, char *, int)); +static void e113toasc PARAMS ((unsigned EMUSHORT *, char *, int)); #endif /* 0 */ -static void etoasc PROTO((unsigned EMUSHORT *, char *, int)); -static void asctoe24 PROTO((char *, unsigned EMUSHORT *)); -static void asctoe53 PROTO((char *, unsigned EMUSHORT *)); -static void asctoe64 PROTO((char *, unsigned EMUSHORT *)); -static void asctoe113 PROTO((char *, unsigned EMUSHORT *)); -static void asctoe PROTO((char *, unsigned EMUSHORT *)); -static void asctoeg PROTO((char *, unsigned EMUSHORT *, int)); -static void efloor PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoasc PARAMS ((unsigned EMUSHORT *, char *, int)); +static void asctoe24 PARAMS ((const char *, unsigned EMUSHORT *)); +static void asctoe53 PARAMS ((const char *, unsigned EMUSHORT *)); +static void asctoe64 PARAMS ((const char *, unsigned EMUSHORT *)); +static void asctoe113 PARAMS ((const char *, unsigned EMUSHORT *)); +static void asctoe PARAMS ((const char *, unsigned EMUSHORT *)); +static void asctoeg PARAMS ((const char *, unsigned EMUSHORT *, int)); +static void efloor PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #if 0 -static void efrexp PROTO((unsigned EMUSHORT *, int *, +static void efrexp PARAMS ((unsigned EMUSHORT *, int *, unsigned EMUSHORT *)); #endif -static void eldexp PROTO((unsigned EMUSHORT *, int, unsigned EMUSHORT *)); +static void eldexp PARAMS ((unsigned EMUSHORT *, int, unsigned EMUSHORT *)); #if 0 -static void eremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void eremain PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, unsigned EMUSHORT *)); #endif -static void eiremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void mtherr PROTO((char *, int)); +static void eiremain PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void mtherr PARAMS ((const char *, int)); #ifdef DEC -static void dectoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etodec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void todec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void dectoe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etodec PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void todec PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #endif #ifdef IBM -static void ibmtoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void ibmtoe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); -static void etoibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void etoibm PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); -static void toibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void toibm PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); #endif #ifdef C4X -static void c4xtoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void c4xtoe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); -static void etoc4x PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void etoc4x PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); -static void toc4x PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, +static void toc4x PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *, enum machine_mode)); #endif -static void make_nan PROTO((unsigned EMUSHORT *, int, enum machine_mode)); #if 0 -static void uditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void ditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etoudi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void etodi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); -static void esqrt PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void uditoe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void ditoe PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etoudi PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void etodi PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); +static void esqrt PARAMS ((unsigned EMUSHORT *, unsigned EMUSHORT *)); #endif /* Copy 32-bit numbers obtained from array containing 16-bit numbers, @@ -479,11 +500,13 @@ endian (e, x, mode) switch (mode) { case TFmode: +#ifndef INTEL_EXTENDED_IEEE_FORMAT /* Swap halfwords in the fourth long. */ th = (unsigned long) e[6] & 0xffff; t = (unsigned long) e[7] & 0xffff; t |= th << 16; x[3] = (long) t; +#endif case XFmode: /* Swap halfwords in the third long. */ @@ -521,11 +544,13 @@ endian (e, x, mode) switch (mode) { case TFmode: +#ifndef INTEL_EXTENDED_IEEE_FORMAT /* Pack the fourth long. */ th = (unsigned long) e[7] & 0xffff; t = (unsigned long) e[6] & 0xffff; t |= th << 16; x[3] = (long) t; +#endif case XFmode: /* Pack the third long. @@ -558,23 +583,6 @@ endian (e, x, mode) abort (); } } - - /* If 32 bits is an entire word for the target, but not for the host, - then sign-extend on the host so that the number will look the same - way on the host that it would on the target. See for instance - simplify_unary_operation. The #if is needed to avoid compiler - warnings. */ - -#if HOST_BITS_PER_WIDE_INT > 32 - if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == 32) - { - if (x[0] & ((HOST_WIDE_INT) 1 << 31)) - x[0] |= ((HOST_WIDE_INT) (-1) << 32); - - if (x[1] & ((HOST_WIDE_INT) 1 << 31)) - x[1] |= ((HOST_WIDE_INT) (-1) << 32); - } -#endif } @@ -708,7 +716,7 @@ etruncui (x) REAL_VALUE_TYPE ereal_atof (s, t) - char *s; + const char *s; enum machine_mode t; { unsigned EMUSHORT tem[NE], e[NE]; @@ -736,15 +744,18 @@ ereal_atof (s, t) e53toe (tem, e); break; - case XFmode: - asctoe64 (s, tem); - e64toe (tem, e); - break; - case TFmode: +#ifndef INTEL_EXTENDED_IEEE_FORMAT asctoe113 (s, tem); e113toe (tem, e); break; +#endif + /* FALLTHRU */ + + case XFmode: + asctoe64 (s, tem); + e64toe (tem, e); + break; default: asctoe (s, e); @@ -871,8 +882,13 @@ ereal_from_int (d, i, j, mode) break; case 128: +#ifndef INTEL_EXTENDED_IEEE_FORMAT etoe113 (dg, df); e113toe (df, dg); +#else + etoe64 (dg, df); + e64toe (df, dg); +#endif break; default: @@ -925,8 +941,13 @@ ereal_from_uint (d, i, j, mode) break; case 128: +#ifndef INTEL_EXTENDED_IEEE_FORMAT etoe113 (dg, df); e113toe (df, dg); +#else + etoe64 (dg, df); + e64toe (df, dg); +#endif break; default: @@ -1010,11 +1031,11 @@ ereal_ldexp (x, n) int target_isinf (x) - REAL_VALUE_TYPE x; + REAL_VALUE_TYPE x ATTRIBUTE_UNUSED; { +#ifdef INFINITY unsigned EMUSHORT e[NE]; -#ifdef INFINITY GET_REAL (&x, e); return (eisinf (e)); #else @@ -1026,11 +1047,11 @@ target_isinf (x) int target_isnan (x) - REAL_VALUE_TYPE x; + REAL_VALUE_TYPE x ATTRIBUTE_UNUSED; { +#ifdef NANS unsigned EMUSHORT e[NE]; -#ifdef NANS GET_REAL (&x, e); return (eisnan (e)); #else @@ -1069,9 +1090,12 @@ real_value_truncate (mode, arg) switch (mode) { case TFmode: +#ifndef INTEL_EXTENDED_IEEE_FORMAT etoe113 (e, t); e113toe (t, t); break; +#endif + /* FALLTHRU */ case XFmode: etoe64 (e, t); @@ -1485,7 +1509,7 @@ ereal_isneg (x) /* e type constants used by high precision check routines */ -#if LONG_DOUBLE_TYPE_SIZE == 128 +#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && !defined(INTEL_EXTENDED_IEEE_FORMAT) /* 0.0 */ unsigned EMUSHORT ezero[NE] = {0x0000, 0x0000, 0x0000, 0x0000, @@ -1642,7 +1666,7 @@ eisinf (x) static int eisnan (x) - unsigned EMUSHORT x[]; + unsigned EMUSHORT x[] ATTRIBUTE_UNUSED; { #ifdef NANS int i; @@ -1707,6 +1731,7 @@ einfin (x) This generates Intel's quiet NaN pattern for extended real. The exponent is 7fff, the leading mantissa word is c000. */ +#ifdef NANS static void enan (x, sign) register unsigned EMUSHORT *x; @@ -1719,6 +1744,7 @@ enan (x, sign) *x++ = 0xc000; *x = (sign << 15) | 0x7fff; } +#endif /* NANS */ /* Move in an e-type number A, converting it to exploded e-type B. */ @@ -1849,6 +1875,7 @@ emovz (a, b) The explicit pattern for this is maximum exponent and top two significant bits set. */ +#ifdef NANS static void einan (x) unsigned EMUSHORT x[]; @@ -1858,9 +1885,11 @@ einan (x) x[E] = 0x7fff; x[M + 1] = 0xc000; } +#endif /* NANS */ /* Return nonzero if exploded e-type X is a NaN. */ +#ifdef NANS static int eiisnan (x) unsigned EMUSHORT x[]; @@ -1877,9 +1906,11 @@ eiisnan (x) } return (0); } +#endif /* NANS */ /* Return nonzero if sign of exploded e-type X is nonzero. */ +#ifdef NANS static int eiisneg (x) unsigned EMUSHORT x[]; @@ -1887,6 +1918,7 @@ eiisneg (x) return x[0] != 0; } +#endif /* NANS */ #if 0 /* Fill exploded e-type X with infinity pattern. @@ -1904,6 +1936,7 @@ eiinfin (x) /* Return nonzero if exploded e-type X is infinite. */ +#ifdef INFINITY static int eiisinf (x) unsigned EMUSHORT x[]; @@ -1917,7 +1950,7 @@ eiisinf (x) return (1); return (0); } - +#endif /* INFINITY */ /* Compare significands of numbers in internal exploded e-type format. Guard words are included in the comparison. @@ -3510,7 +3543,9 @@ etoe113 (x, e) rndprc = 113; emdnorm (xi, 0, 0, exp, 64); rndprc = rndsav; +#ifdef INFINITY nonorm: +#endif toe113 (xi, e); } @@ -3602,7 +3637,9 @@ etoe64 (x, e) rndprc = 64; emdnorm (xi, 0, 0, exp, 64); rndprc = rndsav; +#ifdef INFINITY nonorm: +#endif toe64 (xi, e); } @@ -3639,10 +3676,11 @@ toe64 (a, b) else { q = b + 4; /* point to output exponent */ -#if LONG_DOUBLE_TYPE_SIZE == 96 - /* Clear the last two bytes of 12-byte Intel format */ + /* Clear the last two bytes of 12-byte Intel format. q is pointing + into an array of size 6 (e.g. x[NE]), so the last two bytes are + always there, and there are never more bytes, even when we are using + INTEL_EXTENDED_IEEE_FORMAT. */ *(q+1) = 0; -#endif } #endif @@ -3815,7 +3853,9 @@ etoe53 (x, e) rndprc = 53; emdnorm (xi, 0, 0, exp, 64); rndprc = rndsav; +#ifdef INFINITY nonorm: +#endif toe53 (xi, e); } @@ -3989,7 +4029,9 @@ etoe24 (x, e) rndprc = 24; emdnorm (xi, 0, 0, exp, 64); rndprc = rndsav; +#ifdef INFINITY nonorm: +#endif toe24 (xi, e); } @@ -4539,7 +4581,7 @@ enormlz (x) #define NTEN 12 #define MAXP 4096 -#if LONG_DOUBLE_TYPE_SIZE == 128 +#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && !defined(INTEL_EXTENDED_IEEE_FORMAT) static unsigned EMUSHORT etens[NTEN + 1][NE] = { {0x6576, 0x4a92, 0x804a, 0x153f, @@ -4967,7 +5009,7 @@ etoasc (x, string, ndigs) /* Round up and propagate carry-outs */ roun: --s; - k = *s & 0x7f; + k = *s & CHARMASK; /* Carry out to most significant digit? */ if (k == '.') { @@ -5023,7 +5065,7 @@ etoasc (x, string, ndigs) static void asctoe24 (s, y) - char *s; + const char *s; unsigned EMUSHORT *y; { asctoeg (s, y, 24); @@ -5034,7 +5076,7 @@ asctoe24 (s, y) static void asctoe53 (s, y) - char *s; + const char *s; unsigned EMUSHORT *y; { #if defined(DEC) || defined(IBM) @@ -5053,7 +5095,7 @@ asctoe53 (s, y) static void asctoe64 (s, y) - char *s; + const char *s; unsigned EMUSHORT *y; { asctoeg (s, y, 64); @@ -5063,7 +5105,7 @@ asctoe64 (s, y) static void asctoe113 (s, y) - char *s; + const char *s; unsigned EMUSHORT *y; { asctoeg (s, y, 113); @@ -5073,38 +5115,37 @@ asctoe113 (s, y) static void asctoe (s, y) - char *s; + const char *s; unsigned EMUSHORT *y; { asctoeg (s, y, NBITS); } /* Convert ASCII string SS to e type Y, with a specified rounding precision - of OPREC bits. BASE is 16 for C9X hexadecimal floating constants. */ + of OPREC bits. BASE is 16 for C99 hexadecimal floating constants. */ static void asctoeg (ss, y, oprec) - char *ss; + const char *ss; unsigned EMUSHORT *y; int oprec; { unsigned EMUSHORT yy[NI], xt[NI], tt[NI]; int esign, decflg, sgnflg, nexp, exp, prec, lost; - int k, trail, c, rndsav; + int i, k, trail, c, rndsav; EMULONG lexp; - unsigned EMUSHORT nsign, *p; + unsigned EMUSHORT nsign; char *sp, *s, *lstr; int base = 10; /* Copy the input string. */ lstr = (char *) alloca (strlen (ss) + 1); - s = ss; - while (*s == ' ') /* skip leading spaces */ - ++s; + while (*ss == ' ') /* skip leading spaces */ + ++ss; sp = lstr; - while ((*sp++ = *s++) != '\0') + while ((*sp++ = *ss++) != '\0') ; s = lstr; @@ -5129,7 +5170,7 @@ asctoeg (ss, y, oprec) nxtcom: if (*s >= '0' && *s <= '9') k = *s - '0'; - else if (*s >= 'a') + else if (*s >= 'a' && *s <= 'f') k = 10 + *s - 'a'; else k = 10 + *s - 'A'; @@ -5147,13 +5188,13 @@ asctoeg (ss, y, oprec) || (*sp >= 'A' && *sp <= 'F')))) ++sp; /* Check for syntax error */ - c = *sp & 0x7f; + c = *sp & CHARMASK; if ((base != 10 || ((c != 'e') && (c != 'E'))) && (base != 16 || ((c != 'p') && (c != 'P'))) && (c != '\0') && (c != '\n') && (c != '\r') && (c != ' ') && (c != ',')) - goto error; + goto unexpected_char_error; --sp; while (*sp == '0') *sp-- = 'z'; @@ -5182,9 +5223,9 @@ asctoeg (ss, y, oprec) else { if (decflg) - nexp += 1; /* count digits after decimal point */ + nexp += 1; /* count digits after decimal point */ - eshup1 (yy); /* multiply current number by 10 */ + eshup1 (yy); /* multiply current number by 10 */ emovz (yy, xt); eshup1 (xt); eshup1 (xt); @@ -5223,18 +5264,18 @@ asctoeg (ss, y, oprec) goto expnt; case '.': /* decimal point */ if (decflg) - goto error; + goto unexpected_char_error; ++decflg; break; case '-': nsign = 0xffff; if (sgnflg) - goto error; + goto unexpected_char_error; ++sgnflg; break; case '+': if (sgnflg) - goto error; + goto unexpected_char_error; ++sgnflg; break; case ',': @@ -5247,7 +5288,7 @@ asctoeg (ss, y, oprec) case 'I': goto infinite; default: - error: + unexpected_char_error: #ifdef NANS einan (yy); #else @@ -5287,7 +5328,7 @@ read_expnt: exp *= 10; exp += *s++ - '0'; if (exp > 999999) - break; + break; } if (esign < 0) exp = -exp; @@ -5377,14 +5418,14 @@ read_expnt: nexp -= 4096; } } - p = &etens[NTEN][0]; emov (eone, xt); exp = 1; + i = NTEN; do { if (exp & nexp) - emul (p, xt, xt); - p -= NE; + emul (etens[i], xt, xt); + i--; exp = exp + exp; } while (exp <= MAXP); @@ -5681,7 +5722,7 @@ extern int merror; static void mtherr (name, code) - char *name; + const char *name; int code; { /* The string passed by the calling program is supposed to be the @@ -5842,7 +5883,6 @@ ibmtoe (d, e, mode) { unsigned EMUSHORT y[NI]; register unsigned EMUSHORT r, *p; - int rndsav; ecleaz (y); /* start with a zero */ p = y; /* point to our number */ @@ -6241,6 +6281,7 @@ unsigned EMUSHORT SFlittlenan[2] = {0, 0xffc0}; #endif +#ifdef NANS static void make_nan (nan, sign, mode) unsigned EMUSHORT *nan; @@ -6256,12 +6297,15 @@ make_nan (nan, sign, mode) used like NaN's, but probably not in the same way as IEEE. */ #if !defined(DEC) && !defined(IBM) && !defined(C4X) case TFmode: +#ifndef INTEL_EXTENDED_IEEE_FORMAT n = 8; if (REAL_WORDS_BIG_ENDIAN) p = TFbignan; else p = TFlittlenan; break; +#endif + /* FALLTHRU */ case XFmode: n = 6; @@ -6299,6 +6343,7 @@ make_nan (nan, sign, mode) if (! REAL_WORDS_BIG_ENDIAN) *nan = (sign << 15) | (*p & 0x7fff); } +#endif /* NANS */ /* This is the inverse of the function `etarsingle' invoked by REAL_VALUE_TO_TARGET_SINGLE. */ @@ -6418,17 +6463,19 @@ ereal_from_double (d) /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */ if (REAL_WORDS_BIG_ENDIAN) { +#if HOST_BITS_PER_WIDE_INT == 32 s[0] = (unsigned EMUSHORT) (d[0] >> 16); s[1] = (unsigned EMUSHORT) d[0]; -#if HOST_BITS_PER_WIDE_INT == 32 s[2] = (unsigned EMUSHORT) (d[1] >> 16); s[3] = (unsigned EMUSHORT) d[1]; #else /* In this case the entire target double is contained in the first array element. The second element of the input is ignored. */ - s[2] = (unsigned EMUSHORT) (d[0] >> 48); - s[3] = (unsigned EMUSHORT) (d[0] >> 32); + s[0] = (unsigned EMUSHORT) (d[0] >> 48); + s[1] = (unsigned EMUSHORT) (d[0] >> 32); + s[2] = (unsigned EMUSHORT) (d[0] >> 16); + s[3] = (unsigned EMUSHORT) d[0]; #endif } else @@ -6830,7 +6877,7 @@ esqrt (x, y) floating point mode. The mode can hold an integer value that many bits wide, without losing any bits. */ -int +unsigned int significand_size (mode) enum machine_mode mode; { @@ -6869,8 +6916,13 @@ switch (GET_MODE_BITSIZE (mode)) case 96: return 64; + case 128: +#ifndef INTEL_EXTENDED_IEEE_FORMAT return 113; +#else + return 64; +#endif default: abort ();