mmix.c (mmix_intval): Correct handling of DFmode constants for hosts with long !...
authorHans-Peter Nilsson <hp@bitrange.com>
Sun, 30 Oct 2005 17:06:40 +0000 (17:06 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Sun, 30 Oct 2005 17:06:40 +0000 (17:06 +0000)
* config/mmix/mmix.c (mmix_intval): Correct handling of DFmode
constants for hosts with long != 32 bits.

From-SVN: r106027

gcc/ChangeLog
gcc/config/mmix/mmix.c

index c9bafabe0cf0c1bfd644e7c3ae87022c98d33e58..4eb8a407473896b168b61af375d4503761ed79cb 100644 (file)
@@ -1,3 +1,8 @@
+2005-10-30  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * config/mmix/mmix.c (mmix_intval): Correct handling of DFmode
+       constants for hosts with long != 32 bits.
+
 2005-10-28  Andreas Krebbel <krebbel1@de.ibm.com>
 
        PR middle-end/24093
index 1b5acc43306fe458c21fbe6588af7850e03d0e9c..fc2a5c82d6868c0d4e8c7a8f7f40cb8333773265 100644 (file)
@@ -2705,19 +2705,13 @@ mmix_intval (rtx x)
 
          REAL_VALUE_TO_TARGET_DOUBLE (value, bits);
 
-         if (sizeof (long) < sizeof (HOST_WIDEST_INT))
-           {
-             retval = (unsigned long) bits[1] / 2;
-             retval *= 2;
-             retval |= (unsigned long) bits[1] & 1;
-             retval
-               |= (unsigned HOST_WIDEST_INT) bits[0]
-                 << (sizeof (bits[0]) * 8);
-           }
-         else
-           retval = (unsigned long) bits[1];
-
-         return retval;
+         /* The double cast is necessary to avoid getting the long
+            sign-extended to unsigned long long(!) when they're of
+            different size (usually 32-bit hosts).  */
+         return
+           ((unsigned HOST_WIDEST_INT) (unsigned long) bits[0]
+            << (unsigned HOST_WIDEST_INT) 32U)
+           | (unsigned HOST_WIDEST_INT) (unsigned long) bits[1];
        }
       else if (GET_MODE (x) == SFmode)
        {