From: Richard Henderson Date: Fri, 21 Nov 1997 02:07:26 +0000 (-0800) Subject: * alpha.c (alpha_emit_set_const_1): Handle narrow hosts better. X-Git-Tag: releases/egcs-1.0.0~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=286e6ab133b3928f9d277073d83ec0ec0c784250;p=thirdparty%2Fgcc.git * alpha.c (alpha_emit_set_const_1): Handle narrow hosts better. From-SVN: r16626 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 94a7767975a7..1f9219c86567 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Thu Nov 20 16:11:50 1997 Richard Henderson + + * alpha.c (alpha_emit_set_const_1): Handle narrow hosts better. + Thu Nov 20 16:11:50 1997 Klaus Kaempf * alpha/vms.h (ASM_OUTPUT_ADDR_VEC_ELT): Add an L for the local label diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 5c109c43261f..6a4c3a8f0c40 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -887,12 +887,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; @@ -911,7 +909,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); @@ -989,9 +998,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