From b820d2b8702a1702e8e869fcdb2382e89f014b4c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 26 Jan 2003 02:07:48 +0000 Subject: [PATCH] calls.c (save_fixed_argument_area): Tidy. * calls.c (save_fixed_argument_area): Tidy. (restore_fixed_argument_area): Tidy. Set alignment of stack_area. (expand_call): Comment typo fixes. Don't init low_to_save. Start call chain loop at 1 if !try_tail_call. Formatting. (emit_library_call_value_1): Don't init low_to_save or high_to_save. Use save_fixed_argument_area and restore_fixed_argument_area. From-SVN: r61818 --- gcc/ChangeLog | 9 +++ gcc/calls.c | 218 ++++++++++++++++---------------------------------- 2 files changed, 79 insertions(+), 148 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5908f6044a7..48a880c39d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-01-26 Alan Modra + + * calls.c (save_fixed_argument_area): Tidy. + (restore_fixed_argument_area): Tidy. Set alignment of stack_area. + (expand_call): Comment typo fixes. Don't init low_to_save. Start + call chain loop at 1 if !try_tail_call. Formatting. + (emit_library_call_value_1): Don't init low_to_save or high_to_save. + Use save_fixed_argument_area and restore_fixed_argument_area. + 2003-01-26 Michael Hayes * df.c (df_uses_record): Handle CC0. diff --git a/gcc/calls.c b/gcc/calls.c index 1c51e1a8b6f..d85e2388295 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1,6 +1,6 @@ /* Convert function calls to rtl insns, for GNU C compiler. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998 - 1999, 2000, 2001 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -912,66 +912,68 @@ save_fixed_argument_area (reg_parm_stack_space, argblock, int *low_to_save; int *high_to_save; { - int i; - rtx save_area = NULL_RTX; + int low; + int high; - /* Compute the boundary of the that needs to be saved, if any. */ + /* Compute the boundary of the area that needs to be saved, if any. */ + high = reg_parm_stack_space; #ifdef ARGS_GROW_DOWNWARD - for (i = 0; i < reg_parm_stack_space + 1; i++) -#else - for (i = 0; i < reg_parm_stack_space; i++) + high += 1; #endif - { - if (i >= highest_outgoing_arg_in_use - || stack_usage_map[i] == 0) - continue; + if (high > highest_outgoing_arg_in_use) + high = highest_outgoing_arg_in_use; - if (*low_to_save == -1) - *low_to_save = i; + for (low = 0; low < high; low++) + if (stack_usage_map[low] != 0) + { + int num_to_save; + enum machine_mode save_mode; + int delta; + rtx stack_area; + rtx save_area; - *high_to_save = i; - } + while (stack_usage_map[--high] == 0) + ; - if (*low_to_save >= 0) - { - int num_to_save = *high_to_save - *low_to_save + 1; - enum machine_mode save_mode - = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1); - rtx stack_area; + *low_to_save = low; + *high_to_save = high; - /* If we don't have the required alignment, must do this in BLKmode. */ - if ((*low_to_save & (MIN (GET_MODE_SIZE (save_mode), - BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1))) - save_mode = BLKmode; + num_to_save = high - low + 1; + save_mode = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1); + + /* If we don't have the required alignment, must do this + in BLKmode. */ + if ((low & (MIN (GET_MODE_SIZE (save_mode), + BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1))) + save_mode = BLKmode; #ifdef ARGS_GROW_DOWNWARD - stack_area - = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - - *high_to_save))); + delta = -high; #else - stack_area = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - *low_to_save))); + delta = low; #endif + stack_area = gen_rtx_MEM (save_mode, + memory_address (save_mode, + plus_constant (argblock, + delta))); - set_mem_align (stack_area, PARM_BOUNDARY); - if (save_mode == BLKmode) - { - save_area = assign_stack_temp (BLKmode, num_to_save, 0); - emit_block_move (validize_mem (save_area), stack_area, - GEN_INT (num_to_save), BLOCK_OP_CALL_PARM); - } - else - { - save_area = gen_reg_rtx (save_mode); - emit_move_insn (save_area, stack_area); - } - } + set_mem_align (stack_area, PARM_BOUNDARY); + if (save_mode == BLKmode) + { + save_area = assign_stack_temp (BLKmode, num_to_save, 0); + emit_block_move (validize_mem (save_area), stack_area, + GEN_INT (num_to_save), BLOCK_OP_CALL_PARM); + } + else + { + save_area = gen_reg_rtx (save_mode); + emit_move_insn (save_area, stack_area); + } - return save_area; + return save_area; + } + + return NULL_RTX; } static void @@ -982,19 +984,18 @@ restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save) int low_to_save; { enum machine_mode save_mode = GET_MODE (save_area); + int delta; + rtx stack_area; + #ifdef ARGS_GROW_DOWNWARD - rtx stack_area - = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - - high_to_save))); + delta = -high_to_save; #else - rtx stack_area - = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - low_to_save))); + delta = low_to_save; #endif + stack_area = gen_rtx_MEM (save_mode, + memory_address (save_mode, + plus_constant (argblock, delta))); + set_mem_align (stack_area, PARM_BOUNDARY); if (save_mode != BLKmode) emit_move_insn (stack_area, save_area); @@ -2194,8 +2195,8 @@ expand_call (exp, target, ignore) int is_integrable = 0; #ifdef REG_PARM_STACK_SPACE /* Define the boundary of the register parm stack space that needs to be - save, if any. */ - int low_to_save = -1, high_to_save; + saved, if any. */ + int low_to_save, high_to_save; rtx save_area = 0; /* Place that it is saved */ #endif @@ -2632,7 +2633,7 @@ expand_call (exp, target, ignore) /* We want to make two insn chains; one for a sibling call, the other for a normal call. We will select one of the two chains after initial RTL generation is complete. */ - for (pass = 0; pass < 2; pass++) + for (pass = try_tail_call ? 0 : 1; pass < 2; pass++) { int sibcall_failure = 0; /* We want to emit any pending stack adjustments before the tail @@ -2646,9 +2647,6 @@ expand_call (exp, target, ignore) if (pass == 0) { - if (! try_tail_call) - continue; - /* Emit any queued insns now; otherwise they would end up in only one of the alternates. */ emit_queue (); @@ -3320,10 +3318,8 @@ expand_call (exp, target, ignore) { #ifdef REG_PARM_STACK_SPACE if (save_area) - { - restore_fixed_argument_area (save_area, argblock, - high_to_save, low_to_save); - } + restore_fixed_argument_area (save_area, argblock, + high_to_save, low_to_save); #endif /* If we saved any argument areas, restore them. */ @@ -3511,7 +3507,7 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) #ifdef REG_PARM_STACK_SPACE /* Define the boundary of the register parm stack space that needs to be save, if any. */ - int low_to_save = -1, high_to_save = 0; + int low_to_save, high_to_save; rtx save_area = 0; /* Place that it is saved. */ #endif @@ -3892,62 +3888,9 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) { /* The argument list is the property of the called routine and it may clobber it. If the fixed area has been used for previous - parameters, we must save and restore it. - - Here we compute the boundary of the that needs to be saved, if any. */ - -#ifdef ARGS_GROW_DOWNWARD - for (count = 0; count < reg_parm_stack_space + 1; count++) -#else - for (count = 0; count < reg_parm_stack_space; count++) -#endif - { - if (count >= highest_outgoing_arg_in_use - || stack_usage_map[count] == 0) - continue; - - if (low_to_save == -1) - low_to_save = count; - - high_to_save = count; - } - - if (low_to_save >= 0) - { - int num_to_save = high_to_save - low_to_save + 1; - enum machine_mode save_mode - = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1); - rtx stack_area; - - /* If we don't have the required alignment, must do this in BLKmode. */ - if ((low_to_save & (MIN (GET_MODE_SIZE (save_mode), - BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1))) - save_mode = BLKmode; - -#ifdef ARGS_GROW_DOWNWARD - stack_area = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - -high_to_save))); -#else - stack_area = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - low_to_save))); -#endif - if (save_mode == BLKmode) - { - save_area = assign_stack_temp (BLKmode, num_to_save, 0); - set_mem_align (save_area, PARM_BOUNDARY); - emit_block_move (save_area, stack_area, GEN_INT (num_to_save), - BLOCK_OP_CALL_PARM); - } - else - { - save_area = gen_reg_rtx (save_mode); - emit_move_insn (save_area, stack_area); - } - } + parameters, we must save and restore it. */ + save_area = save_fixed_argument_area (reg_parm_stack_space, argblock, + &low_to_save, &high_to_save); } #endif @@ -4192,29 +4135,8 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) { #ifdef REG_PARM_STACK_SPACE if (save_area) - { - enum machine_mode save_mode = GET_MODE (save_area); -#ifdef ARGS_GROW_DOWNWARD - rtx stack_area - = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, - - high_to_save))); -#else - rtx stack_area - = gen_rtx_MEM (save_mode, - memory_address (save_mode, - plus_constant (argblock, low_to_save))); -#endif - - set_mem_align (stack_area, PARM_BOUNDARY); - if (save_mode != BLKmode) - emit_move_insn (stack_area, save_area); - else - emit_block_move (stack_area, save_area, - GEN_INT (high_to_save - low_to_save + 1), - BLOCK_OP_CALL_PARM); - } + restore_fixed_argument_area (save_area, argblock, + high_to_save, low_to_save); #endif /* If we saved any argument areas, restore them. */