Jakub Jelinek <jj@ultra.linux.cz>
authorJakub Jelinek <jj@ultra.linux.cz>
Mon, 21 Jun 1999 17:52:47 +0000 (19:52 +0200)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 21 Jun 1999 17:52:47 +0000 (10:52 -0700)
Jakub Jelinek  <jj@ultra.linux.cz>
        * real.c (ereal_from_double): Fix for 64-bit big endian hosts.
        * emit-rtl.c (gen_lowpart_common): Add case for hosts where double
        fits in HOST_WIDE_INT and one uses union to access a long constant
        as double.

From-SVN: r27675

gcc/ChangeLog
gcc/emit-rtl.c
gcc/real.c

index e6393b34fb79ee7828eabf012da7efc4c1b8397f..2d76c2c73cb2fd178fa9dd71c306456add2b4e15 100644 (file)
@@ -1,3 +1,10 @@
+1999-06-21  Jakub Jelinek  <jj@ultra.linux.cz>
+
+       * real.c (ereal_from_double): Fix for 64-bit big endian hosts.
+       * emit-rtl.c (gen_lowpart_common): Add case for hosts where double
+       fits in HOST_WIDE_INT and one uses union to access a long constant
+       as double.
+
 Mon Jun 21 17:18:25 1999  Richard Henderson  <rth@cygnus.com>
 
        * sparc.c (sparc_override_options): Don't allow profiling for
index f1caea7d60d0bce2d1aae1c64c174d5fb5c493da..0b310f2fa67e0fc9f25c2a8ec84154cf49668bb8 100644 (file)
@@ -896,6 +896,22 @@ gen_lowpart_common (mode, x)
       r = REAL_VALUE_FROM_TARGET_SINGLE (i);
       return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
     }
+  else if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
+            && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
+           || flag_pretend_float)
+          && GET_MODE_CLASS (mode) == MODE_FLOAT
+          && GET_MODE_SIZE (mode) == UNITS_PER_WORD
+          && GET_CODE (x) == CONST_INT
+          && (sizeof (double) * HOST_BITS_PER_CHAR
+              == HOST_BITS_PER_WIDE_INT))
+    {
+      REAL_VALUE_TYPE r;
+      HOST_WIDE_INT i;
+
+      i = INTVAL (x);
+      r = REAL_VALUE_FROM_TARGET_DOUBLE (&i);
+      return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
+    }
 #endif
 
   /* Similarly, if this is converting a floating-point value into a
index e6a15fed515a9608af25050cd48b4f8a15e82847..2d615757af1606fc8f575892a6178a9707bb7afd 100644 (file)
@@ -6400,17 +6400,19 @@ ereal_from_double (d)
   /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces.  */
   if (REAL_WORDS_BIG_ENDIAN)
     {
+#if HOST_BITS_PER_WIDE_INT == 32
       s[0] = (unsigned EMUSHORT) (d[0] >> 16);
       s[1] = (unsigned EMUSHORT) d[0];
-#if HOST_BITS_PER_WIDE_INT == 32
       s[2] = (unsigned EMUSHORT) (d[1] >> 16);
       s[3] = (unsigned EMUSHORT) d[1];
 #else
       /* In this case the entire target double is contained in the
         first array element.  The second element of the input is
         ignored.  */
-      s[2] = (unsigned EMUSHORT) (d[0] >> 48);
-      s[3] = (unsigned EMUSHORT) (d[0] >> 32);
+      s[0] = (unsigned EMUSHORT) (d[0] >> 48);
+      s[1] = (unsigned EMUSHORT) (d[0] >> 32);
+      s[2] = (unsigned EMUSHORT) (d[0] >> 16);
+      s[3] = (unsigned EMUSHORT) d[0];
 #endif
     }
   else