OSDN Git Service

* expr.c (store_expr): Use clear_storage instead of direct memset
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Apr 2000 14:13:48 +0000 (14:13 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Apr 2000 14:13:48 +0000 (14:13 +0000)
libcall.

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

gcc/ChangeLog
gcc/expr.c

index a642eb6..e2063af 100644 (file)
@@ -1,3 +1,8 @@
+Thu Apr 27 16:11:00 MET DST 2000  Jan Hubicka  <jh@suse.cz>
+
+       * expr.c (store_expr): Use clear_storage instead of direct memset
+       libcall.
+
 Thu Apr 27 10:36:51 2000  Alexandre Oliva  <aoliva@cygnus.com>
 
        * config/mn10300/mn10300.c (mn10300_address_cost): Test
index fa249bb..a0b8465 100644 (file)
@@ -3933,6 +3933,7 @@ store_expr (exp, target, want_value)
                = size_binop (MIN_EXPR,
                              make_tree (sizetype, size),
                              size_int (TREE_STRING_LENGTH (exp)));
+             int align = TYPE_ALIGN (TREE_TYPE (exp));
              rtx copy_size_rtx = expand_expr (copy_size, NULL_RTX,
                                               VOIDmode, 0);
              rtx label = 0;
@@ -3951,6 +3952,9 @@ store_expr (exp, target, want_value)
                {
                  addr = plus_constant (addr, TREE_STRING_LENGTH (exp));
                  size = plus_constant (size, - TREE_STRING_LENGTH (exp));
+                 align = MIN (align, (BITS_PER_UNIT
+                                      * (INTVAL (copy_size_rtx)
+                                         & - INTVAL (copy_size_rtx))));
                }
              else
                {
@@ -3963,10 +3967,12 @@ store_expr (exp, target, want_value)
                                       copy_size_rtx, NULL_RTX, 0,
                                       OPTAB_LIB_WIDEN);
 
+                 align = BITS_PER_UNIT;
                  label = gen_label_rtx ();
                  emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
                                           GET_MODE (size), 0, 0, label);
                }
+             align = MIN (align, expr_align (copy_size));
 
              if (size != const0_rtx)
                {
@@ -3977,22 +3983,7 @@ store_expr (exp, target, want_value)
                                       size, TYPE_MODE (sizetype),
                                       GEN_INT (MEMORY_USE_WO), 
                                       TYPE_MODE (integer_type_node));
-#ifdef TARGET_MEM_FUNCTIONS
-                 emit_library_call (memset_libfunc, 0, VOIDmode, 3,
-                                    addr, ptr_mode,
-                                    const0_rtx, TYPE_MODE (integer_type_node),
-                                    convert_to_mode (TYPE_MODE (sizetype),
-                                                     size,
-                                                     TREE_UNSIGNED (sizetype)),
-                                    TYPE_MODE (sizetype));
-#else
-                 emit_library_call (bzero_libfunc, 0, VOIDmode, 2,
-                                    addr, ptr_mode,
-                                    convert_to_mode (TYPE_MODE (integer_type_node),
-                                                     size,
-                                                     TREE_UNSIGNED (integer_type_node)),
-                                    TYPE_MODE (integer_type_node));
-#endif
+                 clear_storage (gen_rtx_MEM (BLKmode, addr), size, align);
                }
 
              if (label)