summaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-27 14:13:48 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-27 14:13:48 +0000
commit045efd34d7f2bf9b8ea0a372d4b67f6cde0af3ef (patch)
tree457e538cbad868c1a66850e6c9b2be338a4339f3 /gcc/expr.c
parentb024f1ba39461f4df2cb4b4d1cc60b3efd10c785 (diff)
downloadgcc-045efd34d7f2bf9b8ea0a372d4b67f6cde0af3ef.tar.gz
* expr.c (store_expr): Use clear_storage instead of direct memset
libcall. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33484 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index fa249bbddcd..a0b8465cab8 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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)