expr.c (write_complex_part): Use simplify_gen_subreg when the submode is at least as large as a word.
* expr.c (write_complex_part): Use simplify_gen_subreg when the submode is at least as large as a word. (read_complex_part): Likewise. From-SVN: r91664
This commit is contained in:
parent
0cb4334ee9
commit
ddf4e03f48
2 changed files with 42 additions and 8 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-12-02 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* expr.c (write_complex_part): Use simplify_gen_subreg when the
|
||||
submode is at least as large as a word.
|
||||
(read_complex_part): Likewise.
|
||||
|
||||
2004-12-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR bootstrap/18532
|
||||
|
|
44
gcc/expr.c
44
gcc/expr.c
|
@ -2580,16 +2580,32 @@ clear_storage_libcall_fn (int for_call)
|
|||
static void
|
||||
write_complex_part (rtx cplx, rtx val, bool imag_p)
|
||||
{
|
||||
if (GET_CODE (cplx) == CONCAT)
|
||||
emit_move_insn (XEXP (cplx, imag_p), val);
|
||||
else
|
||||
{
|
||||
enum machine_mode cmode = GET_MODE (cplx);
|
||||
enum machine_mode imode = GET_MODE_INNER (cmode);
|
||||
unsigned ibitsize = GET_MODE_BITSIZE (imode);
|
||||
enum machine_mode cmode;
|
||||
enum machine_mode imode;
|
||||
unsigned ibitsize;
|
||||
|
||||
store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val);
|
||||
if (GET_CODE (cplx) == CONCAT)
|
||||
{
|
||||
emit_move_insn (XEXP (cplx, imag_p), val);
|
||||
return;
|
||||
}
|
||||
|
||||
cmode = GET_MODE (cplx);
|
||||
imode = GET_MODE_INNER (cmode);
|
||||
ibitsize = GET_MODE_BITSIZE (imode);
|
||||
|
||||
/* If the sub-object is at least word sized, then we know that subregging
|
||||
will work. This special case is important, since store_bit_field
|
||||
wants to operate on integer modes, and there's rarely an OImode to
|
||||
correspond to TCmode. */
|
||||
if (ibitsize >= BITS_PER_WORD)
|
||||
{
|
||||
rtx part = simplify_gen_subreg (imode, cplx, cmode,
|
||||
imag_p ? GET_MODE_SIZE (imode) : 0);
|
||||
emit_move_insn (part, val);
|
||||
}
|
||||
else
|
||||
store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val);
|
||||
}
|
||||
|
||||
/* Extract one of the components of the complex value CPLX. Extract the
|
||||
|
@ -2620,6 +2636,18 @@ read_complex_part (rtx cplx, bool imag_p)
|
|||
}
|
||||
}
|
||||
|
||||
/* If the sub-object is at least word sized, then we know that subregging
|
||||
will work. This special case is important, since extract_bit_field
|
||||
wants to operate on integer modes, and there's rarely an OImode to
|
||||
correspond to TCmode. */
|
||||
if (ibitsize >= BITS_PER_WORD)
|
||||
{
|
||||
rtx ret = simplify_gen_subreg (imode, cplx, cmode,
|
||||
imag_p ? GET_MODE_SIZE (imode) : 0);
|
||||
gcc_assert (ret != NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
|
||||
true, NULL_RTX, imode, imode);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue