diff options
Diffstat (limited to 'gcc/expr.c')
| -rw-r--r-- | gcc/expr.c | 21 |
1 files changed, 11 insertions, 10 deletions
@@ -127,7 +127,6 @@ static void move_by_pieces_1 (rtx (*) (rtx, ...), enum machine_mode, struct move_by_pieces *); static bool block_move_libcall_safe_for_call_parm (void); static bool emit_block_move_via_movmem (rtx, rtx, rtx, unsigned); -static rtx emit_block_move_via_libcall (rtx, rtx, rtx, bool); static tree emit_block_move_libcall_fn (int); static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned); static rtx clear_by_pieces_1 (void *, HOST_WIDE_INT, enum machine_mode); @@ -135,7 +134,6 @@ static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int); static void store_by_pieces_1 (struct store_by_pieces *, unsigned int); static void store_by_pieces_2 (rtx (*) (rtx, ...), enum machine_mode, struct store_by_pieces *); -static rtx clear_storage_via_libcall (rtx, rtx, bool); static tree clear_storage_libcall_fn (int); static rtx compress_float_constant (rtx, rtx); static rtx get_subtarget (rtx); @@ -1336,7 +1334,7 @@ emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align) /* A subroutine of emit_block_move. Expand a call to memcpy. Return the return value from memcpy, 0 otherwise. */ -static rtx +rtx emit_block_move_via_libcall (rtx dst, rtx src, rtx size, bool tailcall) { rtx dst_addr, src_addr; @@ -2540,8 +2538,8 @@ clear_storage (rtx object, rtx size, enum block_op_methods method) else if (set_storage_via_setmem (object, size, const0_rtx, align)) ; else - return clear_storage_via_libcall (object, size, - method == BLOCK_OP_TAILCALL); + return set_storage_via_libcall (object, size, const0_rtx, + method == BLOCK_OP_TAILCALL); return NULL; } @@ -2549,10 +2547,10 @@ clear_storage (rtx object, rtx size, enum block_op_methods method) /* A subroutine of clear_storage. Expand a call to memset. Return the return value of memset, 0 otherwise. */ -static rtx -clear_storage_via_libcall (rtx object, rtx size, bool tailcall) +rtx +set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall) { - tree call_expr, arg_list, fn, object_tree, size_tree; + tree call_expr, arg_list, fn, object_tree, size_tree, val_tree; enum machine_mode size_mode; rtx retval; @@ -2572,11 +2570,14 @@ clear_storage_via_libcall (rtx object, rtx size, bool tailcall) for returning pointers, we could end up generating incorrect code. */ object_tree = make_tree (ptr_type_node, object); + if (GET_CODE (val) != CONST_INT) + val = convert_to_mode (TYPE_MODE (integer_type_node), val, 1); size_tree = make_tree (sizetype, size); + val_tree = make_tree (integer_type_node, val); fn = clear_storage_libcall_fn (true); arg_list = tree_cons (NULL_TREE, size_tree, NULL_TREE); - arg_list = tree_cons (NULL_TREE, integer_zero_node, arg_list); + arg_list = tree_cons (NULL_TREE, val_tree, arg_list); arg_list = tree_cons (NULL_TREE, object_tree, arg_list); /* Now we have to build up the CALL_EXPR itself. */ @@ -2590,7 +2591,7 @@ clear_storage_via_libcall (rtx object, rtx size, bool tailcall) return retval; } -/* A subroutine of clear_storage_via_libcall. Create the tree node +/* A subroutine of set_storage_via_libcall. Create the tree node for the function we use for block clears. The first time FOR_CALL is true, we call assemble_external. */ |
