aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-08-05 16:37:38 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-08-05 16:37:38 +0000
commit29e9efdf755f49cc25a664586c42eacd43e611e0 (patch)
treedfdf3d90662bbb674a86d1f0e732bbad9e8aa718 /gcc/expr.c
parentc3576fa73ff12307297fe73ff8c92ff059669e3a (diff)
downloadgcc-29e9efdf755f49cc25a664586c42eacd43e611e0.zip
gcc-29e9efdf755f49cc25a664586c42eacd43e611e0.tar.gz
gcc-29e9efdf755f49cc25a664586c42eacd43e611e0.tar.bz2
expr.c (store_expr): Use emit_block_move only if both source and target are MEMs.
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. From-SVN: r162918
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 9134d62..116c8df 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
}