summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.c13
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 66f6e49716d..d4cdef9e06b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 09cef29d3c2..a2b6b944384 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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)
{