From 48b4d9013aea77920fae83d3d5103f67023605e2 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Tue, 30 Jan 2001 22:27:44 +0000 Subject: [PATCH] combine.c (try_combine): Fix SUBREG setting for HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD. * combine.c (try_combine): Fix SUBREG setting for HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD. From-SVN: r39355 --- gcc/ChangeLog | 5 +++++ gcc/combine.c | 27 +++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22c5b2d1ccc..abc714195af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-01-30 Alexandre Oliva + + * combine.c (try_combine): Fix SUBREG setting for + HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD. + 2001-01-30 Franz Sirl * jump.c (comparison_dominates_p): Don't try to handle UNKNOWN diff --git a/gcc/combine.c b/gcc/combine.c index 9b721af4df4..74b02b55a47 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -1661,9 +1661,32 @@ try_combine (i3, i2, i1, new_direct_jump_p) } if (subreg_lowpart_p (SET_DEST (PATTERN (i3)))) - lo = INTVAL (SET_SRC (PATTERN (i3))); - else + { + /* We don't handle the case of the target word being wider + than a host wide int. */ + if (HOST_BITS_PER_WIDE_INT < BITS_PER_WORD) + abort (); + + lo &= ~(((unsigned HOST_WIDE_INT)1 << BITS_PER_WORD) - 1); + lo |= INTVAL (SET_SRC (PATTERN (i3))); + } + else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) hi = INTVAL (SET_SRC (PATTERN (i3))); + else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD) + { + int sign = -(int) ((unsigned HOST_WIDE_INT) lo + >> (HOST_BITS_PER_WIDE_INT - 1)); + + lo &= ~((((unsigned HOST_WIDE_INT)1 << BITS_PER_WORD) - 1) + << BITS_PER_WORD); + lo |= INTVAL (SET_SRC (PATTERN (i3))) << BITS_PER_WORD; + if (hi == sign) + hi = lo < 0 ? -1 : 0; + } + else + /* We don't handle the case of the higher word not fitting + entirely in either hi or lo. */ + abort (); combine_merges++; subst_insn = i3; -- 2.30.2