]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr.c (store_expr): Use emit_block_move only if both source and target are MEMs.
authorRichard Guenther <rguenther@suse.de>
Thu, 5 Aug 2010 16:37:38 +0000 (16:37 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 5 Aug 2010 16:37:38 +0000 (16:37 +0000)
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

gcc/ChangeLog
gcc/expr.c

index f450d44525fe60679362dbb4fea8d9f137fff32b..1397b74eb991de01c19e1422db646642b95f6aa1 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 9134d6215b2ced5578f94170e691c9fbf83128fd..116c8df0f8ef81dd0f13922926e10b7531dc8a6e 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);
        }