diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f450d44..1397b74 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-05 Richard Guenther <rguenther@suse.de> + + * expr.c (store_expr): Use emit_block_move only if both + source and target are MEMs. Use store_bit_field if only + the target is a MEM. + 2010-08-05 Richard Henderson <rth@redhat.com> PR 45189 @@ -4752,11 +4752,14 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal) { int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); if (GET_MODE (target) == BLKmode - || GET_MODE (temp) == BLKmode) + && GET_MODE (temp) == BLKmode) emit_block_move (target, temp, expr_size (exp), (call_param_p ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL)); + else if (GET_MODE (target) == BLKmode) + store_bit_field (target, INTVAL (expr_size (exp)) * BITS_PER_UNIT, + 0, GET_MODE (temp), temp); else convert_move (target, temp, unsignedp); } |