From: Richard Stallman Date: Sun, 18 Oct 1992 05:09:47 +0000 (+0000) Subject: (store_field): If signed bitfield and want value, sign extend. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5c4d7cfb47ccf707b4398c7cb5dd51d4a4b260d5;p=gcc.git (store_field): If signed bitfield and want value, sign extend. From-SVN: r2504 --- diff --git a/gcc/expr.c b/gcc/expr.c index a9c6ff1c711..db911c87acb 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2702,7 +2702,16 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, /* If possible, avoid refetching from the bitfield itself. */ if (width_mask != 0 && ! (GET_CODE (target) == MEM && MEM_VOLATILE_P (target))) - return expand_and (temp, GEN_INT (width_mask), NULL_RTX); + { + rtx count; + enum machine_mode tmode; + if (unsignedp) + return expand_and (temp, GEN_INT (width_mask), NULL_RTX); + tmode = GET_MODE (temp); + count = build_int_2 (GET_MODE_BITSIZE (tmode) - bitsize, 0); + temp = expand_shift (LSHIFT_EXPR, tmode, temp, count, 0, 0); + return expand_shift (RSHIFT_EXPR, tmode, temp, count, 0, 0); + } return extract_bit_field (target, bitsize, bitpos, unsignedp, NULL_RTX, value_mode, 0, align, total_size);