Commit ddf4e03f by Richard Henderson Committed by Richard Henderson

expr.c (write_complex_part): Use simplify_gen_subreg when the submode is at…

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
parent 0cb4334e
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> 2004-12-02 H.J. Lu <hongjiu.lu@intel.com>
PR bootstrap/18532 PR bootstrap/18532
......
...@@ -2580,16 +2580,32 @@ clear_storage_libcall_fn (int for_call) ...@@ -2580,16 +2580,32 @@ clear_storage_libcall_fn (int for_call)
static void static void
write_complex_part (rtx cplx, rtx val, bool imag_p) write_complex_part (rtx cplx, rtx val, bool imag_p)
{ {
enum machine_mode cmode;
enum machine_mode imode;
unsigned ibitsize;
if (GET_CODE (cplx) == CONCAT) if (GET_CODE (cplx) == CONCAT)
emit_move_insn (XEXP (cplx, imag_p), val);
else
{ {
enum machine_mode cmode = GET_MODE (cplx); emit_move_insn (XEXP (cplx, imag_p), val);
enum machine_mode imode = GET_MODE_INNER (cmode); return;
unsigned ibitsize = GET_MODE_BITSIZE (imode); }
store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val); 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 /* Extract one of the components of the complex value CPLX. Extract the
...@@ -2620,6 +2636,18 @@ read_complex_part (rtx cplx, bool imag_p) ...@@ -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, return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
true, NULL_RTX, imode, imode); true, NULL_RTX, imode, imode);
} }
......
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