OSDN Git Service

* lib/old-dejagnu.exp (old-dejagnu): Copy extra source files
[pf3gnuchains/gcc-fork.git] / gcc / real.c
index 37b0a88..3c91606 100644 (file)
@@ -1,29 +1,31 @@
 /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF,
    and support for XFmode IEEE extended real floating point arithmetic.
-   Copyright (C) 1993, 94, 95, 96, 97, 1998 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.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
 
-GNU CC 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 General Public License for more details.
+GCC 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 General Public License
+for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
 
 #include "config.h"
 #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).
@@ -48,10 +50,10 @@ test programs available.  A special version of the PARANOIA floating
 point arithmetic tester, modified for this purpose, can be found on
 usc.edu: /pub/C-numanal/ieeetest.zoo.  Other tests, and libraries of
 XFmode and TFmode transcendental functions, can be obtained by ftp from
-netlib.att.com: netlib/cephes.   */
+netlib.att.com: netlib/cephes.  */
 \f
 /* Type of computer arithmetic.
-   Only one of DEC, IBM, IEEE, or UNK should get defined.
+   Only one of DEC, IBM, IEEE, C4X, or UNK should get defined.
 
    `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
    to big-endian IEEE floating-point data structure.  This definition
@@ -76,16 +78,26 @@ netlib.att.com: netlib/cephes.   */
    no type wider than DFmode.  The IBM conversions were contributed by
    frank@atom.ansto.gov.au (Frank Crawford).
 
+   `C4X' refers specifically to the floating point format used on
+   Texas Instruments TMS320C3x and TMS320C4x digital signal
+   processors.  This supports QFmode (32-bit float, double) and HFmode
+   (40-bit long double) where BITS_PER_BYTE is 32. Unlike IEEE
+   floats, C4x floats are not rounded to be even. The C4x conversions
+   were contributed by m.hayes@elec.canterbury.ac.nz (Michael Hayes) and
+   Haj.Ten.Brugge@net.HCC.nl (Herman ten Brugge).
+
    If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
    then `long double' and `double' are both implemented, but they
    both mean DFmode.  In this case, the software floating-point
    support available here is activated by writing
       #define REAL_ARITHMETIC
-   in tm.h. 
+   in tm.h.
 
    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 to non-zero
+   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 <Richard.Earnshaw@cl.cam.ac.uk>,
@@ -96,7 +108,7 @@ netlib.att.com: netlib/cephes.   */
    These optional macros may be defined in tm.h.  In real.h, they
    default to WORDS_BIG_ENDIAN, etc., so there is no need to define
    them for any normal host or target machine on which the floats
-   and the integers have the same endian-ness.   */
+   and the integers have the same endian-ness.  */
 
 
 /* The following converts gcc macros into the ones used by this file.  */
@@ -201,6 +213,21 @@ unknown arithmetic type
 #endif
 #endif
 
+/* If no 16-bit type has been found and the compiler is GCC, try HImode.  */
+#if defined(__GNUC__) && EMUSHORT_SIZE != 16
+typedef int HItype __attribute__ ((mode (HI)));
+typedef unsigned int UHItype __attribute__ ((mode (HI)));
+#undef EMUSHORT
+#undef EMUSHORT_SIZE
+#undef EMULONG_SIZE
+#define EMUSHORT HItype
+#define UEMUSHORT UHItype
+#define EMUSHORT_SIZE 16
+#define EMULONG_SIZE 32
+#else
+#define UEMUSHORT unsigned EMUSHORT
+#endif
+
 #if HOST_BITS_PER_SHORT >= EMULONG_SIZE
 #define EMULONG short
 #else
@@ -234,20 +261,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 || \
+    ((INTEL_EXTENDED_IEEE_FORMAT != 0) && 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) bcopy ((char *) e, (char *) r, 2*NE)
-#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
@@ -256,41 +294,41 @@ unknown arithmetic type
 /* 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 ((UEMUSHORT *) (r), (e));                                \
+     else                                                              \
+       {                                                               \
+        UEMUSHORT 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), (UEMUSHORT *) (r));                                \
+     else                                                              \
+       {                                                               \
+        UEMUSHORT 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 */
 
 /* emulator uses host format */
-#define GET_REAL(r,e) e53toe ((unsigned EMUSHORT *) (r), (e))
-#define PUT_REAL(e,r) etoe53 ((e), (unsigned EMUSHORT *) (r))
+#define GET_REAL(r,e) e53toe ((UEMUSHORT *) (r), (e))
+#define PUT_REAL(e,r) etoe53 ((e), (UEMUSHORT *) (r))
 
 #endif /* not REAL_ARITHMETIC */
 #endif /* not TFmode */
@@ -317,145 +355,159 @@ 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[];
+extern UEMUSHORT ezero[], ehalf[], eone[], etwo[];
+extern UEMUSHORT elog2[], esqrt2[];
 
-static void endian     PROTO((unsigned EMUSHORT *, long *,
+static void endian     PARAMS ((UEMUSHORT *, long *,
                               enum machine_mode));
-static void eclear     PROTO((unsigned EMUSHORT *));
-static void emov       PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
+static void eclear     PARAMS ((UEMUSHORT *));
+static void emov       PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #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 ((UEMUSHORT *));
+#endif
+static void eneg       PARAMS ((UEMUSHORT *));
+static int eisneg      PARAMS ((UEMUSHORT *));
+static int eisinf      PARAMS ((UEMUSHORT *));
+static int eisnan      PARAMS ((UEMUSHORT *));
+static void einfin     PARAMS ((UEMUSHORT *));
+#ifdef NANS
+static void enan       PARAMS ((UEMUSHORT *, int));
+static void einan      PARAMS ((UEMUSHORT *));
+static int eiisnan     PARAMS ((UEMUSHORT *));
+static int eiisneg     PARAMS ((UEMUSHORT *));
+static void make_nan   PARAMS ((UEMUSHORT *, int, enum machine_mode));
+#endif
+static void emovi      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void emovo      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void ecleaz     PARAMS ((UEMUSHORT *));
+static void ecleazs    PARAMS ((UEMUSHORT *));
+static void emovz      PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #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 *));\f
-static void esubm      PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
-static void m16m       PROTO((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 *,
-                              unsigned EMUSHORT *));
-static void eadd       PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
-                              unsigned EMUSHORT *));
-static void eadd1      PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
-                              unsigned EMUSHORT *));
-static void ediv       PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
-                              unsigned EMUSHORT *));
-static void emul       PROTO((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 eiinfin    PARAMS ((UEMUSHORT *));
+#endif
+#ifdef INFINITY
+static int eiisinf     PARAMS ((UEMUSHORT *));
+#endif
+static int ecmpm       PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void eshdn1     PARAMS ((UEMUSHORT *));
+static void eshup1     PARAMS ((UEMUSHORT *));
+static void eshdn8     PARAMS ((UEMUSHORT *));
+static void eshup8     PARAMS ((UEMUSHORT *));
+static void eshup6     PARAMS ((UEMUSHORT *));
+static void eshdn6     PARAMS ((UEMUSHORT *));
+static void eaddm      PARAMS ((UEMUSHORT *, UEMUSHORT *));\f
+static void esubm      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void m16m       PARAMS ((unsigned int, UEMUSHORT *, UEMUSHORT *));
+static int edivm       PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static int emulm       PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void emdnorm    PARAMS ((UEMUSHORT *, int, int, EMULONG, int));
+static void esub       PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
+static void eadd       PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
+static void eadd1      PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
+static void ediv       PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
+static void emul       PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
+static void e53toe     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void e64toe     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
+static void e113toe    PARAMS ((UEMUSHORT *, UEMUSHORT *));
+#endif
+static void e24toe     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etoe113    PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void toe113     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etoe64     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void toe64      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etoe53     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void toe53      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etoe24     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void toe24      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static int ecmp                PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #if 0
-static void eround     PROTO((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 *,
-                              unsigned EMUSHORT *));
-static void euifrac    PROTO((unsigned EMUSHORT *, unsigned HOST_WIDE_INT *,
-                              unsigned EMUSHORT *));
-static int eshift      PROTO((unsigned EMUSHORT *, int));
-static int enormlz     PROTO((unsigned EMUSHORT *));
+static void eround     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+#endif
+static void ltoe       PARAMS ((HOST_WIDE_INT *, UEMUSHORT *));
+static void ultoe      PARAMS ((unsigned HOST_WIDE_INT *, UEMUSHORT *));
+static void eifrac     PARAMS ((UEMUSHORT *, HOST_WIDE_INT *,
+                              UEMUSHORT *));
+static void euifrac    PARAMS ((UEMUSHORT *, unsigned HOST_WIDE_INT *,
+                              UEMUSHORT *));
+static int eshift      PARAMS ((UEMUSHORT *, int));
+static int enormlz     PARAMS ((UEMUSHORT *));
 #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 ((UEMUSHORT *, char *, int));
+static void e53toasc   PARAMS ((UEMUSHORT *, char *, int));
+static void e64toasc   PARAMS ((UEMUSHORT *, char *, int));
+static void e113toasc  PARAMS ((UEMUSHORT *, 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 ((UEMUSHORT *, char *, int));
+static void asctoe24   PARAMS ((const char *, UEMUSHORT *));
+static void asctoe53   PARAMS ((const char *, UEMUSHORT *));
+static void asctoe64   PARAMS ((const char *, UEMUSHORT *));
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
+static void asctoe113  PARAMS ((const char *, UEMUSHORT *));
+#endif
+static void asctoe     PARAMS ((const char *, UEMUSHORT *));
+static void asctoeg    PARAMS ((const char *, UEMUSHORT *, int));
+static void efloor     PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #if 0
-static void efrexp     PROTO((unsigned EMUSHORT *, int *,
-                              unsigned EMUSHORT *));
+static void efrexp     PARAMS ((UEMUSHORT *, int *,
+                              UEMUSHORT *));
 #endif
-static void eldexp     PROTO((unsigned EMUSHORT *, int, unsigned EMUSHORT *));
+static void eldexp     PARAMS ((UEMUSHORT *, int, UEMUSHORT *));
 #if 0
-static void eremain    PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
-                              unsigned EMUSHORT *));
+static void eremain    PARAMS ((UEMUSHORT *, UEMUSHORT *,
+                              UEMUSHORT *));
 #endif
-static void eiremain   PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
-static void mtherr     PROTO((char *, int));
+static void eiremain   PARAMS ((UEMUSHORT *, UEMUSHORT *));
+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 ((UEMUSHORT *, UEMUSHORT *));
+static void etodec     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void todec      PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #endif
 #ifdef IBM
-static void ibmtoe     PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void ibmtoe     PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               enum machine_mode));
-static void etoibm     PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void etoibm     PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               enum machine_mode));
-static void toibm      PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void toibm      PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               enum machine_mode));
 #endif
 #ifdef C4X
-static void c4xtoe     PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void c4xtoe     PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               enum machine_mode));
-static void etoc4x     PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void etoc4x     PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               enum machine_mode));
-static void toc4x      PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
+static void toc4x      PARAMS ((UEMUSHORT *, UEMUSHORT *,
                               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 ((UEMUSHORT *, UEMUSHORT *));
+static void ditoe      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etoudi     PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void etodi      PARAMS ((UEMUSHORT *, UEMUSHORT *));
+static void esqrt      PARAMS ((UEMUSHORT *, UEMUSHORT *));
 #endif
 \f
 /* Copy 32-bit numbers obtained from array containing 16-bit numbers,
    swapping ends if required, into output array of longs.  The
-   result is normally passed to fprintf by the ASM_OUTPUT_ macros.   */
+   result is normally passed to fprintf by the ASM_OUTPUT_ macros.  */
 
-static void 
+static void
 endian (e, x, mode)
-     unsigned EMUSHORT e[];
+     UEMUSHORT e[];
      long x[];
      enum machine_mode mode;
 {
@@ -466,11 +518,13 @@ endian (e, x, mode)
       switch (mode)
        {
        case TFmode:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
          /* 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.  */
@@ -508,11 +562,13 @@ endian (e, x, mode)
       switch (mode)
        {
        case TFmode:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
          /* 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.
@@ -550,14 +606,14 @@ endian (e, x, mode)
 
 /* This is the implementation of the REAL_ARITHMETIC macro.  */
 
-void 
+void
 earith (value, icode, r1, r2)
      REAL_VALUE_TYPE *value;
      int icode;
      REAL_VALUE_TYPE *r1;
      REAL_VALUE_TYPE *r2;
 {
-  unsigned EMUSHORT d1[NE], d2[NE], v[NE];
+  UEMUSHORT d1[NE], d2[NE], v[NE];
   enum tree_code code;
 
   GET_REAL (r1, d1);
@@ -629,11 +685,11 @@ PUT_REAL (v, value);
 /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT.
    implements REAL_VALUE_RNDZINT (x) (etrunci (x)).  */
 
-REAL_VALUE_TYPE 
+REAL_VALUE_TYPE
 etrunci (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT f[NE], g[NE];
+  UEMUSHORT f[NE], g[NE];
   REAL_VALUE_TYPE r;
   HOST_WIDE_INT l;
 
@@ -652,11 +708,11 @@ etrunci (x)
 /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT;
    implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)).  */
 
-REAL_VALUE_TYPE 
+REAL_VALUE_TYPE
 etruncui (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT f[NE], g[NE];
+  UEMUSHORT f[NE], g[NE];
   REAL_VALUE_TYPE r;
   unsigned HOST_WIDE_INT l;
 
@@ -672,21 +728,30 @@ etruncui (x)
 }
 
 
-/* This is the REAL_VALUE_ATOF function.  It converts a decimal string to
-   binary, rounding off as indicated by the machine_mode argument.  Then it
-   promotes the rounded value to REAL_VALUE_TYPE.  */
+/* This is the REAL_VALUE_ATOF function.  It converts a decimal or hexadecimal
+   string to binary, rounding off as indicated by the machine_mode argument.
+   Then it promotes the rounded value to REAL_VALUE_TYPE.  */
 
-REAL_VALUE_TYPE 
+REAL_VALUE_TYPE
 ereal_atof (s, t)
-     char *s;
+     const char *s;
      enum machine_mode t;
 {
-  unsigned EMUSHORT tem[NE], e[NE];
+  UEMUSHORT tem[NE], e[NE];
   REAL_VALUE_TYPE r;
 
   switch (t)
     {
+#ifdef C4X
+    case QFmode:
+    case HFmode:
+      asctoe53 (s, tem);
+      e53toe (tem, e);
+      break;
+#else
     case HFmode:
+#endif
+
     case SFmode:
       asctoe24 (s, tem);
       e24toe (tem, e);
@@ -697,15 +762,18 @@ ereal_atof (s, t)
       e53toe (tem, e);
       break;
 
-    case XFmode:
-      asctoe64 (s, tem);
-      e64toe (tem, e);
-      break;
-
     case TFmode:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
       asctoe113 (s, tem);
       e113toe (tem, e);
       break;
+#endif
+      /* FALLTHRU */
+
+    case XFmode:
+      asctoe64 (s, tem);
+      e64toe (tem, e);
+      break;
 
     default:
       asctoe (s, e);
@@ -717,11 +785,11 @@ ereal_atof (s, t)
 
 /* Expansion of REAL_NEGATE.  */
 
-REAL_VALUE_TYPE 
+REAL_VALUE_TYPE
 ereal_negate (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
   REAL_VALUE_TYPE r;
 
   GET_REAL (&x, e);
@@ -738,7 +806,7 @@ HOST_WIDE_INT
 efixi (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT f[NE], g[NE];
+  UEMUSHORT f[NE], g[NE];
   HOST_WIDE_INT l;
 
   GET_REAL (&x, f);
@@ -761,7 +829,7 @@ unsigned HOST_WIDE_INT
 efixui (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT f[NE], g[NE];
+  UEMUSHORT f[NE], g[NE];
   unsigned HOST_WIDE_INT l;
 
   GET_REAL (&x, f);
@@ -779,13 +847,13 @@ efixui (x)
 
 /* REAL_VALUE_FROM_INT macro.  */
 
-void 
+void
 ereal_from_int (d, i, j, mode)
      REAL_VALUE_TYPE *d;
      HOST_WIDE_INT i, j;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT df[NE], dg[NE];
+  UEMUSHORT df[NE], dg[NE];
   HOST_WIDE_INT low, high;
   int sign;
 
@@ -832,8 +900,13 @@ ereal_from_int (d, i, j, mode)
       break;
 
     case 128:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
       etoe113 (dg, df);
       e113toe (df, dg);
+#else
+      etoe64 (dg, df);
+      e64toe (df, dg);
+#endif
       break;
 
     default:
@@ -844,15 +917,15 @@ ereal_from_int (d, i, j, mode)
 }
 
 
-/* REAL_VALUE_FROM_UNSIGNED_INT macro.   */
+/* REAL_VALUE_FROM_UNSIGNED_INT macro.  */
 
-void 
+void
 ereal_from_uint (d, i, j, mode)
      REAL_VALUE_TYPE *d;
      unsigned HOST_WIDE_INT i, j;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT df[NE], dg[NE];
+  UEMUSHORT df[NE], dg[NE];
   unsigned HOST_WIDE_INT low, high;
 
   if (GET_MODE_CLASS (mode) != MODE_FLOAT)
@@ -886,8 +959,13 @@ ereal_from_uint (d, i, j, mode)
       break;
 
     case 128:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
       etoe113 (dg, df);
       e113toe (df, dg);
+#else
+      etoe64 (dg, df);
+      e64toe (df, dg);
+#endif
       break;
 
     default:
@@ -900,12 +978,12 @@ ereal_from_uint (d, i, j, mode)
 
 /* REAL_VALUE_TO_INT macro.  */
 
-void 
+void
 ereal_to_int (low, high, rr)
      HOST_WIDE_INT *low, *high;
      REAL_VALUE_TYPE rr;
 {
-  unsigned EMUSHORT d[NE], df[NE], dg[NE], dh[NE];
+  UEMUSHORT d[NE], df[NE], dg[NE], dh[NE];
   int s;
 
   GET_REAL (&rr, d);
@@ -949,7 +1027,7 @@ ereal_ldexp (x, n)
      REAL_VALUE_TYPE x;
      int n;
 {
-  unsigned EMUSHORT e[NE], y[NE];
+  UEMUSHORT e[NE], y[NE];
   REAL_VALUE_TYPE r;
 
   GET_REAL (&x, e);
@@ -971,11 +1049,11 @@ ereal_ldexp (x, n)
 
 int
 target_isinf (x)
-     REAL_VALUE_TYPE x;
+     REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
 {
-  unsigned EMUSHORT e[NE];
-
 #ifdef INFINITY
+  UEMUSHORT e[NE];
+
   GET_REAL (&x, e);
   return (eisinf (e));
 #else
@@ -987,11 +1065,11 @@ target_isinf (x)
 
 int
 target_isnan (x)
-     REAL_VALUE_TYPE x;
+     REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
 {
-  unsigned EMUSHORT e[NE];
-
 #ifdef NANS
+  UEMUSHORT e[NE];
+
   GET_REAL (&x, e);
   return (eisnan (e));
 #else
@@ -1018,7 +1096,7 @@ real_value_truncate (mode, arg)
      enum machine_mode mode;
      REAL_VALUE_TYPE arg;
 {
-  unsigned EMUSHORT e[NE], t[NE];
+  UEMUSHORT e[NE], t[NE];
   REAL_VALUE_TYPE r;
 
   GET_REAL (&arg, e);
@@ -1030,9 +1108,12 @@ real_value_truncate (mode, arg)
   switch (mode)
     {
     case TFmode:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
       etoe113 (e, t);
       e113toe (t, t);
       break;
+#endif
+      /* FALLTHRU */
 
     case XFmode:
       etoe64 (e, t);
@@ -1045,11 +1126,21 @@ real_value_truncate (mode, arg)
       break;
 
     case SFmode:
+#ifndef C4X
     case HFmode:
+#endif
       etoe24 (e, t);
       e24toe (t, t);
       break;
 
+#ifdef C4X
+    case HFmode:
+    case QFmode:
+      etoe53 (e, t);
+      e53toe (t, t);
+      break;
+#endif
+
     case SImode:
       r = etrunci (arg);
       return (r);
@@ -1073,7 +1164,7 @@ exact_real_inverse (mode, r)
      enum machine_mode mode;
      REAL_VALUE_TYPE *r;
 {
-  unsigned EMUSHORT e[NE], einv[NE];
+  UEMUSHORT e[NE], einv[NE];
   REAL_VALUE_TYPE rinv;
   int i;
 
@@ -1140,15 +1231,15 @@ debug_real (r)
 
   REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr);
   fprintf (stderr, "%s", dstr);
-}  
+}
 
 \f
 /* The following routines convert REAL_VALUE_TYPE to the various floating
    point formats that are meaningful to supported computers.
 
-   The results are returned in 32-bit pieces, each piece stored in a `long'.  
+   The results are returned in 32-bit pieces, each piece stored in a `long'.
    This is so they can be printed by statements like
+
       fprintf (file, "%lx, %lx", L[0],  L[1]);
 
    that will work on both narrow- and wide-word host computers.  */
@@ -1157,12 +1248,12 @@ debug_real (r)
    contains four 32-bit pieces of the result, in the order they would appear
    in memory.  */
 
-void 
+void
 etartdouble (r, l)
      REAL_VALUE_TYPE r;
      long l[];
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
 
   GET_REAL (&r, e);
   etoe113 (e, e);
@@ -1173,12 +1264,12 @@ etartdouble (r, l)
    contains three 32-bit pieces of the result, in the order they would
    appear in memory.  */
 
-void 
+void
 etarldouble (r, l)
      REAL_VALUE_TYPE r;
      long l[];
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
 
   GET_REAL (&r, e);
   etoe64 (e, e);
@@ -1188,12 +1279,12 @@ etarldouble (r, l)
 /* Convert R to a double precision value.  The output array L contains two
    32-bit pieces of the result, in the order they would appear in memory.  */
 
-void 
+void
 etardouble (r, l)
      REAL_VALUE_TYPE r;
      long l[];
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
 
   GET_REAL (&r, e);
   etoe53 (e, e);
@@ -1207,7 +1298,7 @@ long
 etarsingle (r)
      REAL_VALUE_TYPE r;
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
   long l;
 
   GET_REAL (&r, e);
@@ -1226,20 +1317,20 @@ ereal_to_decimal (x, s)
      REAL_VALUE_TYPE x;
      char *s;
 {
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT e[NE];
 
   GET_REAL (&x, e);
   etoasc (e, s, 20);
 }
 
 /* Compare X and Y.  Return 1 if X > Y, 0 if X == Y, -1 if X < Y,
-   or -2 if either is a NaN.   */
+   or -2 if either is a NaN.  */
 
 int
 ereal_cmp (x, y)
      REAL_VALUE_TYPE x, y;
 {
-  unsigned EMUSHORT ex[NE], ey[NE];
+  UEMUSHORT ex[NE], ey[NE];
 
   GET_REAL (&x, ex);
   GET_REAL (&y, ey);
@@ -1252,7 +1343,7 @@ int
 ereal_isneg (x)
      REAL_VALUE_TYPE x;
 {
-  unsigned EMUSHORT ex[NE];
+  UEMUSHORT ex[NE];
 
   GET_REAL (&x, ex);
   return (eisneg (ex));
@@ -1286,11 +1377,11 @@ ereal_isneg (x)
                                 most significant word first,
                                 most significant bit is set)
   ei[NI-1]     low guard word  (0x8000 bit is rounding place)
+
+
+
                Routines for external format e-type numbers
+
        asctoe (string, e)      ASCII string to extended double e type
        asctoe64 (string, &d)   ASCII string to long double
        asctoe53 (string, &d)   ASCII string to double
@@ -1337,10 +1428,10 @@ ereal_isneg (x)
        eisinf (e)              1 if e has maximum exponent (non-IEEE)
                                or is infinite (IEEE)
         eisnan (e)              1 if e is a NaN
+
 
                Routines for internal format exploded e-type numbers
+
        eaddm (ai, bi)          add significands, bi = bi + ai
        ecleaz (ei)             ei = 0
        ecleazs (ei)            set ei = 0 but leave its sign alone
@@ -1372,13 +1463,13 @@ ereal_isneg (x)
   after each arithmetic operation.
 
   Exception flags are NOT fully supported.
+
   Signaling NaN's are NOT supported; they are treated the same
   as quiet NaN's.
+
   Define INFINITY for support of infinity; otherwise a
   saturation arithmetic is implemented.
+
   Define NANS for support of Not-a-Number items; otherwise the
   arithmetic will never produce a NaN output, and might be confused
   by a NaN input.
@@ -1386,7 +1477,7 @@ ereal_isneg (x)
   either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
   may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
   if in doubt.
+
   Denormals are always supported here where appropriate (e.g., not
   for conversion to DEC numbers).  */
 
@@ -1399,7 +1490,7 @@ ereal_isneg (x)
   mode, most floating point constants are given as arrays
   of octal integers to eliminate decimal to binary conversion
   errors that might be introduced by the compiler.
+
   For computers, such as IBM PC, that follow the IEEE
   Standard for Binary Floating Point Arithmetic (ANSI/IEEE
   Std 754-1985), the symbol IEEE should be defined.
@@ -1407,20 +1498,20 @@ ereal_isneg (x)
   are provided as arrays of hexadecimal 16 bit integers.
   The endian-ness of generated values is controlled by
   REAL_WORDS_BIG_ENDIAN.
+
   To accommodate other types of computer arithmetic, all
   constants are also provided in a normal decimal radix
   which one can hope are correctly converted to a suitable
   format by the available C language compiler.  To invoke
   this mode, the symbol UNK is defined.
+
   An important difference among these modes is a predefined
   set of machine arithmetic constants for each.  The numbers
   MACHEP (the machine roundoff error), MAXNUM (largest number
   represented), and several other parameters are preset by
   the configuration symbol.  Check the file const.c to
   ensure that these values are correct for your computer.
+
   For ANSI C compatibility, define ANSIC equal to 1.  Currently
   this affects only the atan2 function and others that use it.  */
 
@@ -1436,72 +1527,72 @@ 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 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
 /* 0.0 */
-unsigned EMUSHORT ezero[NE] =
+UEMUSHORT ezero[NE] =
  {0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
-extern unsigned EMUSHORT ezero[];
+extern UEMUSHORT ezero[];
 
 /* 5.0E-1 */
-unsigned EMUSHORT ehalf[NE] =
+UEMUSHORT ehalf[NE] =
  {0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
-extern unsigned EMUSHORT ehalf[];
+extern UEMUSHORT ehalf[];
 
 /* 1.0E0 */
-unsigned EMUSHORT eone[NE] =
+UEMUSHORT eone[NE] =
  {0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
-extern unsigned EMUSHORT eone[];
+extern UEMUSHORT eone[];
 
 /* 2.0E0 */
-unsigned EMUSHORT etwo[NE] =
+UEMUSHORT etwo[NE] =
  {0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
-extern unsigned EMUSHORT etwo[];
+extern UEMUSHORT etwo[];
 
 /* 3.2E1 */
-unsigned EMUSHORT e32[NE] =
+UEMUSHORT e32[NE] =
  {0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
-extern unsigned EMUSHORT e32[];
+extern UEMUSHORT e32[];
 
 /* 6.93147180559945309417232121458176568075500134360255E-1 */
-unsigned EMUSHORT elog2[NE] =
+UEMUSHORT elog2[NE] =
  {0x40f3, 0xf6af, 0x03f2, 0xb398,
   0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
-extern unsigned EMUSHORT elog2[];
+extern UEMUSHORT elog2[];
 
 /* 1.41421356237309504880168872420969807856967187537695E0 */
-unsigned EMUSHORT esqrt2[NE] =
+UEMUSHORT esqrt2[NE] =
  {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
   0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
-extern unsigned EMUSHORT esqrt2[];
+extern UEMUSHORT esqrt2[];
 
 /* 3.14159265358979323846264338327950288419716939937511E0 */
-unsigned EMUSHORT epi[NE] =
+UEMUSHORT epi[NE] =
  {0x2902, 0x1cd1, 0x80dc, 0x628b,
   0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
-extern unsigned EMUSHORT epi[];
+extern UEMUSHORT epi[];
 
 #else
 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
-unsigned EMUSHORT ezero[NE] =
+UEMUSHORT ezero[NE] =
  {0, 0000000, 0000000, 0000000, 0000000, 0000000,};
-unsigned EMUSHORT ehalf[NE] =
+UEMUSHORT ehalf[NE] =
  {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
-unsigned EMUSHORT eone[NE] =
+UEMUSHORT eone[NE] =
  {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
-unsigned EMUSHORT etwo[NE] =
+UEMUSHORT etwo[NE] =
  {0, 0000000, 0000000, 0000000, 0100000, 0040000,};
-unsigned EMUSHORT e32[NE] =
+UEMUSHORT e32[NE] =
  {0, 0000000, 0000000, 0000000, 0100000, 0040004,};
-unsigned EMUSHORT elog2[NE] =
+UEMUSHORT elog2[NE] =
  {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
-unsigned EMUSHORT esqrt2[NE] =
+UEMUSHORT esqrt2[NE] =
  {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
-unsigned EMUSHORT epi[NE] =
+UEMUSHORT epi[NE] =
  {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
 #endif
 
@@ -1513,11 +1604,11 @@ extern int rndprc;
 
 /*  Clear out entire e-type number X.  */
 
-static void 
+static void
 eclear (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
-  register int i;
+  int i;
 
   for (i = 0; i < NE; i++)
     *x++ = 0;
@@ -1525,11 +1616,11 @@ eclear (x)
 
 /* Move e-type number from A to B.  */
 
-static void 
+static void
 emov (a, b)
-     register unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register int i;
+  int i;
 
   for (i = 0; i < NE; i++)
     *b++ = *a++;
@@ -1539,20 +1630,20 @@ emov (a, b)
 #if 0
 /* Absolute value of e-type X.  */
 
-static void 
+static void
 eabs (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
   /* sign is top bit of last word of external format */
-  x[NE - 1] &= 0x7fff;         
+  x[NE - 1] &= 0x7fff;
 }
 #endif /* 0 */
 
 /* Negate the e-type number X.  */
 
-static void 
+static void
 eneg (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
   x[NE - 1] ^= 0x8000;         /* Toggle the sign bit */
@@ -1560,9 +1651,9 @@ eneg (x)
 
 /* Return 1 if sign bit of e-type number X is nonzero, else zero.  */
 
-static int 
+static int
 eisneg (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
   if (x[NE - 1] & 0x8000)
@@ -1573,9 +1664,9 @@ eisneg (x)
 
 /* Return 1 if e-type number X is infinity, else return zero.  */
 
-static int 
+static int
 eisinf (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
 #ifdef NANS
@@ -1591,9 +1682,9 @@ eisinf (x)
 /* Check if e-type number is not a number.  The bit pattern is one that we
    defined, so we know for sure how to detect it.  */
 
-static int 
+static int
 eisnan (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[] ATTRIBUTE_UNUSED;
 {
 #ifdef NANS
   int i;
@@ -1615,11 +1706,11 @@ eisnan (x)
 /*  Fill e-type number X with infinity pattern (IEEE)
     or largest possible number (non-IEEE).  */
 
-static void 
+static void
 einfin (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
-  register int i;
+  int i;
 
 #ifdef INFINITY
   for (i = 0; i < NE - 1; i++)
@@ -1658,26 +1749,28 @@ einfin (x)
    This generates Intel's quiet NaN pattern for extended real.
    The exponent is 7fff, the leading mantissa word is c000.  */
 
-static void 
+#ifdef NANS
+static void
 enan (x, sign)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
      int sign;
 {
-  register int i;
+  int i;
 
   for (i = 0; i < NE - 2; i++)
     *x++ = 0;
   *x++ = 0xc000;
   *x = (sign << 15) | 0x7fff;
 }
+#endif /* NANS */
 
 /* Move in an e-type number A, converting it to exploded e-type B.  */
 
-static void 
+static void
 emovi (a, b)
-     unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register unsigned EMUSHORT *p, *q;
+  UEMUSHORT *p, *q;
   int i;
 
   q = b;
@@ -1720,12 +1813,12 @@ emovi (a, b)
 
 /* Move out exploded e-type number A, converting it to e type B.  */
 
-static void 
+static void
 emovo (a, b)
-     unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register unsigned EMUSHORT *p, *q;
-  unsigned EMUSHORT i;
+  UEMUSHORT *p, *q;
+  UEMUSHORT i;
   int j;
 
   p = a;
@@ -1759,11 +1852,11 @@ emovo (a, b)
 
 /* Clear out exploded e-type number XI.  */
 
-static void 
+static void
 ecleaz (xi)
-     register unsigned EMUSHORT *xi;
+     UEMUSHORT *xi;
 {
-  register int i;
+  int i;
 
   for (i = 0; i < NI; i++)
     *xi++ = 0;
@@ -1771,11 +1864,11 @@ ecleaz (xi)
 
 /* Clear out exploded e-type XI, but don't touch the sign.  */
 
-static void 
+static void
 ecleazs (xi)
-     register unsigned EMUSHORT *xi;
+     UEMUSHORT *xi;
 {
-  register int i;
+  int i;
 
   ++xi;
   for (i = 0; i < NI - 1; i++)
@@ -1784,11 +1877,11 @@ ecleazs (xi)
 
 /* Move exploded e-type number from A to B.  */
 
-static void 
+static void
 emovz (a, b)
-     register unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register int i;
+  int i;
 
   for (i = 0; i < NI - 1; i++)
     *b++ = *a++;
@@ -1800,21 +1893,24 @@ 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[];
+     UEMUSHORT x[];
 {
 
   ecleaz (x);
   x[E] = 0x7fff;
   x[M + 1] = 0xc000;
 }
+#endif /* NANS */
 
 /* Return nonzero if exploded e-type X is a NaN.  */
 
-static int 
+#ifdef NANS
+static int
 eiisnan (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
   int i;
 
@@ -1828,16 +1924,19 @@ eiisnan (x)
     }
   return (0);
 }
+#endif /* NANS */
 
 /* Return nonzero if sign of exploded e-type X is nonzero.  */
 
-static int 
+#ifdef NANS
+static int
 eiisneg (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
   return x[0] != 0;
 }
+#endif /* NANS */
 
 #if 0
 /* Fill exploded e-type X with infinity pattern.
@@ -1845,7 +1944,7 @@ eiisneg (x)
 
 static void
 eiinfin (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
   ecleaz (x);
@@ -1855,9 +1954,10 @@ eiinfin (x)
 
 /* Return nonzero if exploded e-type X is infinite.  */
 
-static int 
+#ifdef INFINITY
+static int
 eiisinf (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
 
 #ifdef NANS
@@ -1868,7 +1968,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.
@@ -1879,7 +1979,7 @@ eiisinf (x)
 
 static int
 ecmpm (a, b)
-     register unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
   int i;
 
@@ -1901,11 +2001,11 @@ ecmpm (a, b)
 
 /* Shift significand of exploded e-type X down by 1 bit.  */
 
-static void 
+static void
 eshdn1 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
-  register unsigned EMUSHORT bits;
+  UEMUSHORT bits;
   int i;
 
   x += M;                      /* point to significand area */
@@ -1925,11 +2025,11 @@ eshdn1 (x)
 
 /* Shift significand of exploded e-type X up by 1 bit.  */
 
-static void 
+static void
 eshup1 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
-  register unsigned EMUSHORT bits;
+  UEMUSHORT bits;
   int i;
 
   x += NI - 1;
@@ -1950,11 +2050,11 @@ eshup1 (x)
 
 /* Shift significand of exploded e-type X down by 8 bits.  */
 
-static void 
+static void
 eshdn8 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
-  register unsigned EMUSHORT newbyt, oldbyt;
+  UEMUSHORT newbyt, oldbyt;
   int i;
 
   x += M;
@@ -1971,12 +2071,12 @@ eshdn8 (x)
 
 /* Shift significand of exploded e-type X up by 8 bits.  */
 
-static void 
+static void
 eshup8 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
   int i;
-  register unsigned EMUSHORT newbyt, oldbyt;
+  UEMUSHORT newbyt, oldbyt;
 
   x += NI - 1;
   oldbyt = 0;
@@ -1993,12 +2093,12 @@ eshup8 (x)
 
 /* Shift significand of exploded e-type X up by 16 bits.  */
 
-static void 
+static void
 eshup6 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
   int i;
-  register unsigned EMUSHORT *p;
+  UEMUSHORT *p;
 
   p = x + M;
   x += M + 1;
@@ -2011,12 +2111,12 @@ eshup6 (x)
 
 /* Shift significand of exploded e-type X down by 16 bits.  */
 
-static void 
+static void
 eshdn6 (x)
-     register unsigned EMUSHORT *x;
+     UEMUSHORT *x;
 {
   int i;
-  register unsigned EMUSHORT *p;
+  UEMUSHORT *p;
 
   x += NI - 1;
   p = x + 1;
@@ -2029,11 +2129,11 @@ eshdn6 (x)
 
 /* Add significands of exploded e-type X and Y.  X + Y replaces Y.  */
 
-static void 
+static void
 eaddm (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
-  register unsigned EMULONG a;
+  unsigned EMULONG a;
   int i;
   unsigned int carry;
 
@@ -2047,7 +2147,7 @@ eaddm (x, y)
        carry = 1;
       else
        carry = 0;
-      *y = (unsigned EMUSHORT) a;
+      *y = (UEMUSHORT) a;
       --x;
       --y;
     }
@@ -2055,9 +2155,9 @@ eaddm (x, y)
 
 /* Subtract significands of exploded e-type X and Y.  Y - X replaces Y.  */
 
-static void 
+static void
 esubm (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   unsigned EMULONG a;
   int i;
@@ -2073,14 +2173,14 @@ esubm (x, y)
        carry = 1;
       else
        carry = 0;
-      *y = (unsigned EMUSHORT) a;
+      *y = (UEMUSHORT) a;
       --x;
       --y;
     }
 }
 
 
-static unsigned EMUSHORT equot[NI];
+static UEMUSHORT equot[NI];
 
 
 #if 0
@@ -2089,13 +2189,13 @@ static unsigned EMUSHORT equot[NI];
 
 /* Divide significands */
 
-int 
+int
 edivm (den, num)
-     unsigned EMUSHORT den[], num[];
+     UEMUSHORT den[], num[];
 {
   int i;
-  register unsigned EMUSHORT *p, *q;
-  unsigned EMUSHORT j;
+  UEMUSHORT *p, *q;
+  UEMUSHORT j;
 
   p = &equot[0];
   *p++ = num[0];
@@ -2187,11 +2287,11 @@ edivm (den, num)
 
 /* Multiply significands */
 
-int 
+int
 emulm (a, b)
-     unsigned EMUSHORT a[], b[];
+     UEMUSHORT a[], b[];
 {
-  unsigned EMUSHORT *p, *q;
+  UEMUSHORT *p, *q;
   int i, j, k;
 
   equot[0] = b[0];
@@ -2242,12 +2342,12 @@ emulm (a, b)
 static void
 m16m (a, b, c)
      unsigned int a;
-     unsigned EMUSHORT b[], c[];
+     UEMUSHORT b[], c[];
 {
-  register unsigned EMUSHORT *pp;
-  register unsigned EMULONG carry;
-  unsigned EMUSHORT *ps;
-  unsigned EMUSHORT p[NI];
+  UEMUSHORT *pp;
+  unsigned EMULONG carry;
+  UEMUSHORT *ps;
+  UEMUSHORT p[NI];
   unsigned EMULONG aa, m;
   int i;
 
@@ -2269,9 +2369,9 @@ m16m (a, b, c)
        {
          m = (unsigned EMULONG) aa * *ps--;
          carry = (m & 0xffff) + *pp;
-         *pp-- = (unsigned EMUSHORT)carry;
+         *pp-- = (UEMUSHORT)carry;
          carry = (carry >> 16) + (m >> 16) + *pp;
-         *pp = (unsigned EMUSHORT)carry;
+         *pp = (UEMUSHORT)carry;
          *(pp-1) = carry >> 16;
        }
     }
@@ -2285,13 +2385,13 @@ m16m (a, b, c)
 
 static int
 edivm (den, num)
-     unsigned EMUSHORT den[], num[];
+     UEMUSHORT den[], num[];
 {
   int i;
-  register unsigned EMUSHORT *p;
+  UEMUSHORT *p;
   unsigned EMULONG tnum;
-  unsigned EMUSHORT j, tdenm, tquot;
-  unsigned EMUSHORT tprod[NI+1];
+  UEMUSHORT j, tdenm, tquot;
+  UEMUSHORT tprod[NI+1];
 
   p = &equot[0];
   *p++ = num[0];
@@ -2309,7 +2409,7 @@ edivm (den, num)
       tnum = (((unsigned EMULONG) num[M]) << 16) + num[M+1];
 
       /* Do not execute the divide instruction if it will overflow.  */
-      if ((tdenm * 0xffffL) < tnum)
+      if ((tdenm * (unsigned long)0xffff) < tnum)
        tquot = 0xffff;
       else
        tquot = tnum / tdenm;
@@ -2350,11 +2450,11 @@ edivm (den, num)
 
 static int
 emulm (a, b)
-     unsigned EMUSHORT a[], b[];
+     UEMUSHORT a[], b[];
 {
-  unsigned EMUSHORT *p, *q;
-  unsigned EMUSHORT pprod[NI];
-  unsigned EMUSHORT j;
+  UEMUSHORT *p, *q;
+  UEMUSHORT pprod[NI];
+  UEMUSHORT j;
   int i;
 
   equot[0] = b[0];
@@ -2393,15 +2493,15 @@ emulm (a, b)
 
   The internal format number to be rounded is S.
   Input LOST is 0 if the value is exact.  This is the so-called sticky bit.
+
   Input SUBFLG indicates whether the number was obtained
   by a subtraction operation.  In that case if LOST is nonzero
   then the number is slightly smaller than indicated.
+
   Input EXP is the biased exponent, which may be negative.
   the exponent field of S is ignored but is replaced by
   EXP as adjusted by normalization and rounding.
+
   Input RCNTRL is the rounding control.  If it is nonzero, the
   returned value will be rounded to RNDPRC bits.
 
@@ -2410,30 +2510,30 @@ emulm (a, b)
    adjusted to be the actual value it would have after conversion to
    the final floating point type.  This adjustment has been
    implemented for all type conversions (etoe53, etc.) and decimal
-   conversions, but not for the arithmetic functions (eadd, etc.). 
+   conversions, but not for the arithmetic functions (eadd, etc.).
    Data types having standard 15-bit exponents are not affected by
    this, but SFmode and DFmode are affected. For example, ediv with
    rndprc = 24 will not round correctly to 24-bit precision if the
-   result is denormal.   */
+   result is denormal.  */
 
 static int rlast = -1;
 static int rw = 0;
-static unsigned EMUSHORT rmsk = 0;
-static unsigned EMUSHORT rmbit = 0;
-static unsigned EMUSHORT rebit = 0;
+static UEMUSHORT rmsk = 0;
+static UEMUSHORT rmbit = 0;
+static UEMUSHORT rebit = 0;
 static int re = 0;
-static unsigned EMUSHORT rbit[NI];
+static UEMUSHORT rbit[NI];
 
-static void 
+static void
 emdnorm (s, lost, subflg, exp, rcntrl)
-     unsigned EMUSHORT s[];
+     UEMUSHORT s[];
      int lost;
      int subflg;
      EMULONG exp;
      int rcntrl;
 {
   int i, j;
-  unsigned EMUSHORT r;
+  UEMUSHORT r;
 
   /* Normalize */
   j = enormlz (s);
@@ -2570,6 +2670,7 @@ emdnorm (s, lost, subflg, exp, rcntrl)
   s[rw] &= ~rmsk;
   if ((r & rmbit) != 0)
     {
+#ifndef C4X
       if (r == rmbit)
        {
          if (lost == 0)
@@ -2583,6 +2684,7 @@ emdnorm (s, lost, subflg, exp, rcntrl)
                goto mddone;
            }
        }
+#endif
       eaddm (rbit, s);
     }
  mddone:
@@ -2631,16 +2733,16 @@ emdnorm (s, lost, subflg, exp, rcntrl)
   if (exp < 0)
     s[1] = 0;
   else
-    s[1] = (unsigned EMUSHORT) exp;
+    s[1] = (UEMUSHORT) exp;
 }
 
 /*  Subtract.  C = B - A, all e type numbers.  */
 
 static int subflg = 0;
 
-static void 
+static void
 esub (a, b, c)
-     unsigned EMUSHORT *a, *b, *c;
+     UEMUSHORT *a, *b, *c;
 {
 
 #ifdef NANS
@@ -2670,9 +2772,9 @@ esub (a, b, c)
 
 /* Add.  C = A + B, all e type.  */
 
-static void 
+static void
 eadd (a, b, c)
-     unsigned EMUSHORT *a, *b, *c;
+     UEMUSHORT *a, *b, *c;
 {
 
 #ifdef NANS
@@ -2703,11 +2805,11 @@ eadd (a, b, c)
 
 /* Arithmetic common to both addition and subtraction.  */
 
-static void 
+static void
 eadd1 (a, b, c)
-     unsigned EMUSHORT *a, *b, *c;
+     UEMUSHORT *a, *b, *c;
 {
-  unsigned EMUSHORT ai[NI], bi[NI], ci[NI];
+  UEMUSHORT ai[NI], bi[NI], ci[NI];
   int i, lost, j, k;
   EMULONG lt, lta, ltb;
 
@@ -2786,7 +2888,7 @@ eadd1 (a, b, c)
                  break;
                }
            }
-         bi[E] = (unsigned EMUSHORT) ltb;
+         bi[E] = (UEMUSHORT) ltb;
          goto done;
        }
       if (i > 0)
@@ -2814,11 +2916,11 @@ eadd1 (a, b, c)
 
 /* Divide: C = B/A, all e type.  */
 
-static void 
+static void
 ediv (a, b, c)
-     unsigned EMUSHORT *a, *b, *c;
+     UEMUSHORT *a, *b, *c;
 {
-  unsigned EMUSHORT ai[NI], bi[NI];
+  UEMUSHORT ai[NI], bi[NI];
   int i, sign;
   EMULONG lt, lta, ltb;
 
@@ -2916,13 +3018,13 @@ ediv (a, b, c)
      *(c+(NE-1)) &= ~0x8000;
 }
 
-/* Multiply e-types A and B, return e-type product C.   */
+/* Multiply e-types A and B, return e-type product C.  */
 
-static void 
+static void
 emul (a, b, c)
-     unsigned EMUSHORT *a, *b, *c;
+     UEMUSHORT *a, *b, *c;
 {
-  unsigned EMUSHORT ai[NI], bi[NI];
+  UEMUSHORT ai[NI], bi[NI];
   int i, j, sign;
   EMULONG lt, lta, ltb;
 
@@ -3016,7 +3118,7 @@ emul (a, b, c)
 
 static void
 e53toe (pe, y)
-     unsigned EMUSHORT *pe, *y;
+     UEMUSHORT *pe, *y;
 {
 #ifdef DEC
 
@@ -3033,9 +3135,9 @@ e53toe (pe, y)
   c4xtoe (pe, y, HFmode);
 
 #else
-  register unsigned EMUSHORT r;
-  register unsigned EMUSHORT *e, *p;
-  unsigned EMUSHORT yy[NI];
+  UEMUSHORT r;
+  UEMUSHORT *e, *p;
+  UEMUSHORT yy[NI];
   int denorm, k;
 
   e = pe;
@@ -3108,12 +3210,12 @@ e53toe (pe, y)
 #endif
   eshift (yy, -5);
   if (denorm)
-    {                  
+    {
        /* If zero exponent, then normalize the significand.  */
       if ((k = enormlz (yy)) > NBITS)
        ecleazs (yy);
       else
-       yy[E] -= (unsigned EMUSHORT) (k - 1);
+       yy[E] -= (UEMUSHORT) (k - 1);
     }
   emovo (yy, y);
 #endif /* not C4X */
@@ -3123,12 +3225,12 @@ e53toe (pe, y)
 
 /* Convert double extended precision float PE to e type Y.  */
 
-static void 
+static void
 e64toe (pe, y)
-     unsigned EMUSHORT *pe, *y;
+     UEMUSHORT *pe, *y;
 {
-  unsigned EMUSHORT yy[NI];
-  unsigned EMUSHORT *e, *p, *q;
+  UEMUSHORT yy[NI];
+  UEMUSHORT *e, *p, *q;
   int i;
 
   e = pe;
@@ -3158,7 +3260,7 @@ e64toe (pe, y)
         is "pseudodenormal" when the exponent is zero.  */
       if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0)
        {
-         unsigned EMUSHORT temp[NI];
+         UEMUSHORT temp[NI];
 
          emovi(yy, temp);
          eshup1(temp);
@@ -3243,15 +3345,16 @@ bigend_nan:
     *q++ = *p++;
 }
 
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
 /* Convert 128-bit long double precision float PE to e type Y.  */
 
-static void 
+static void
 e113toe (pe, y)
-     unsigned EMUSHORT *pe, *y;
+     UEMUSHORT *pe, *y;
 {
-  register unsigned EMUSHORT r;
-  unsigned EMUSHORT *e, *p;
-  unsigned EMUSHORT yy[NI];
+  UEMUSHORT r;
+  UEMUSHORT *e, *p;
+  UEMUSHORT yy[NI];
   int denorm, i;
 
   e = pe;
@@ -3327,12 +3430,13 @@ e113toe (pe, y)
     }
   emovo (yy, y);
 }
+#endif
 
 /* Convert single precision float PE to e type Y.  */
 
-static void 
+static void
 e24toe (pe, y)
-     unsigned EMUSHORT *pe, *y;
+     UEMUSHORT *pe, *y;
 {
 #ifdef IBM
 
@@ -3346,9 +3450,9 @@ e24toe (pe, y)
 
 #else
 
-  register unsigned EMUSHORT r;
-  register unsigned EMUSHORT *e, *p;
-  unsigned EMUSHORT yy[NI];
+  UEMUSHORT r;
+  UEMUSHORT *e, *p;
+  UEMUSHORT yy[NI];
   int denorm, k;
 
   e = pe;
@@ -3424,7 +3528,7 @@ e24toe (pe, y)
       if ((k = enormlz (yy)) > NBITS)
        ecleazs (yy);
       else
-       yy[E] -= (unsigned EMUSHORT) (k - 1);
+       yy[E] -= (UEMUSHORT) (k - 1);
     }
   emovo (yy, y);
 #endif /* not C4X */
@@ -3433,11 +3537,11 @@ e24toe (pe, y)
 
 /* Convert e-type X to IEEE 128-bit long double format E.  */
 
-static void 
+static void
 etoe113 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
@@ -3459,19 +3563,21 @@ etoe113 (x, e)
   rndprc = 113;
   emdnorm (xi, 0, 0, exp, 64);
   rndprc = rndsav;
+#ifdef INFINITY
  nonorm:
+#endif
   toe113 (xi, e);
 }
 
 /* Convert exploded e-type X, that has already been rounded to
    113-bit precision, to IEEE 128-bit long double format Y.  */
 
-static void 
+static void
 toe113 (a, b)
-     unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register unsigned EMUSHORT *p, *q;
-  unsigned EMUSHORT i;
+  UEMUSHORT *p, *q;
+  UEMUSHORT i;
 
 #ifdef NANS
   if (eiisnan (a))
@@ -3524,11 +3630,11 @@ toe113 (a, b)
 
 /* Convert e-type X to IEEE double extended format E.  */
 
-static void 
+static void
 etoe64 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
@@ -3551,19 +3657,21 @@ etoe64 (x, e)
   rndprc = 64;
   emdnorm (xi, 0, 0, exp, 64);
   rndprc = rndsav;
+#ifdef INFINITY
  nonorm:
+#endif
   toe64 (xi, e);
 }
 
 /* Convert exploded e-type X, that has already been rounded to
    64-bit precision, to IEEE double extended format Y.  */
 
-static void 
+static void
 toe64 (a, b)
-     unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  register unsigned EMUSHORT *p, *q;
-  unsigned EMUSHORT i;
+  UEMUSHORT *p, *q;
+  UEMUSHORT i;
 
 #ifdef NANS
   if (eiisnan (a))
@@ -3588,10 +3696,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
 
@@ -3674,9 +3783,9 @@ toe64 (a, b)
 #ifdef DEC
 /* Convert e-type X to DEC-format double E.  */
 
-static void 
+static void
 etoe53 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   etodec (x, e);               /* see etodec.c */
 }
@@ -3684,9 +3793,9 @@ etoe53 (x, e)
 /* Convert exploded e-type X, that has already been rounded to
    56-bit double precision, to DEC double Y.  */
 
-static void 
+static void
 toe53 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   todec (x, y);
 }
@@ -3695,9 +3804,9 @@ toe53 (x, y)
 #ifdef IBM
 /* Convert e-type X to IBM 370-format double E.  */
 
-static void 
+static void
 etoe53 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   etoibm (x, e, DFmode);
 }
@@ -3705,20 +3814,20 @@ etoe53 (x, e)
 /* Convert exploded e-type X, that has already been rounded to
    56-bit precision, to IBM 370 double Y.  */
 
-static void 
+static void
 toe53 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   toibm (x, y, DFmode);
 }
 
 #else /* it's neither DEC nor IBM */
 #ifdef C4X
-/* Convert e-type X to C4X-format double E.  */
+/* Convert e-type X to C4X-format long double E.  */
 
-static void 
+static void
 etoe53 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   etoc4x (x, e, HFmode);
 }
@@ -3726,9 +3835,9 @@ etoe53 (x, e)
 /* Convert exploded e-type X, that has already been rounded to
    56-bit precision, to IBM 370 double Y.  */
 
-static void 
+static void
 toe53 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   toc4x (x, y, HFmode);
 }
@@ -3737,11 +3846,11 @@ toe53 (x, y)
 
 /* Convert e-type X to IEEE double E.  */
 
-static void 
+static void
 etoe53 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
@@ -3764,19 +3873,21 @@ etoe53 (x, e)
   rndprc = 53;
   emdnorm (xi, 0, 0, exp, 64);
   rndprc = rndsav;
+#ifdef INFINITY
  nonorm:
+#endif
   toe53 (xi, e);
 }
 
 /* Convert exploded e-type X, that has already been rounded to
    53-bit precision, to IEEE double Y.  */
 
-static void 
+static void
 toe53 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
-  unsigned EMUSHORT i;
-  unsigned EMUSHORT *p;
+  UEMUSHORT i;
+  UEMUSHORT *p;
 
 #ifdef NANS
   if (eiisnan (x))
@@ -3814,7 +3925,7 @@ toe53 (x, y)
          *y++ = 0;
        }
 #else
-      *y |= (unsigned EMUSHORT) 0x7fef;
+      *y |= (UEMUSHORT) 0x7fef;
       if (! REAL_WORDS_BIG_ENDIAN)
        {
          *(--y) = 0xffff;
@@ -3840,8 +3951,8 @@ toe53 (x, y)
       i <<= 4;
       eshift (x, 5);
     }
-  i |= *p++ & (unsigned EMUSHORT) 0x0f;        /* *p = xi[M] */
-  *y |= (unsigned EMUSHORT) i; /* high order output already has sign bit set */
+  i |= *p++ & (UEMUSHORT) 0x0f;        /* *p = xi[M] */
+  *y |= (UEMUSHORT) i; /* high order output already has sign bit set */
   if (! REAL_WORDS_BIG_ENDIAN)
     {
       *(--y) = *p++;
@@ -3868,9 +3979,9 @@ toe53 (x, y)
 #ifdef IBM
 /* Convert e-type X to IBM 370 float E.  */
 
-static void 
+static void
 etoe24 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   etoibm (x, e, SFmode);
 }
@@ -3878,9 +3989,9 @@ etoe24 (x, e)
 /* Convert exploded e-type X, that has already been rounded to
    float precision, to IBM 370 float Y.  */
 
-static void 
+static void
 toe24 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   toibm (x, y, SFmode);
 }
@@ -3890,9 +4001,9 @@ toe24 (x, y)
 #ifdef C4X
 /* Convert e-type X to C4X float E.  */
 
-static void 
+static void
 etoe24 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   etoc4x (x, e, QFmode);
 }
@@ -3900,9 +4011,9 @@ etoe24 (x, e)
 /* Convert exploded e-type X, that has already been rounded to
    float precision, to IBM 370 float Y.  */
 
-static void 
+static void
 toe24 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   toc4x (x, y, QFmode);
 }
@@ -3911,12 +4022,12 @@ toe24 (x, y)
 
 /* Convert e-type X to IEEE float E.  DEC float is the same as IEEE float.  */
 
-static void 
+static void
 etoe24 (x, e)
-     unsigned EMUSHORT *x, *e;
+     UEMUSHORT *x, *e;
 {
   EMULONG exp;
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   int rndsav;
 
 #ifdef NANS
@@ -3938,19 +4049,21 @@ etoe24 (x, e)
   rndprc = 24;
   emdnorm (xi, 0, 0, exp, 64);
   rndprc = rndsav;
+#ifdef INFINITY
  nonorm:
+#endif
   toe24 (xi, e);
 }
 
 /* Convert exploded e-type X, that has already been rounded to
    float precision, to IEEE float Y.  */
 
-static void 
+static void
 toe24 (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
-  unsigned EMUSHORT i;
-  unsigned EMUSHORT *p;
+  UEMUSHORT i;
+  UEMUSHORT *p;
 
 #ifdef NANS
   if (eiisnan (x))
@@ -3976,7 +4089,7 @@ toe24 (x, y)
   if (i >= 255)
     {
 #ifdef INFINITY
-      *y |= (unsigned EMUSHORT) 0x7f80;
+      *y |= (UEMUSHORT) 0x7f80;
 #ifdef DEC
       *(--y) = 0;
 #endif
@@ -3990,7 +4103,7 @@ toe24 (x, y)
        }
 #endif
 #else  /* no INFINITY */
-      *y |= (unsigned EMUSHORT) 0x7f7f;
+      *y |= (UEMUSHORT) 0x7f7f;
 #ifdef DEC
       *(--y) = 0xffff;
 #endif
@@ -4018,7 +4131,7 @@ toe24 (x, y)
       i <<= 7;
       eshift (x, 8);
     }
-  i |= *p++ & (unsigned EMUSHORT) 0x7f;        /* *p = xi[M] */
+  i |= *p++ & (UEMUSHORT) 0x7f;        /* *p = xi[M] */
   /* High order output already has sign bit set.  */
   *y |= i;
 #ifdef DEC
@@ -4037,19 +4150,19 @@ toe24 (x, y)
 #endif  /* not C4X */
 #endif  /* not IBM */
 
-/* Compare two e type numbers. 
+/* Compare two e type numbers.
    Return +1 if a > b
            0 if a == b
           -1 if a < b
           -2 if either a or b is a NaN.  */
 
-static int 
+static int
 ecmp (a, b)
-     unsigned EMUSHORT *a, *b;
+     UEMUSHORT *a, *b;
 {
-  unsigned EMUSHORT ai[NI], bi[NI];
-  register unsigned EMUSHORT *p, *q;
-  register int i;
+  UEMUSHORT ai[NI], bi[NI];
+  UEMUSHORT *p, *q;
+  int i;
   int msign;
 
 #ifdef NANS
@@ -4106,9 +4219,9 @@ ecmp (a, b)
 #if 0
 /* Find e-type nearest integer to X, as floor (X + 0.5).  */
 
-static void 
+static void
 eround (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
   eadd (ehalf, x, y);
   efloor (y, y);
@@ -4117,12 +4230,12 @@ eround (x, y)
 
 /* Convert HOST_WIDE_INT LP to e type Y.  */
 
-static void 
+static void
 ltoe (lp, y)
      HOST_WIDE_INT *lp;
-     unsigned EMUSHORT *y;
+     UEMUSHORT *y;
 {
-  unsigned EMUSHORT yi[NI];
+  UEMUSHORT yi[NI];
   unsigned HOST_WIDE_INT ll;
   int k;
 
@@ -4139,32 +4252,32 @@ ltoe (lp, y)
     }
   /* move the long integer to yi significand area */
 #if HOST_BITS_PER_WIDE_INT == 64
-  yi[M] = (unsigned EMUSHORT) (ll >> 48);
-  yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
-  yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
-  yi[M + 3] = (unsigned EMUSHORT) ll;
+  yi[M] = (UEMUSHORT) (ll >> 48);
+  yi[M + 1] = (UEMUSHORT) (ll >> 32);
+  yi[M + 2] = (UEMUSHORT) (ll >> 16);
+  yi[M + 3] = (UEMUSHORT) ll;
   yi[E] = EXONE + 47;          /* exponent if normalize shift count were 0 */
 #else
-  yi[M] = (unsigned EMUSHORT) (ll >> 16);
-  yi[M + 1] = (unsigned EMUSHORT) ll;
+  yi[M] = (UEMUSHORT) (ll >> 16);
+  yi[M + 1] = (UEMUSHORT) ll;
   yi[E] = EXONE + 15;          /* exponent if normalize shift count were 0 */
 #endif
 
   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
     ecleaz (yi);               /* it was zero */
   else
-    yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
+    yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
   emovo (yi, y);               /* output the answer */
 }
 
 /* Convert unsigned HOST_WIDE_INT LP to e type Y.  */
 
-static void 
+static void
 ultoe (lp, y)
      unsigned HOST_WIDE_INT *lp;
-     unsigned EMUSHORT *y;
+     UEMUSHORT *y;
 {
-  unsigned EMUSHORT yi[NI];
+  UEMUSHORT yi[NI];
   unsigned HOST_WIDE_INT ll;
   int k;
 
@@ -4173,21 +4286,21 @@ ultoe (lp, y)
 
   /* move the long integer to ayi significand area */
 #if HOST_BITS_PER_WIDE_INT == 64
-  yi[M] = (unsigned EMUSHORT) (ll >> 48);
-  yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
-  yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
-  yi[M + 3] = (unsigned EMUSHORT) ll;
+  yi[M] = (UEMUSHORT) (ll >> 48);
+  yi[M + 1] = (UEMUSHORT) (ll >> 32);
+  yi[M + 2] = (UEMUSHORT) (ll >> 16);
+  yi[M + 3] = (UEMUSHORT) ll;
   yi[E] = EXONE + 47;          /* exponent if normalize shift count were 0 */
 #else
-  yi[M] = (unsigned EMUSHORT) (ll >> 16);
-  yi[M + 1] = (unsigned EMUSHORT) ll;
+  yi[M] = (UEMUSHORT) (ll >> 16);
+  yi[M + 1] = (UEMUSHORT) ll;
   yi[E] = EXONE + 15;          /* exponent if normalize shift count were 0 */
 #endif
 
   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
     ecleaz (yi);               /* it was zero */
   else
-    yi[E] -= (unsigned EMUSHORT) k;  /* subtract shift count from exponent */
+    yi[E] -= (UEMUSHORT) k;  /* subtract shift count from exponent */
   emovo (yi, y);               /* output the answer */
 }
 
@@ -4199,13 +4312,13 @@ ultoe (lp, y)
    The output e-type fraction FRAC is the positive fractional
    part of abs (X).  */
 
-static void 
+static void
 eifrac (x, i, frac)
-     unsigned EMUSHORT *x;
+     UEMUSHORT *x;
      HOST_WIDE_INT *i;
-     unsigned EMUSHORT *frac;
+     UEMUSHORT *frac;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   int j, k;
   unsigned HOST_WIDE_INT ll;
 
@@ -4272,7 +4385,7 @@ eifrac (x, i, frac)
   if ((k = enormlz (xi)) > NBITS)
     ecleaz (xi);
   else
-    xi[E] -= (unsigned EMUSHORT) k;
+    xi[E] -= (UEMUSHORT) k;
 
   emovo (xi, frac);
 }
@@ -4282,14 +4395,14 @@ eifrac (x, i, frac)
    FRAC of e-type X.  A negative input yields integer output = 0 but
    correct fraction.  */
 
-static void 
+static void
 euifrac (x, i, frac)
-     unsigned EMUSHORT *x;
+     UEMUSHORT *x;
      unsigned HOST_WIDE_INT *i;
-     unsigned EMUSHORT *frac;
+     UEMUSHORT *frac;
 {
   unsigned HOST_WIDE_INT ll;
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   int j, k;
 
   emovi (x, xi);
@@ -4305,7 +4418,7 @@ euifrac (x, i, frac)
     {
       /* Long integer overflow: output large integer
         and correct fraction.
-        Note, the BSD microvax compiler says that ~(0UL)
+        Note, the BSD MicroVAX compiler says that ~(0UL)
         is a syntax error.  */
       *i = ~(0L);
       eshift (xi, k);
@@ -4344,20 +4457,20 @@ euifrac (x, i, frac)
   if ((k = enormlz (xi)) > NBITS)
     ecleaz (xi);
   else
-    xi[E] -= (unsigned EMUSHORT) k;
+    xi[E] -= (UEMUSHORT) k;
 
   emovo (xi, frac);
 }
 
 /* Shift the significand of exploded e-type X up or down by SC bits.  */
 
-static int 
+static int
 eshift (x, sc)
-     unsigned EMUSHORT *x;
+     UEMUSHORT *x;
      int sc;
 {
-  unsigned EMUSHORT lost;
-  unsigned EMUSHORT *p;
+  UEMUSHORT lost;
+  UEMUSHORT *p;
 
   if (sc == 0)
     return (0);
@@ -4417,11 +4530,11 @@ eshift (x, sc)
 /* Shift normalize the significand area of exploded e-type X.
    Return the shift count (up = positive).  */
 
-static int 
+static int
 enormlz (x)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
 {
-  register unsigned EMUSHORT *p;
+  UEMUSHORT *p;
   int sc;
 
   sc = 0;
@@ -4488,8 +4601,8 @@ enormlz (x)
 #define NTEN 12
 #define MAXP 4096
 
-#if LONG_DOUBLE_TYPE_SIZE == 128
-static unsigned EMUSHORT etens[NTEN + 1][NE] =
+#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
+static UEMUSHORT etens[NTEN + 1][NE] =
 {
   {0x6576, 0x4a92, 0x804a, 0x153f,
    0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,},   /* 10**4096 */
@@ -4519,7 +4632,7 @@ static unsigned EMUSHORT etens[NTEN + 1][NE] =
    0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,},   /* 10**1 */
 };
 
-static unsigned EMUSHORT emtens[NTEN + 1][NE] =
+static UEMUSHORT emtens[NTEN + 1][NE] =
 {
   {0x2030, 0xcffc, 0xa1c3, 0x8123,
    0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,},   /* 10**-4096 */
@@ -4550,7 +4663,7 @@ static unsigned EMUSHORT emtens[NTEN + 1][NE] =
 };
 #else
 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
-static unsigned EMUSHORT etens[NTEN + 1][NE] =
+static UEMUSHORT etens[NTEN + 1][NE] =
 {
   {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,},   /* 10**4096 */
   {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,},   /* 10**2048 */
@@ -4567,7 +4680,7 @@ static unsigned EMUSHORT etens[NTEN + 1][NE] =
   {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,},   /* 10**1 */
 };
 
-static unsigned EMUSHORT emtens[NTEN + 1][NE] =
+static UEMUSHORT emtens[NTEN + 1][NE] =
 {
   {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,},   /* 10**-4096 */
   {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,},   /* 10**-2048 */
@@ -4589,13 +4702,13 @@ static unsigned EMUSHORT emtens[NTEN + 1][NE] =
 /* Convert float value X to ASCII string STRING with NDIG digits after
    the decimal point.  */
 
-static void 
+static void
 e24toasc (x, string, ndigs)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      char *string;
      int ndigs;
 {
-  unsigned EMUSHORT w[NI];
+  UEMUSHORT w[NI];
 
   e24toe (x, w);
   etoasc (w, string, ndigs);
@@ -4604,13 +4717,13 @@ e24toasc (x, string, ndigs)
 /* Convert double value X to ASCII string STRING with NDIG digits after
    the decimal point.  */
 
-static void 
+static void
 e53toasc (x, string, ndigs)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      char *string;
      int ndigs;
 {
-  unsigned EMUSHORT w[NI];
+  UEMUSHORT w[NI];
 
   e53toe (x, w);
   etoasc (w, string, ndigs);
@@ -4619,13 +4732,13 @@ e53toasc (x, string, ndigs)
 /* Convert double extended value X to ASCII string STRING with NDIG digits
    after the decimal point.  */
 
-static void 
+static void
 e64toasc (x, string, ndigs)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      char *string;
      int ndigs;
 {
-  unsigned EMUSHORT w[NI];
+  UEMUSHORT w[NI];
 
   e64toe (x, w);
   etoasc (w, string, ndigs);
@@ -4634,13 +4747,13 @@ e64toasc (x, string, ndigs)
 /* Convert 128-bit long double value X to ASCII string STRING with NDIG digits
    after the decimal point.  */
 
-static void 
+static void
 e113toasc (x, string, ndigs)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      char *string;
      int ndigs;
 {
-  unsigned EMUSHORT w[NI];
+  UEMUSHORT w[NI];
 
   e113toe (x, w);
   etoasc (w, string, ndigs);
@@ -4652,19 +4765,19 @@ e113toasc (x, string, ndigs)
 
 static char wstring[80];       /* working storage for ASCII output */
 
-static void 
+static void
 etoasc (x, string, ndigs)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      char *string;
      int ndigs;
 {
   EMUSHORT digit;
-  unsigned EMUSHORT y[NI], t[NI], u[NI], w[NI];
-  unsigned EMUSHORT *p, *r, *ten;
-  unsigned EMUSHORT sign;
+  UEMUSHORT y[NI], t[NI], u[NI], w[NI];
+  UEMUSHORT *p, *r, *ten;
+  UEMUSHORT sign;
   int i, j, k, expon, rndsav;
   char *s, *ss;
-  unsigned EMUSHORT m;
+  UEMUSHORT m;
 
 
   rndsav = rndprc;
@@ -4908,13 +5021,15 @@ etoasc (x, string, ndigs)
          emovo (y, t);
          if (ecmp (t, ezero) != 0)
            goto roun;          /* round to nearest */
+#ifndef C4X
          if ((*(s - 1) & 1) == 0)
            goto doexp;         /* round to even */
+#endif
        }
       /* Round up and propagate carry-outs */
     roun:
       --s;
-      k = *s & 0x7f;
+      k = *s & CHARMASK;
       /* Carry out to most significant digit? */
       if (k == '.')
        {
@@ -4968,10 +5083,10 @@ etoasc (x, string, ndigs)
 
 /* Convert ASCII string S to single precision float value Y.  */
 
-static void 
+static void
 asctoe24 (s, y)
-     char *s;
-     unsigned EMUSHORT *y;
+     const char *s;
+     UEMUSHORT *y;
 {
   asctoeg (s, y, 24);
 }
@@ -4979,10 +5094,10 @@ asctoe24 (s, y)
 
 /* Convert ASCII string S to double precision value Y.  */
 
-static void 
+static void
 asctoe53 (s, y)
-     char *s;
-     unsigned EMUSHORT *y;
+     const char *s;
+     UEMUSHORT *y;
 {
 #if defined(DEC) || defined(IBM)
   asctoeg (s, y, 56);
@@ -4998,60 +5113,70 @@ asctoe53 (s, y)
 
 /* Convert ASCII string S to double extended value Y.  */
 
-static void 
+static void
 asctoe64 (s, y)
-     char *s;
-     unsigned EMUSHORT *y;
+     const char *s;
+     UEMUSHORT *y;
 {
   asctoeg (s, y, 64);
 }
 
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
 /* Convert ASCII string S to 128-bit long double Y.  */
 
-static void 
+static void
 asctoe113 (s, y)
-     char *s;
-     unsigned EMUSHORT *y;
+     const char *s;
+     UEMUSHORT *y;
 {
   asctoeg (s, y, 113);
 }
+#endif
 
 /* Convert ASCII string S to e type Y.  */
 
-static void 
+static void
 asctoe (s, y)
-     char *s;
-     unsigned EMUSHORT *y;
+     const char *s;
+     UEMUSHORT *y;
 {
   asctoeg (s, y, NBITS);
 }
 
 /* Convert ASCII string SS to e type Y, with a specified rounding precision
-   of OPREC bits.  */
+   of OPREC bits.  BASE is 16 for C99 hexadecimal floating constants.  */
 
-static void 
+static void
 asctoeg (ss, y, oprec)
-     char *ss;
-     unsigned EMUSHORT *y;
+     const char *ss;
+     UEMUSHORT *y;
      int oprec;
 {
-  unsigned EMUSHORT yy[NI], xt[NI], tt[NI];
+  UEMUSHORT 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;
+  UEMUSHORT 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;
 
+  if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
+    {
+      base = 16;
+      s += 2;
+    }
+
   rndsav = rndprc;
   rndprc = NBITS;              /* Set to full precision */
   lost = 0;
@@ -5065,8 +5190,13 @@ asctoeg (ss, y, oprec)
   trail = 0;
 
  nxtcom:
-  k = *s - '0';
-  if ((k >= 0) && (k <= 9))
+  if (ISDIGIT (*s))
+    k = *s - '0';
+  else if (*s >= 'a' && *s <= 'f')
+    k = 10 + *s - 'a';
+  else
+    k = 10 + *s - 'A';
+  if ((k >= 0) && (k < base))
     {
       /* Ignore leading zeros */
       if ((prec == 0) && (decflg == 0) && (k == 0))
@@ -5075,14 +5205,18 @@ asctoeg (ss, y, oprec)
       if ((trail == 0) && (decflg != 0))
        {
          sp = s;
-         while ((*sp >= '0') && (*sp <= '9'))
+         while (ISDIGIT (*sp)
+                || (base == 16 && ((*sp >= 'a' && *sp <= 'f')
+                                   || (*sp >= 'A' && *sp <= 'F'))))
            ++sp;
          /* Check for syntax error */
-         c = *sp & 0x7f;
-         if ((c != 'e') && (c != 'E') && (c != '\0')
+         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';
@@ -5098,15 +5232,30 @@ asctoeg (ss, y, oprec)
 
       if (yy[2] == 0)
        {
-         if (decflg)
-           nexp += 1;          /* count digits after decimal point */
-         eshup1 (yy);          /* multiply current number by 10 */
-         emovz (yy, xt);
-         eshup1 (xt);
-         eshup1 (xt);
-         eaddm (xt, yy);
+         if (base == 16)
+           {
+             if (decflg)
+               nexp += 4;      /* count digits after decimal point */
+
+             eshup1 (yy);      /* multiply current number by 16 */
+             eshup1 (yy);
+             eshup1 (yy);
+             eshup1 (yy);
+           }
+         else
+           {
+             if (decflg)
+               nexp += 1;              /* count digits after decimal point */
+
+             eshup1 (yy);              /* multiply current number by 10 */
+             emovz (yy, xt);
+             eshup1 (xt);
+             eshup1 (xt);
+             eaddm (xt, yy);
+           }
+         /* Insert the current digit.  */
          ecleaz (xt);
-         xt[NI - 2] = (unsigned EMUSHORT) k;
+         xt[NI - 2] = (UEMUSHORT) k;
          eaddm (xt, yy);
        }
       else
@@ -5115,7 +5264,12 @@ asctoeg (ss, y, oprec)
          lost |= k;
          /* Count lost digits before the decimal point.  */
          if (decflg == 0)
-           nexp -= 1;
+           {
+             if (base == 10)
+               nexp -= 1;
+             else
+               nexp -= 4;
+           }
        }
       prec += 1;
       goto donchr;
@@ -5127,21 +5281,23 @@ asctoeg (ss, y, oprec)
       break;
     case 'E':
     case 'e':
+    case 'P':
+    case 'p':
       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 ',':
@@ -5154,7 +5310,7 @@ asctoeg (ss, y, oprec)
     case 'I':
       goto infinite;
     default:
-    error:
+    unexpected_char_error:
 #ifdef NANS
       einan (yy);
 #else
@@ -5169,7 +5325,7 @@ asctoeg (ss, y, oprec)
 
   /* Exponent interpretation */
  expnt:
-  /* 0.0eXXX is zero, regardless of XXX.  Check for the 0.0. */
+  /* 0.0eXXX is zero, regardless of XXX.  Check for the 0.0.  */
   for (k = 0; k < NI; k++)
     {
       if (yy[k] != 0)
@@ -5189,28 +5345,23 @@ read_expnt:
     }
   if (*s == '+')
     ++s;
-  while ((*s >= '0') && (*s <= '9'))
+  while (ISDIGIT (*s))
     {
       exp *= 10;
       exp += *s++ - '0';
-      if (exp > -(MINDECEXP))
-       {
-         if (esign < 0)
-           goto zero;
-         else
-           goto infinite;
-       }
+      if (exp > 999999)
+       break;
     }
   if (esign < 0)
     exp = -exp;
-  if (exp > MAXDECEXP)
+  if ((exp > MAXDECEXP) && (base == 10))
     {
  infinite:
       ecleaz (yy);
       yy[E] = 0x7fff;          /* infinity */
       goto aexit;
     }
-  if (exp < MINDECEXP)
+  if ((exp < MINDECEXP) && (base == 10))
     {
  zero:
       ecleaz (yy);
@@ -5218,6 +5369,25 @@ read_expnt:
     }
 
  daldone:
+  if (base == 16)
+    {
+      /* Base 16 hexadecimal floating constant.  */
+      if ((k = enormlz (yy)) > NBITS)
+       {
+         ecleaz (yy);
+         goto aexit;
+       }
+      /* Adjust the exponent.  NEXP is the number of hex digits,
+         EXP is a power of 2.  */
+      lexp = (EXONE - 1 + NBITS) - k + yy[E] + exp - nexp;
+      if (lexp > 0x7fff)
+       goto infinite;
+      if (lexp < 0)
+       goto zero;
+      yy[E] = lexp;
+      goto expdon;
+    }
+
   nexp = exp - nexp;
   /* Pad trailing zeros to minimize power of 10, per IEEE spec.  */
   while ((nexp > 0) && (yy[2] == 0))
@@ -5239,6 +5409,7 @@ read_expnt:
     }
   lexp = (EXONE - 1 + NBITS) - k;
   emdnorm (yy, lost, 0, lexp, 64);
+  lost = 0;
 
   /* Convert to external format:
 
@@ -5269,14 +5440,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);
@@ -5294,6 +5465,7 @@ read_expnt:
       k = emulm (tt, yy);
       lexp -= EXONE - 1;
     }
+  lost = k;
 
  expdon:
 
@@ -5317,7 +5489,7 @@ read_expnt:
     lexp -= EXONE - 0201;
 #endif
   rndprc = oprec;
-  emdnorm (yy, k, 0, lexp, 64);
+  emdnorm (yy, lost, 0, lexp, 64);
 
  aexit:
 
@@ -5364,7 +5536,7 @@ read_expnt:
 /* Return Y = largest integer not greater than X (truncated toward minus
    infinity).  */
 
-static unsigned EMUSHORT bmask[] =
+static const UEMUSHORT bmask[] =
 {
   0xffff,
   0xfffe,
@@ -5385,13 +5557,13 @@ static unsigned EMUSHORT bmask[] =
   0x0000,
 };
 
-static void 
+static void
 efloor (x, y)
-     unsigned EMUSHORT x[], y[];
+     UEMUSHORT x[], y[];
 {
-  register unsigned EMUSHORT *p;
+  UEMUSHORT *p;
   int e, expon, i;
-  unsigned EMUSHORT f[NE];
+  UEMUSHORT f[NE];
 
   emov (x, f);                 /* leave in external format */
   expon = (int) f[NE - 1];
@@ -5418,7 +5590,7 @@ efloor (x, y)
   /* truncate negatives toward minus infinity */
  isitneg:
 
-  if ((unsigned EMUSHORT) expon & (unsigned EMUSHORT) 0x8000)
+  if ((UEMUSHORT) expon & (UEMUSHORT) 0x8000)
     {
       for (i = 0; i < NE - 1; i++)
        {
@@ -5436,13 +5608,13 @@ efloor (x, y)
 /* Return S and EXP such that  S * 2^EXP = X and .5 <= S < 1.
    For example, 1.1 = 0.55 * 2^1.  */
 
-static void 
+static void
 efrexp (x, exp, s)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      int *exp;
-     unsigned EMUSHORT s[];
+     UEMUSHORT s[];
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG li;
 
   emovi (x, xi);
@@ -5461,13 +5633,13 @@ efrexp (x, exp, s)
 
 /* Return e type Y = X * 2^PWR2.  */
 
-static void 
+static void
 eldexp (x, pwr2, y)
-     unsigned EMUSHORT x[];
+     UEMUSHORT x[];
      int pwr2;
-     unsigned EMUSHORT y[];
+     UEMUSHORT y[];
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG li;
   int i;
 
@@ -5484,11 +5656,11 @@ eldexp (x, pwr2, y)
 /* C = remainder after dividing B by A, all e type values.
    Least significant integer quotient bits left in EQUOT.  */
 
-static void 
+static void
 eremain (a, b, c)
-     unsigned EMUSHORT a[], b[], c[];
+     UEMUSHORT a[], b[], c[];
 {
-  unsigned EMUSHORT den[NI], num[NI];
+  UEMUSHORT den[NI], num[NI];
 
 #ifdef NANS
   if (eisinf (b)
@@ -5521,12 +5693,12 @@ eremain (a, b, c)
 /*  Return quotient of exploded e-types NUM / DEN in EQUOT,
     remainder in NUM.  */
 
-static void 
+static void
 eiremain (den, num)
-     unsigned EMUSHORT den[], num[];
+     UEMUSHORT den[], num[];
 {
   EMULONG ld, ln;
-  unsigned EMUSHORT j;
+  UEMUSHORT j;
 
   ld = den[E];
   ld -= enormlz (den);
@@ -5551,10 +5723,9 @@ eiremain (den, num)
 }
 
 /* Report an error condition CODE encountered in function NAME.
-   CODE is one of the following:
 
     Mnemonic        Value          Significance
+
      DOMAIN            1       argument domain error
      SING              2       function singularity
      OVERFLOW          3       overflow range error
@@ -5564,42 +5735,53 @@ eiremain (den, num)
      INVALID           7       NaN - producing operation
      EDOM             33       Unix domain error code
      ERANGE           34       Unix range error code
+
    The order of appearance of the following messages is bound to the
    error codes defined above.  */
 
-#define NMSGS 8
-static char *ermsg[NMSGS] =
-{
-  "unknown",                   /* error code 0 */
-  "domain",                    /* error code 1 */
-  "singularity",               /* et seq.      */
-  "overflow",
-  "underflow",
-  "total loss of precision",
-  "partial loss of precision",
-  "invalid operation"
-};
-
 int merror = 0;
 extern int merror;
 
-static void 
+static void
 mtherr (name, code)
-     char *name;
+     const char *name;
      int code;
 {
-  char errstr[80];
-
   /* The string passed by the calling program is supposed to be the
      name of the function in which the error occurred.
      The code argument selects which error message string will be printed.  */
 
-  if ((code <= 0) || (code >= NMSGS))
-    code = 0;
-  sprintf (errstr, " %s %s error", name, ermsg[code]);
+  if (strcmp (name, "esub") == 0)
+    name = "subtraction";
+  else if (strcmp (name, "ediv") == 0)
+    name = "division";
+  else if (strcmp (name, "emul") == 0)
+    name = "multiplication";
+  else if (strcmp (name, "enormlz") == 0)
+    name = "normalization";
+  else if (strcmp (name, "etoasc") == 0)
+    name = "conversion to text";
+  else if (strcmp (name, "asctoe") == 0)
+    name = "parsing";
+  else if (strcmp (name, "eremain") == 0)
+    name = "modulus";
+  else if (strcmp (name, "esqrt") == 0)
+    name = "square root";
   if (extra_warnings)
-    warning (errstr);
+    {
+      switch (code)
+       {
+       case DOMAIN:    warning ("%s: argument domain error"    , name); break;
+       case SING:      warning ("%s: function singularity"     , name); break;
+       case OVERFLOW:  warning ("%s: overflow range error"     , name); break;
+       case UNDERFLOW: warning ("%s: underflow range error"    , name); break;
+       case TLOSS:     warning ("%s: total loss of precision"  , name); break;
+       case PLOSS:     warning ("%s: partial loss of precision", name); break;
+       case INVALID:   warning ("%s: NaN - producing operation", name); break;
+       default:        abort ();
+       }
+    }
+
   /* Set global error message word */
   merror = code + 1;
 }
@@ -5607,13 +5789,13 @@ mtherr (name, code)
 #ifdef DEC
 /* Convert DEC double precision D to e type E.  */
 
-static void 
+static void
 dectoe (d, e)
-     unsigned EMUSHORT *d;
-     unsigned EMUSHORT *e;
+     UEMUSHORT *d;
+     UEMUSHORT *e;
 {
-  unsigned EMUSHORT y[NI];
-  register unsigned EMUSHORT r, *p;
+  UEMUSHORT y[NI];
+  UEMUSHORT r, *p;
 
   ecleaz (y);                  /* start with a zero */
   p = y;                       /* point to our number */
@@ -5647,11 +5829,11 @@ dectoe (d, e)
 
 /* Convert e type X to DEC double precision D.  */
 
-static void 
+static void
 etodec (x, d)
-     unsigned EMUSHORT *x, *d;
+     UEMUSHORT *x, *d;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
@@ -5669,12 +5851,12 @@ etodec (x, d)
 /* Convert exploded e-type X, that has already been rounded to
    56-bit precision, to DEC format double Y.  */
 
-static void 
+static void
 todec (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
-  unsigned EMUSHORT i;
-  unsigned EMUSHORT *p;
+  UEMUSHORT i;
+  UEMUSHORT *p;
 
   p = x;
   *y = 0;
@@ -5715,15 +5897,14 @@ todec (x, y)
 #ifdef IBM
 /* Convert IBM single/double precision to e type.  */
 
-static void 
+static void
 ibmtoe (d, e, mode)
-     unsigned EMUSHORT *d;
-     unsigned EMUSHORT *e;
+     UEMUSHORT *d;
+     UEMUSHORT *e;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT y[NI];
-  register unsigned EMUSHORT r, *p;
-  int rndsav;
+  UEMUSHORT y[NI];
+  UEMUSHORT r, *p;
 
   ecleaz (y);                  /* start with a zero */
   p = y;                       /* point to our number */
@@ -5759,12 +5940,12 @@ ibmtoe (d, e, mode)
 
 /* Convert e type to IBM single/double precision.  */
 
-static void 
+static void
 etoibm (x, d, mode)
-     unsigned EMUSHORT *x, *d;
+     UEMUSHORT *x, *d;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
@@ -5778,13 +5959,13 @@ etoibm (x, d, mode)
   toibm (xi, d, mode);
 }
 
-static void 
+static void
 toibm (x, y, mode)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT i;
-  unsigned EMUSHORT *p;
+  UEMUSHORT i;
+  UEMUSHORT *p;
   int r;
 
   p = x;
@@ -5836,21 +6017,20 @@ toibm (x, y, mode)
 #ifdef C4X
 /* Convert C4X single/double precision to e type.  */
 
-static void 
+static void
 c4xtoe (d, e, mode)
-     unsigned EMUSHORT *d;
-     unsigned EMUSHORT *e;
+     UEMUSHORT *d;
+     UEMUSHORT *e;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT y[NI];
+  UEMUSHORT y[NI];
   int r;
-  int rndsav;
   int isnegative;
   int size;
   int i;
   int carry;
 
-  /* Short-circuit the zero case. */
+  /* Short-circuit the zero case.  */
   if ((d[0] == 0x8000)
       && (d[1] == 0x0000)
       && ((mode == QFmode) || ((d[2] == 0x0000) && (d[3] == 0x0000))))
@@ -5875,9 +6055,9 @@ c4xtoe (d, e, mode)
   {
      isnegative = FALSE;
   }
-     
+
   r >>= 8;                     /* Shift exponent word down 8 bits.  */
-  if (r & 0x80)                        /* Make the exponent negative if it is. */
+  if (r & 0x80)                        /* Make the exponent negative if it is.  */
   {
      r = r | (~0 & ~0xff);
   }
@@ -5887,7 +6067,7 @@ c4xtoe (d, e, mode)
      /* Now do the high order mantissa.  We don't "or" on the high bit
        because it is 2 (not 1) and is handled a little differently
        below.  */
-     y[M] = d[0] & 0x7f;       
+     y[M] = d[0] & 0x7f;
 
      y[M+1] = d[1];
      if (mode != QFmode)       /* There are only 2 words in QFmode.  */
@@ -5904,7 +6084,7 @@ c4xtoe (d, e, mode)
 
      /* Now do the two's complement on the data.  */
 
-     carry = 1;        /* Initially add 1 for the two's complement. */
+     carry = 1;        /* Initially add 1 for the two's complement.  */
      for (i=size + M; i > M; i--)
      {
        if (carry && (y[i] == 0x0000))
@@ -5932,11 +6112,11 @@ c4xtoe (d, e, mode)
   {
     /* Add our e type exponent offset to form our exponent.  */
      r += EXONE;
-     y[1] = r;                 
+     y[1] = r;
 
      /* Now do the high order mantissa strip off the exponent and sign
        bits and add the high 1 bit.  */
-     y[M] = d[0] & 0x7f | 0x80;        
+     y[M] = (d[0] & 0x7f) | 0x80;
 
      y[M+1] = d[1];
      if (mode != QFmode)       /* There are only 2 words in QFmode.  */
@@ -5953,21 +6133,21 @@ c4xtoe (d, e, mode)
 
 /* Convert e type to C4X single/double precision.  */
 
-static void 
+static void
 etoc4x (x, d, mode)
-     unsigned EMUSHORT *x, *d;
+     UEMUSHORT *x, *d;
      enum machine_mode mode;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   EMULONG exp;
   int rndsav;
 
   emovi (x, xi);
 
-  /* Adjust exponent for offsets. */
+  /* Adjust exponent for offsets.  */
   exp = (EMULONG) xi[E] - (EXONE - 0x7f);
 
-  /* Round off to nearest or even. */
+  /* Round off to nearest or even.  */
   rndsav = rndprc;
   rndprc = mode == QFmode ? 24 : 32;
   emdnorm (xi, 0, 0, exp, 64);
@@ -5975,16 +6155,15 @@ etoc4x (x, d, mode)
   toc4x (xi, d, mode);
 }
 
-static void 
+static void
 toc4x (x, y, mode)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
      enum machine_mode mode;
 {
   int i;
-  int r;
   int v;
   int carry;
-  
+
   /* Short-circuit the zero case */
   if ((x[0] == 0)      /* Zero exponent and sign */
       && (x[1] == 0)
@@ -5993,7 +6172,7 @@ toc4x (x, y, mode)
       /* Only check for double if necessary */
       && ((mode == QFmode) || ((x[M+2] == 0) && (x[M+3] == 0))))
     {
-      /* We have a zero.  Put it into the output and return. */
+      /* We have a zero.  Put it into the output and return.  */
       *y++ = 0x8000;
       *y++ = 0x0000;
       if (mode != QFmode)
@@ -6003,18 +6182,18 @@ toc4x (x, y, mode)
         }
       return;
     }
-  
+
   *y = 0;
-  
+
   /* Negative number require a two's complement conversion of the
-     mantissa. */
+     mantissa.  */
   if (x[0])
     {
       *y = 0x0080;
-      
+
       i = ((int) x[1]) - 0x7f;
-      
-      /* Now add 1 to the inverted data to do the two's complement. */
+
+      /* Now add 1 to the inverted data to do the two's complement.  */
       if (mode != QFmode)
        v = 4 + M;
       else
@@ -6033,15 +6212,15 @@ toc4x (x, y, mode)
            }
          v--;
        }
-      
+
       /* The following is a special case.  The C4X negative float requires
         a zero in the high bit (because the format is (2 - x) x 2^m), so
         if a one is in that bit, we have to shift left one to get rid
-        of it.  This only occurs if the number is -1 x 2^m. */
+        of it.  This only occurs if the number is -1 x 2^m.  */
       if (x[M+1] & 0x8000)
        {
          /* This is the case of -1 x 2^m, we have to rid ourselves of the
-            high sign bit and shift the exponent. */
+            high sign bit and shift the exponent.  */
          eshift(x, 1);
          i--;
        }
@@ -6065,11 +6244,11 @@ toc4x (x, y, mode)
 #endif
       return;
     }
-  
+
   y[0] |= ((i & 0xff) << 8);
-  
+
   eshift (x, 8);
-  
+
   y[0] |= x[M] & 0x7f;
   y[1] = x[M + 1];
   if (mode != QFmode)
@@ -6089,9 +6268,9 @@ toc4x (x, y, mode)
 TFMODE_NAN;
 #else
 #ifdef IEEE
-unsigned EMUSHORT TFbignan[8] =
+UEMUSHORT TFbignan[8] =
  {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
-unsigned EMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
+UEMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
 #endif
 #endif
 
@@ -6099,9 +6278,9 @@ unsigned EMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
 XFMODE_NAN;
 #else
 #ifdef IEEE
-unsigned EMUSHORT XFbignan[6] =
+UEMUSHORT XFbignan[6] =
  {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
-unsigned EMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
+UEMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
 #endif
 #endif
 
@@ -6109,8 +6288,8 @@ unsigned EMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
 DFMODE_NAN;
 #else
 #ifdef IEEE
-unsigned EMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
-unsigned EMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
+UEMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
+UEMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
 #endif
 #endif
 
@@ -6118,20 +6297,21 @@ unsigned EMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
 SFMODE_NAN;
 #else
 #ifdef IEEE
-unsigned EMUSHORT SFbignan[2] = {0x7fff, 0xffff};
-unsigned EMUSHORT SFlittlenan[2] = {0, 0xffc0};
+UEMUSHORT SFbignan[2] = {0x7fff, 0xffff};
+UEMUSHORT SFlittlenan[2] = {0, 0xffc0};
 #endif
 #endif
 
 
+#ifdef NANS
 static void
 make_nan (nan, sign, mode)
-     unsigned EMUSHORT *nan;
+     UEMUSHORT *nan;
      int sign;
      enum machine_mode mode;
 {
   int n;
-  unsigned EMUSHORT *p;
+  UEMUSHORT *p;
 
   switch (mode)
     {
@@ -6139,12 +6319,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:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
       n = 8;
       if (REAL_WORDS_BIG_ENDIAN)
        p = TFbignan;
       else
        p = TFlittlenan;
       break;
+#endif
+      /* FALLTHRU */
 
     case XFmode:
       n = 6;
@@ -6176,12 +6359,13 @@ make_nan (nan, sign, mode)
       abort ();
     }
   if (REAL_WORDS_BIG_ENDIAN)
-    *nan++ = (sign << 15) | *p++;
+    *nan++ = (sign << 15) | (*p++ & 0x7fff);
   while (--n != 0)
     *nan++ = *p++;
   if (! REAL_WORDS_BIG_ENDIAN)
-    *nan = (sign << 15) | *p;
+    *nan = (sign << 15) | (*p & 0x7fff);
 }
+#endif /* NANS */
 
 /* This is the inverse of the function `etarsingle' invoked by
    REAL_VALUE_TO_TARGET_SINGLE.  */
@@ -6191,24 +6375,24 @@ ereal_unto_float (f)
      long f;
 {
   REAL_VALUE_TYPE r;
-  unsigned EMUSHORT s[2];
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT s[2];
+  UEMUSHORT e[NE];
 
   /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
    This is the inverse operation to what the function `endian' does.  */
   if (REAL_WORDS_BIG_ENDIAN)
     {
-      s[0] = (unsigned EMUSHORT) (f >> 16);
-      s[1] = (unsigned EMUSHORT) f;
+      s[0] = (UEMUSHORT) (f >> 16);
+      s[1] = (UEMUSHORT) f;
     }
   else
     {
-      s[0] = (unsigned EMUSHORT) f;
-      s[1] = (unsigned EMUSHORT) (f >> 16);
+      s[0] = (UEMUSHORT) f;
+      s[1] = (UEMUSHORT) (f >> 16);
     }
-  /* Convert and promote the target float to E-type. */
+  /* Convert and promote the target float to E-type.  */
   e24toe (s, e);
-  /* Output E-type to REAL_VALUE_TYPE. */
+  /* Output E-type to REAL_VALUE_TYPE.  */
   PUT_REAL (e, &r);
   return r;
 }
@@ -6222,28 +6406,28 @@ ereal_unto_double (d)
      long d[];
 {
   REAL_VALUE_TYPE r;
-  unsigned EMUSHORT s[4];
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT s[4];
+  UEMUSHORT e[NE];
 
   /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces.  */
   if (REAL_WORDS_BIG_ENDIAN)
     {
-      s[0] = (unsigned EMUSHORT) (d[0] >> 16);
-      s[1] = (unsigned EMUSHORT) d[0];
-      s[2] = (unsigned EMUSHORT) (d[1] >> 16);
-      s[3] = (unsigned EMUSHORT) d[1];
+      s[0] = (UEMUSHORT) (d[0] >> 16);
+      s[1] = (UEMUSHORT) d[0];
+      s[2] = (UEMUSHORT) (d[1] >> 16);
+      s[3] = (UEMUSHORT) d[1];
     }
   else
     {
       /* Target float words are little-endian.  */
-      s[0] = (unsigned EMUSHORT) d[0];
-      s[1] = (unsigned EMUSHORT) (d[0] >> 16);
-      s[2] = (unsigned EMUSHORT) d[1];
-      s[3] = (unsigned EMUSHORT) (d[1] >> 16);
+      s[0] = (UEMUSHORT) d[0];
+      s[1] = (UEMUSHORT) (d[0] >> 16);
+      s[2] = (UEMUSHORT) d[1];
+      s[3] = (UEMUSHORT) (d[1] >> 16);
     }
-  /* Convert target double to E-type. */
+  /* Convert target double to E-type.  */
   e53toe (s, e);
-  /* Output E-type to REAL_VALUE_TYPE. */
+  /* Output E-type to REAL_VALUE_TYPE.  */
   PUT_REAL (e, &r);
   return r;
 }
@@ -6258,20 +6442,20 @@ ereal_from_float (f)
      HOST_WIDE_INT f;
 {
   REAL_VALUE_TYPE r;
-  unsigned EMUSHORT s[2];
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT s[2];
+  UEMUSHORT e[NE];
 
   /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
    This is the inverse operation to what the function `endian' does.  */
   if (REAL_WORDS_BIG_ENDIAN)
     {
-      s[0] = (unsigned EMUSHORT) (f >> 16);
-      s[1] = (unsigned EMUSHORT) f;
+      s[0] = (UEMUSHORT) (f >> 16);
+      s[1] = (UEMUSHORT) f;
     }
   else
     {
-      s[0] = (unsigned EMUSHORT) f;
-      s[1] = (unsigned EMUSHORT) (f >> 16);
+      s[0] = (UEMUSHORT) f;
+      s[1] = (UEMUSHORT) (f >> 16);
     }
   /* Convert and promote the target float to E-type.  */
   e24toe (s, e);
@@ -6295,36 +6479,38 @@ ereal_from_double (d)
      HOST_WIDE_INT d[];
 {
   REAL_VALUE_TYPE r;
-  unsigned EMUSHORT s[4];
-  unsigned EMUSHORT e[NE];
+  UEMUSHORT s[4];
+  UEMUSHORT e[NE];
 
   /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces.  */
   if (REAL_WORDS_BIG_ENDIAN)
     {
-      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];
+      s[0] = (UEMUSHORT) (d[0] >> 16);
+      s[1] = (UEMUSHORT) d[0];
+      s[2] = (UEMUSHORT) (d[1] >> 16);
+      s[3] = (UEMUSHORT) 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] = (UEMUSHORT) (d[0] >> 48);
+      s[1] = (UEMUSHORT) (d[0] >> 32);
+      s[2] = (UEMUSHORT) (d[0] >> 16);
+      s[3] = (UEMUSHORT) d[0];
 #endif
     }
   else
     {
       /* Target float words are little-endian.  */
-      s[0] = (unsigned EMUSHORT) d[0];
-      s[1] = (unsigned EMUSHORT) (d[0] >> 16);
+      s[0] = (UEMUSHORT) d[0];
+      s[1] = (UEMUSHORT) (d[0] >> 16);
 #if HOST_BITS_PER_WIDE_INT == 32
-      s[2] = (unsigned EMUSHORT) d[1];
-      s[3] = (unsigned EMUSHORT) (d[1] >> 16);
+      s[2] = (UEMUSHORT) d[1];
+      s[3] = (UEMUSHORT) (d[1] >> 16);
 #else
-      s[2] = (unsigned EMUSHORT) (d[0] >> 32);
-      s[3] = (unsigned EMUSHORT) (d[0] >> 48);
+      s[2] = (UEMUSHORT) (d[0] >> 32);
+      s[3] = (UEMUSHORT) (d[0] >> 48);
 #endif
     }
   /* Convert target double to E-type.  */
@@ -6342,10 +6528,10 @@ ereal_from_double (d)
 
 static void
 uditoe (di, e)
-     unsigned EMUSHORT *di;  /* Address of the 64-bit int.  */
-     unsigned EMUSHORT *e;
+     UEMUSHORT *di;  /* Address of the 64-bit int.  */
+     UEMUSHORT *e;
 {
-  unsigned EMUSHORT yi[NI];
+  UEMUSHORT yi[NI];
   int k;
 
   ecleaz (yi);
@@ -6363,7 +6549,7 @@ uditoe (di, e)
   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
     ecleaz (yi);               /* it was zero */
   else
-    yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
+    yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
   emovo (yi, e);
 }
 
@@ -6371,12 +6557,12 @@ uditoe (di, e)
 
 static void
 ditoe (di, e)
-     unsigned EMUSHORT *di;  /* Address of the 64-bit int.  */
-     unsigned EMUSHORT *e;
+     UEMUSHORT *di;  /* Address of the 64-bit int.  */
+     UEMUSHORT *e;
 {
   unsigned EMULONG acc;
-  unsigned EMUSHORT yi[NI];
-  unsigned EMUSHORT carry;
+  UEMUSHORT yi[NI];
+  UEMUSHORT carry;
   int k, sign;
 
   ecleaz (yi);
@@ -6409,7 +6595,7 @@ ditoe (di, e)
   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
     ecleaz (yi);               /* it was zero */
   else
-    yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
+    yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
   emovo (yi, e);
   if (sign)
        eneg (e);
@@ -6418,12 +6604,12 @@ ditoe (di, e)
 
 /* Convert e-type to unsigned 64-bit int.  */
 
-static void 
+static void
 etoudi (x, i)
-     unsigned EMUSHORT *x;
-     unsigned EMUSHORT *i;
+     UEMUSHORT *x;
+     UEMUSHORT *i;
 {
-  unsigned EMUSHORT xi[NI];
+  UEMUSHORT xi[NI];
   int j, k;
 
   emovi (x, xi);
@@ -6501,15 +6687,15 @@ noshift:
 
 /* Convert e-type to signed 64-bit int.  */
 
-static void 
+static void
 etodi (x, i)
-     unsigned EMUSHORT *x;
-     unsigned EMUSHORT *i;
+     UEMUSHORT *x;
+     UEMUSHORT *i;
 {
   unsigned EMULONG acc;
-  unsigned EMUSHORT xi[NI];
-  unsigned EMUSHORT carry;
-  unsigned EMUSHORT *isave;
+  UEMUSHORT xi[NI];
+  UEMUSHORT carry;
+  UEMUSHORT *isave;
   int j, k;
 
   emovi (x, xi);
@@ -6603,11 +6789,11 @@ etodi (x, i)
 static int esqinited = 0;
 static unsigned short sqrndbit[NI];
 
-static void 
+static void
 esqrt (x, y)
-     unsigned EMUSHORT *x, *y;
+     UEMUSHORT *x, *y;
 {
-  unsigned EMUSHORT temp[NI], num[NI], sq[NI], xx[NI];
+  UEMUSHORT temp[NI], num[NI], sq[NI], xx[NI];
   EMULONG m, exp;
   int i, j, k, n, nlups;
 
@@ -6713,7 +6899,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;
 {
@@ -6724,7 +6910,7 @@ significand_size (mode)
 switch (GET_MODE_BITSIZE (mode))
   {
   case 32:
+
 #if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT
     return 56;
 #endif
@@ -6752,8 +6938,13 @@ switch (GET_MODE_BITSIZE (mode))
 
   case 96:
     return 64;
+
   case 128:
+#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
     return 113;
+#else
+    return 64;
+#endif
 
   default:
     abort ();