Commit 28526e20 by Aldy Hernandez Committed by Aldy Hernandez

re PR target/18004 (ICE in output_constant_pool_2 for aligned(1) float in struct)

	PR 18004.
	* expmed.c (store_bit_field): Pass original 'value' before
	recursing.

From-SVN: r89369
parent be3d702c
2004-10-21 Aldy Hernandez <aldyh@redhat.com>
PR 18004.
* expmed.c (store_bit_field): Pass original 'value' before
recursing.
2004-10-21 Nicolas Pitre <nico@cam.org> 2004-10-21 Nicolas Pitre <nico@cam.org>
* config/arm/ieee754-sf.S: Large speed improvements. Fix NAN handling. * config/arm/ieee754-sf.S: Large speed improvements. Fix NAN handling.
......
...@@ -338,6 +338,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, ...@@ -338,6 +338,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
unsigned HOST_WIDE_INT bitpos = bitnum % unit; unsigned HOST_WIDE_INT bitpos = bitnum % unit;
rtx op0 = str_rtx; rtx op0 = str_rtx;
int byte_offset; int byte_offset;
rtx orig_value;
enum machine_mode op_mode = mode_for_extraction (EP_insv, 3); 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, ...@@ -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 corresponding size. This can occur on a machine with 64 bit registers
that uses SFmode for float. This can also occur for unaligned float that uses SFmode for float. This can also occur for unaligned float
structure fields. */ structure fields. */
orig_value = value;
if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT
&& GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT) && GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT)
value = gen_lowpart ((GET_MODE (value) == VOIDmode value = gen_lowpart ((GET_MODE (value) == VOIDmode
...@@ -667,7 +669,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, ...@@ -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 /* Fetch that unit, store the bitfield in it, then store
the unit. */ the unit. */
tempreg = copy_to_reg (op0); 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); emit_move_insn (op0, tempreg);
return value; return value;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment