(expand_expr, case CONSTRUCTOR): Don't set target to zero if more then one word.
authorRichard Kenner <kenner@gcc.gnu.org>
Sun, 30 Apr 1995 11:22:58 +0000 (07:22 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Sun, 30 Apr 1995 11:22:58 +0000 (07:22 -0400)
(expand_expr, case CONSTRUCTOR): Don't set target to zero if more then one
word.
Pass size and alignment to move_by_pieces_ninsns in bytes, not bits.

From-SVN: r9548

gcc/expr.c

index 818618927ca854fc9acb29dcfe8bd308fd59de52..e940ccb3a9c3842de6cf99092c3d071bac0055a1 100644 (file)
@@ -2984,8 +2984,10 @@ store_constructor (exp, target)
 
       /* If we are building a static constructor into a register,
         set the initial value as zero so we can fold the value into
-        a constant.  */
-      else if (GET_CODE (target) == REG && TREE_STATIC (exp))
+        a constant.  But if more than one register is involved,
+        this probably loses.  */
+      else if (GET_CODE (target) == REG && TREE_STATIC (exp)
+              && GET_MODE_SIZE (GET_MODE (target)) <= UNITS_PER_WORD)
        emit_move_insn (target, const0_rtx);
 
       /* If the constructor has fewer fields than the structure,
@@ -4473,8 +4475,8 @@ expand_expr (exp, target, tmode, modifier)
                    || TREE_ADDRESSABLE (exp)
                    || (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
                        && (move_by_pieces_ninsns
-                           (TREE_INT_CST_LOW (TYPE_SIZE (type)),
-                            TYPE_ALIGN (type))
+                           (TREE_INT_CST_LOW (TYPE_SIZE (type))/BITS_PER_UNIT,
+                            TYPE_ALIGN (type) / BITS_PER_UNIT)
                            > MOVE_RATIO))))
               || (modifier == EXPAND_INITIALIZER && TREE_CONSTANT (exp)))
        {