From ceb7983c7c9d08b444761ebbb375e12ca78a5852 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Thu, 7 Oct 1993 08:14:16 -0400 Subject: [PATCH] (force_to_mode): Sign-extend constant being truncated. From-SVN: r5654 --- gcc/combine.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/combine.c b/gcc/combine.c index 8f9efb86caa..abc224cb97d 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -5614,7 +5614,18 @@ force_to_mode (x, mode, mask, reg) /* If X is a CONST_INT, return a new one. Do this here since the test below will fail. */ if (GET_CODE (x) == CONST_INT) - return GEN_INT (INTVAL (x) & mask); + { + HOST_WIDE_INT cval = INTVAL (x) & mask; + int width = GET_MODE_BITSIZE (mode); + + /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative + number, sign extend it. */ + if (width > 0 && width < HOST_BITS_PER_WIDE_INT + && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) + cval |= (HOST_WIDE_INT) -1 << width; + + return GEN_INT (cval); + } /* If X is narrower than MODE, just get X in the proper mode. */ if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)) -- 2.30.2