OSDN Git Service

2010-08-05 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Aug 2010 16:37:38 +0000 (16:37 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Aug 2010 16:37:38 +0000 (16:37 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162918 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index f450d44..1397b74 100644 (file)
@@ -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
index 9134d62..116c8df 100644 (file)
@@ -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);
        }