rs6000.c (num_insns_constant_wide): Constants are sign-extended.
authorDavid Edelsohn <edelsohn@gnu.org>
Tue, 15 May 2001 04:26:33 +0000 (04:26 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Tue, 15 May 2001 04:26:33 +0000 (00:26 -0400)
        * rs6000.c (num_insns_constant_wide): Constants are sign-extended.
        (num_insns_constant): CONST_INT can be 64-bits.

From-SVN: r42099

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 66f6e49716dd0d8a926ca2afe5510401815e1c75..d4cdef9e06b6d32d61207d02aa716ff86341f82b 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-14  David Edelsohn  <edelsohn@gnu.org>
+
+       * rs6000.c (num_insns_constant_wide): Constants are sign-extended.
+       (num_insns_constant): CONST_INT can be 64-bits.
+
 2001-05-14  Stan Shebs  <shebs@apple.com>
 
        * config/darwin.h (LIB_SPEC): Just use -lSystem.
index 09cef29d3c203d2106b6f378a8f8880661c1af2a..a2b6b944384737127b70e42dc99770e06d7f4cdf 100644 (file)
@@ -754,9 +754,11 @@ num_insns_constant_wide (value)
 #if HOST_BITS_PER_WIDE_INT == 64
   else if (TARGET_POWERPC64)
     {
-      unsigned HOST_WIDE_INT low  = value & 0xffffffff;
+      HOST_WIDE_INT low  = value & 0xffffffff;
       HOST_WIDE_INT high = value >> 32;
 
+      low = (low ^ 0x80000000) - 0x80000000;  /* sign extend */
+
       if (high == 0 && (low & 0x80000000) == 0)
        return 2;
 
@@ -782,7 +784,14 @@ num_insns_constant (op, mode)
      enum machine_mode mode;
 {
   if (GET_CODE (op) == CONST_INT)
-    return num_insns_constant_wide (INTVAL (op));
+    {
+#if HOST_BITS_PER_WIDE_INT == 64
+      if (mask64_operand (op, mode))
+           return 2;
+      else
+#endif
+       return num_insns_constant_wide (INTVAL (op));
+    }
 
   else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
     {