diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-05-10 08:31:01 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-05-10 08:31:01 -0400 |
commit | 0af3ee306ab1694a1daa5180991454bb5e66c6ce (patch) | |
tree | ce7a5c2bf852fd7d93a8817375e899b2e4cb60a3 /gcc | |
parent | 7ac16ba05b3599300418c4d941b25c97c4c7c3fe (diff) | |
download | gcc-0af3ee306ab1694a1daa5180991454bb5e66c6ce.zip gcc-0af3ee306ab1694a1daa5180991454bb5e66c6ce.tar.gz gcc-0af3ee306ab1694a1daa5180991454bb5e66c6ce.tar.bz2 |
(alpha_set_emit_const): Cleanups to work properly when run on 32-bit
host.
From-SVN: r9609
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/alpha/alpha.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index ee2a004..625c933 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -689,10 +689,12 @@ alpha_emit_set_const (target, mode, c, n) /* If this is a sign-extended 32-bit constant, we can do this in at most three insns, so do it if we have enough insns left. We always have - a sign-extended 32-bit constant when compiling on a narrow machine. */ + a sign-extended 32-bit constant when compiling on a narrow machine. + Note that we cannot handle the constant 0x80000000. */ - if (HOST_BITS_PER_WIDE_INT != 64 - || c >> 31 == -1 || c >> 31 == 0) + if ((HOST_BITS_PER_WIDE_INT != 64 + || c >> 31 == -1 || c >> 31 == 0) + && c != 0x80000000u) { HOST_WIDE_INT low = (c & 0xffff) - 2 * (c & 0x8000); HOST_WIDE_INT tmp1 = c - low; @@ -725,15 +727,13 @@ alpha_emit_set_const (target, mode, c, n) } } - /* If we couldn't do it that way, try some other methods (that depend on - being able to compute in the target's word size). But if we have no - instructions left, don't bother. Also, don't even try if this is - SImode (in which case we should have already done something, but - do a sanity check here). */ + /* If we couldn't do it that way, try some other methods. But if we have + no instructions left, don't bother. */ - if (n == 1 || HOST_BITS_PER_WIDE_INT < 64 || mode != DImode) + if (n == 1) return 0; +#if HOST_BITS_PER_WIDE_INT == 64 /* First, see if can load a value into the target that is the same as the constant except that all bytes that are 0 are changed to be 0xff. If we can, then we can do a ZAPNOT to obtain the desired constant. */ @@ -745,8 +745,9 @@ alpha_emit_set_const (target, mode, c, n) if ((temp = alpha_emit_set_const (subtarget, mode, new, n - 1)) != 0) return expand_binop (mode, and_optab, temp, GEN_INT (c | ~ new), target, 0, OPTAB_WIDEN); +#endif - /* Find, see if we can load a related constant and then shift and possibly + /* Next, see if we can load a related constant and then shift and possibly negate it to get the constant we want. Try this once each increasing numbers of insns. */ @@ -767,8 +768,9 @@ alpha_emit_set_const (target, mode, c, n) if ((bits = exact_log2 (c & - c)) > 0) for (; bits > 0; bits--) - if ((temp = alpha_emit_set_const (subtarget, mode, - c >> bits, i)) != 0 + if ((temp = (alpha_emit_set_const + (subtarget, mode, + (unsigned HOST_WIDE_INT) c >> bits, i))) != 0 || ((temp = (alpha_emit_set_const (subtarget, mode, ((unsigned HOST_WIDE_INT) c) >> bits, i))) |