(store_fixed_bit_field): Move float mode to integral
mode conversion from near end of function to top of function. From-SVN: r6657
This commit is contained in:
parent
d27c148b76
commit
a5f00f07f1
22
gcc/expmed.c
22
gcc/expmed.c
@ -517,6 +517,17 @@ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align)
|
||||
int all_zero = 0;
|
||||
int all_one = 0;
|
||||
|
||||
/* If VALUE is a floating-point mode, access it as an integer of the
|
||||
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. */
|
||||
if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT)
|
||||
{
|
||||
if (GET_CODE (value) != REG)
|
||||
value = copy_to_reg (value);
|
||||
value = gen_rtx (SUBREG, word_mode, value, 0);
|
||||
}
|
||||
|
||||
/* There is a case not handled here:
|
||||
a structure with a known alignment of just a halfword
|
||||
and a field split across two aligned halfwords within the structure.
|
||||
@ -612,17 +623,6 @@ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align)
|
||||
|
||||
if (GET_MODE (value) != mode)
|
||||
{
|
||||
/* If VALUE is a floating-point mode, access it as an integer
|
||||
of the corresponding size, then convert it. This can occur on
|
||||
a machine with 64 bit registers that uses SFmode for float. */
|
||||
if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT)
|
||||
{
|
||||
if (GET_CODE (value) != REG)
|
||||
value = copy_to_reg (value);
|
||||
value
|
||||
= gen_rtx (SUBREG, word_mode, value, 0);
|
||||
}
|
||||
|
||||
if ((GET_CODE (value) == REG || GET_CODE (value) == SUBREG)
|
||||
&& GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (value)))
|
||||
value = gen_lowpart (mode, value);
|
||||
|
Loading…
Reference in New Issue
Block a user