summaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-12-02 22:23:08 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-12-02 22:23:08 +0000
commita3b104d2ce5477fe401c3296f9e40e6cd0060202 (patch)
tree34661c965cd2f7f4836dd21e2abf24265c20627b /gcc/expr.c
parentd44c82c9ba6566997144b2863ad87aa91148352a (diff)
downloadgcc-a3b104d2ce5477fe401c3296f9e40e6cd0060202.tar.gz
* expr.c (write_complex_part): Use simplify_gen_subreg when the
submode is at least as large as a word. (read_complex_part): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91664 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index f16f82f10a7..ec25713c5e9 100644
--- a/gcc/expr.c
+++ b/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)
{
+ enum machine_mode cmode;
+ enum machine_mode imode;
+ unsigned ibitsize;
+
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);
+ emit_move_insn (XEXP (cplx, imag_p), val);
+ return;
+ }
- 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
@@ -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);
}