From 5c4d7cfb47ccf707b4398c7cb5dd51d4a4b260d5 Mon Sep 17 00:00:00 2001 From: Richard Stallman Date: Sun, 18 Oct 1992 05:09:47 +0000 Subject: [PATCH] (store_field): If signed bitfield and want value, sign extend. From-SVN: r2504 --- gcc/expr.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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);