diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 13 |
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) { |