* alpha.c (alpha_emit_set_const_1): Handle narrow hosts better.

From-SVN: r16627
This commit is contained in:
Richard Henderson 1997-11-20 18:08:30 -08:00 committed by Jeff Law
parent a21d14e991
commit 858e4e8cfd
2 changed files with 22 additions and 7 deletions

View File

@ -1,3 +1,7 @@
Thu Nov 20 16:11:50 1997 Richard Henderson <rth@cygnus.com>
* alpha.c (alpha_emit_set_const_1): Handle narrow hosts better.
Thu Nov 20 16:11:50 1997 Klaus Kaempf <kkaempf@progis.de>
* alpha/vms.h (ASM_OUTPUT_ADDR_VEC_ELT): Add an L for the local label

View File

@ -904,12 +904,10 @@ alpha_emit_set_const_1 (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.
Note that we cannot handle the constant 0x80000000. */
a sign-extended 32-bit constant when compiling on a narrow machine. */
if ((HOST_BITS_PER_WIDE_INT != 64
|| c >> 31 == -1 || c >> 31 == 0)
&& c != 0x80000000U)
if (HOST_BITS_PER_WIDE_INT != 64
|| c >> 31 == -1 || c >> 31 == 0)
{
HOST_WIDE_INT low = (c & 0xffff) - 2 * (c & 0x8000);
HOST_WIDE_INT tmp1 = c - low;
@ -928,7 +926,18 @@ alpha_emit_set_const_1 (target, mode, c, n)
}
if (c == low || (low == 0 && extra == 0))
return copy_to_suggested_reg (GEN_INT (c), target, mode);
{
/* We used to use copy_to_suggested_reg (GEN_INT (c), target, mode)
but that meant that we can't handle INT_MIN on 32-bit machines
(like NT/Alpha), because we recurse indefinitely through
emit_move_insn to gen_movdi. So instead, since we know exactly
what we want, create it explicitly. */
if (target == NULL)
target = gen_reg_rtx (mode);
emit_insn (gen_rtx (SET, VOIDmode, target, GEN_INT (c)));
return target;
}
else if (n >= 2 + (extra != 0))
{
temp = copy_to_suggested_reg (GEN_INT (low), subtarget, mode);
@ -1006,9 +1015,11 @@ alpha_emit_set_const_1 (target, mode, c, n)
/* Now try high-order zero bits. Here we try the shifted-in bits as
all zero and all ones. Be careful to avoid shifting outside the
mode and to avoid shifting outside the host wide int size. */
/* On narrow hosts, don't shift a 1 into the high bit, since we'll
confuse the recursive call and set all of the high 32 bits. */
if ((bits = (MIN (HOST_BITS_PER_WIDE_INT, GET_MODE_SIZE (mode) * 8)
- floor_log2 (c) - 1)) > 0)
- floor_log2 (c) - 1 - (HOST_BITS_PER_WIDE_INT < 64))) > 0)
for (; bits > 0; bits--)
if ((temp = alpha_emit_set_const (subtarget, mode,
c << bits, i)) != 0