aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2000-04-27 14:13:48 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2000-04-27 14:13:48 +0000
commit2a5b96fdb1cdccc1dfe2c8feb36ddaec7ac08069 (patch)
tree457e538cbad868c1a66850e6c9b2be338a4339f3 /gcc/expr.c
parent6d844225475f369c544da9102d808b915d71d4d9 (diff)
downloadgcc-2a5b96fdb1cdccc1dfe2c8feb36ddaec7ac08069.zip
gcc-2a5b96fdb1cdccc1dfe2c8feb36ddaec7ac08069.tar.gz
gcc-2a5b96fdb1cdccc1dfe2c8feb36ddaec7ac08069.tar.bz2
expr.c (store_expr): Use clear_storage instead of direct memset libcall.
* expr.c (store_expr): Use clear_storage instead of direct memset libcall. From-SVN: r33484
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 fa249bb..a0b8465 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)