i960.h (CAN_DEBUG_WITHOUT_FP): Don't define it.

Fri Nov 12 15:14:19 1999  Vladimir Makarov  <vmakarov@tofu.to.cygnus.com>

	* i960.h (CAN_DEBUG_WITHOUT_FP): Don't define it.
	(FRAME_POINTER_REQUIRED): Don't worry about nonlocal goto.
	(ELIMINABLE_REGS, CAN_ELIMINATE, INITIAL_ELIMINATION_OFFSET): New.
	(INITIAL_FRAME_POINTER_OFFSET): Remove it.

	* i960.c (i960_function_prologue): Don't allocate space for g8-g11
 	saved on the stack.  Output more accurate stack frame statistics
	into assembler file.

From-SVN: r30511
This commit is contained in:
Vladimir Makarov 1999-11-12 20:26:29 +00:00 committed by Vladimir Makarov
parent 3ca7341a22
commit bcf783f48c
3 changed files with 52 additions and 24 deletions

View file

@ -1,3 +1,14 @@
Fri Nov 12 15:14:19 1999 Vladimir Makarov <vmakarov@tofu.to.cygnus.com>
* i960.h (CAN_DEBUG_WITHOUT_FP): Don't define it.
(FRAME_POINTER_REQUIRED): Don't worry about nonlocal goto.
(ELIMINABLE_REGS, CAN_ELIMINATE, INITIAL_ELIMINATION_OFFSET): New.
(INITIAL_FRAME_POINTER_OFFSET): Remove it.
* i960.c (i960_function_prologue): Don't allocate space for g8-g11
saved on the stack. Output more accurate stack frame statistics
into assembler file.
1999-11-12 11:47 -0800 Zack Weinberg <zack@bitmover.com>
* genextract.c (record_insn_name): New function.

View file

@ -1333,8 +1333,9 @@ i960_function_prologue (file, size)
unsigned int size;
{
register int i, j, nr;
int n_iregs = 0;
int rsize = 0;
int n_saved_regs = 0;
int n_remaining_saved_regs;
int lvar_size;
int actual_fsize, offset;
int gnw, lnw;
struct reg_group *g, *l;
@ -1357,11 +1358,13 @@ i960_function_prologue (file, size)
regs[i] = -1;
/* Count global registers that need saving. */
if (i < 16)
n_iregs++;
n_saved_regs++;
}
else
regs[i] = 0;
n_remaining_saved_regs = n_saved_regs;
epilogue_string[0] = '\0';
if (profile_flag || profile_block_flag)
@ -1397,7 +1400,7 @@ i960_function_prologue (file, size)
(g->length == 2) ? "l" : ""),
reg_names[l->start_reg], reg_names[g->start_reg]);
strcat (epilogue_string, tmpstr);
n_iregs -= g->length;
n_remaining_saved_regs -= g->length;
for (i = 0; i < g->length; i++)
{
regs [i + g->start_reg] = 1;
@ -1415,11 +1418,7 @@ i960_function_prologue (file, size)
lnw = i960_split_reg_group (l, lnw, g->length);
}
/* N_iregs is now the number of global registers that haven't been saved
yet. */
rsize = (n_iregs * 4);
actual_fsize = compute_frame_size (size) + rsize;
actual_fsize = compute_frame_size (size);
#if 0
/* ??? The 1.2.1 compiler does this also. This is meant to round the frame
size up to the nearest multiple of 16. I don't know whether this is
@ -1443,11 +1442,12 @@ i960_function_prologue (file, size)
/* Take hardware register save area created by the call instruction
into account, but store them before the argument block area. */
offset = 64 + actual_fsize - compute_frame_size (0) - rsize;
lvar_size = actual_fsize - compute_frame_size (0) - n_saved_regs * 4;
offset = 64 + lvar_size;
/* Save registers on stack if needed. */
/* ??? Is it worth to use the same algorithm as one for saving
global registers in local registers? */
for (i = 0, j = n_iregs; j > 0 && i < 16; i++)
for (i = 0, j = n_remaining_saved_regs; j > 0 && i < 16; i++)
{
if (regs[i] != -1)
continue;
@ -1480,17 +1480,17 @@ i960_function_prologue (file, size)
offset += nr * 4;
}
if (actual_fsize == 0 && size == 0 && rsize == 0)
if (actual_fsize == 0)
return;
fprintf (file, "\t#Prologue stats:\n");
fprintf (file, "\t# Total Frame Size: %d bytes\n", actual_fsize);
if (size)
fprintf (file, "\t# Local Variable Size: %d bytes\n", size);
if (rsize)
if (lvar_size)
fprintf (file, "\t# Local Variable Size: %d bytes\n", lvar_size);
if (n_saved_regs)
fprintf (file, "\t# Register Save Size: %d regs, %d bytes\n",
n_iregs, rsize);
n_saved_regs, n_saved_regs * 4);
fprintf (file, "\t#End Prologue#\n");
}

View file

@ -94,8 +94,13 @@ Boston, MA 02111-1307, USA. */
#define LIB_SPEC "%{!nostdlib:-lcg %{p:-lprof}%{pg:-lgprof}\
%{mka:-lfpg}%{msa:-lfpg}%{mca:-lfpg}%{mcf:-lfpg} -lgnu}"
/* Show we can debug even without a frame pointer. */
#define CAN_DEBUG_WITHOUT_FP
/* Defining the macro shows we can debug even without a frame pointer.
Actually, we can debug without FP. But defining the macro results in
that -O means FP elimination. Addressing through sp requires
negative offset and more one word addressing in the most cases
(offsets except for 0-4095 require one more word). Therefore we've
not defined the macro. */
/*#define CAN_DEBUG_WITHOUT_FP*/
/* Do leaf procedure and tail call optimizations for -O2 and higher. */
#define OPTIMIZATION_OPTIONS(LEVEL,SIZE) \
@ -611,18 +616,30 @@ extern int hard_regno_mode_ok ();
elimination messes up nonlocal goto sequences. I think this works for other
targets because they use indirect jumps for the return which disables fp
elimination. */
#define FRAME_POINTER_REQUIRED \
(! leaf_function_p () || current_function_has_nonlocal_goto)
#define FRAME_POINTER_REQUIRED (! leaf_function_p ())
/* C statement to store the difference between the frame pointer
and the stack pointer values immediately after the function prologue.
/* Definitions for register eliminations.
This is an array of structures. Each structure initializes one pair
of eliminable registers. The "from" register number is given first,
followed by "to". Eliminations of the same "from" register are listed
in order of preference.. */
#define ELIMINABLE_REGS {{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
/* Given FROM and TO register numbers, say whether this elimination is allowed.
Frame pointer elimination is automatically handled. */
#define CAN_ELIMINATE(FROM, TO) 1
/* Define the offset between two registers, one to be eliminated, and
the other its replacement, at the start of a routine.
Since the stack grows upward on the i960, this must be a negative number.
This includes the 64 byte hardware register save area and the size of
the frame. */
#define INITIAL_FRAME_POINTER_OFFSET(VAR) \
do { (VAR) = - (64 + compute_frame_size (get_frame_size ())); } while (0)
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
do { (OFFSET) = - (64 + compute_frame_size (get_frame_size ())); } while (0)
/* Base register for access to arguments of the function. */
#define ARG_POINTER_REGNUM 14