From 3cc25a48377424b5cc1637ce551cf13b058ba939 Mon Sep 17 00:00:00 2001 From: aldyh Date: Thu, 21 Oct 2004 10:51:02 +0000 Subject: PR 18004. * expmed.c (store_bit_field): Pass original 'value' before recursing. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89369 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/expmed.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gcc/expmed.c') diff --git a/gcc/expmed.c b/gcc/expmed.c index 2601361f60e..67224413e8a 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -338,6 +338,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, unsigned HOST_WIDE_INT bitpos = bitnum % unit; rtx op0 = str_rtx; int byte_offset; + rtx orig_value; enum machine_mode op_mode = mode_for_extraction (EP_insv, 3); @@ -601,6 +602,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, corresponding size. This can occur on a machine with 64 bit registers that uses SFmode for float. This can also occur for unaligned float structure fields. */ + orig_value = value; if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT && GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT) value = gen_lowpart ((GET_MODE (value) == VOIDmode @@ -667,7 +669,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, /* Fetch that unit, store the bitfield in it, then store the unit. */ tempreg = copy_to_reg (op0); - store_bit_field (tempreg, bitsize, bitpos, fieldmode, value); + store_bit_field (tempreg, bitsize, bitpos, fieldmode, orig_value); emit_move_insn (op0, tempreg); return value; } -- cgit v1.2.1