mmix.c: Improve comments.
* config/mmix/mmix.c: Improve comments. (mmix_target_asm_function_prologue): Drop variable empty_stack_frame. Don't allocate unused slot above fp. (mmix_target_asm_function_epilogue): Mirror prologue changes. * config/mmix/mmix.h (MMIX_GNU_ABI_REG_ALLOC_ORDER): Don't have brace in first column. (enum reg_class): Ditto. (FIRST_PARM_OFFSET): Now 0. (USER_LABEL_PREFIX): Remove #if 0:d definition. From-SVN: r50538
This commit is contained in:
parent
0c1fcb02b1
commit
3ec1b4cb7e
@ -1,3 +1,15 @@
|
||||
2002-03-10 Hans-Peter Nilsson <hp@bitrange.com>
|
||||
|
||||
* config/mmix/mmix.c: Improve comments.
|
||||
(mmix_target_asm_function_prologue): Drop variable
|
||||
empty_stack_frame. Don't allocate unused slot above fp.
|
||||
(mmix_target_asm_function_epilogue): Mirror prologue changes.
|
||||
* config/mmix/mmix.h (MMIX_GNU_ABI_REG_ALLOC_ORDER): Don't have
|
||||
brace in first column.
|
||||
(enum reg_class): Ditto.
|
||||
(FIRST_PARM_OFFSET): Now 0.
|
||||
(USER_LABEL_PREFIX): Remove #if 0:d definition.
|
||||
|
||||
2002-03-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* combine.c (make_extraction): Fix error in last change.
|
||||
|
@ -414,7 +414,10 @@ mmix_return_addr_rtx (count, frame)
|
||||
{
|
||||
return count == 0
|
||||
? (MMIX_CFUN_NEEDS_SAVED_EH_RETURN_ADDRESS
|
||||
/* FIXME: Set frame_alias_set on the following. */
|
||||
/* FIXME: Set frame_alias_set on the following. (Why?)
|
||||
See mmix_initial_elimination_offset for the reason we can't use
|
||||
get_hard_reg_initial_val for both. Always using a stack slot
|
||||
and not a register would be suboptimal. */
|
||||
? validize_mem (gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx, -16)))
|
||||
: get_hard_reg_initial_val (Pmode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM))
|
||||
: NULL_RTX;
|
||||
@ -440,7 +443,10 @@ mmix_initial_elimination_offset (fromreg, toreg)
|
||||
int fp_sp_offset
|
||||
= (get_frame_size () + current_function_outgoing_args_size + 7) & ~7;
|
||||
|
||||
/* There is no actual difference between these two. */
|
||||
/* There is no actual offset between these two virtual values, but for
|
||||
the frame-pointer, we have the old one in the stack position below
|
||||
it, so the offset for the frame-pointer to the stack-pointer is one
|
||||
octabyte larger. */
|
||||
if (fromreg == MMIX_ARG_POINTER_REGNUM
|
||||
&& toreg == MMIX_FRAME_POINTER_REGNUM)
|
||||
return 0;
|
||||
@ -661,14 +667,8 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
int stack_space_to_allocate
|
||||
= (current_function_outgoing_args_size
|
||||
+ current_function_pretend_args_size
|
||||
+ (int) locals_size + 8 + 7) & ~7;
|
||||
+ (int) locals_size + 7) & ~7;
|
||||
int offset = -8;
|
||||
int empty_stack_frame
|
||||
= (current_function_outgoing_args_size == 0
|
||||
&& locals_size == 0
|
||||
&& current_function_pretend_args_size == 0
|
||||
&& current_function_varargs == 0
|
||||
&& current_function_stdarg == 0);
|
||||
int doing_dwarf = dwarf2out_do_frame ();
|
||||
long cfa_offset = 0;
|
||||
|
||||
@ -752,16 +752,10 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
}
|
||||
}
|
||||
|
||||
/* In any case, skip over the return-address slot. FIXME: Not needed
|
||||
now. */
|
||||
offset -= 8;
|
||||
|
||||
/* Store the frame-pointer. */
|
||||
|
||||
if (frame_pointer_needed)
|
||||
{
|
||||
empty_stack_frame = 0;
|
||||
|
||||
if (offset < 0)
|
||||
{
|
||||
/* Get 8 less than otherwise, since we need to reach offset + 8. */
|
||||
@ -799,8 +793,9 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
|
||||
if (MMIX_CFUN_NEEDS_SAVED_EH_RETURN_ADDRESS)
|
||||
{
|
||||
/* Store the return-address, if one is needed on the stack. */
|
||||
empty_stack_frame = 0;
|
||||
/* Store the return-address, if one is needed on the stack. We
|
||||
usually store it in a register when needed, but that doesn't work
|
||||
with -fexceptions. */
|
||||
|
||||
if (offset < 0)
|
||||
{
|
||||
@ -838,8 +833,6 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
/* Store the register defining the numbering of local registers, so
|
||||
we know how long to unwind the register stack. */
|
||||
|
||||
empty_stack_frame = 0;
|
||||
|
||||
if (offset < 0)
|
||||
{
|
||||
/* Get 8 less than otherwise, since we need to reach offset + 8. */
|
||||
@ -894,8 +887,6 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
&& regs_ever_live[regno] && ! call_used_regs[regno])
|
||||
|| IS_MMIX_EH_RETURN_DATA_REG (regno))
|
||||
{
|
||||
empty_stack_frame = 0;
|
||||
|
||||
if (offset < 0)
|
||||
{
|
||||
int stack_chunk;
|
||||
@ -950,11 +941,10 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||
offset -= 8;
|
||||
}
|
||||
|
||||
/* Finally, allocate room for local vars (if they weren't allocated for
|
||||
above) and outgoing args. This might be any number of bytes (well,
|
||||
we assume it fits in a host-int).
|
||||
Don't allocate (the return-address slot) if the stack frame is empty. */
|
||||
if (stack_space_to_allocate && ! empty_stack_frame)
|
||||
/* Finally, allocate room for outgoing args and local vars if room
|
||||
wasn't allocated above. This might be any number of bytes (well, we
|
||||
assume it fits in a host-int). */
|
||||
if (stack_space_to_allocate)
|
||||
{
|
||||
if (stack_space_to_allocate < 256)
|
||||
{
|
||||
@ -1006,19 +996,13 @@ mmix_target_asm_function_epilogue (stream, locals_size)
|
||||
int stack_space_to_deallocate
|
||||
= (current_function_outgoing_args_size
|
||||
+ current_function_pretend_args_size
|
||||
+ (int) locals_size + 8 + 7) & ~7;
|
||||
+ (int) locals_size + 7) & ~7;
|
||||
|
||||
/* The assumption that locals_size fits in an int is asserted in
|
||||
mmix_target_asm_function_prologue. */
|
||||
|
||||
/* The first address to access is beyond the outgoing_args area. */
|
||||
int offset = current_function_outgoing_args_size;
|
||||
int empty_stack_frame
|
||||
= (current_function_outgoing_args_size == 0
|
||||
&& locals_size == 0
|
||||
&& current_function_pretend_args_size == 0
|
||||
&& ! MMIX_CFUN_NEEDS_SAVED_EH_RETURN_ADDRESS
|
||||
&& ! MMIX_CFUN_HAS_LANDING_PAD);
|
||||
|
||||
/* Add the space for global non-register-stack registers.
|
||||
It is assumed that the frame-pointer register can be one of these
|
||||
@ -1059,8 +1043,6 @@ mmix_target_asm_function_epilogue (stream, locals_size)
|
||||
&& regs_ever_live[regno] && !call_used_regs[regno])
|
||||
|| IS_MMIX_EH_RETURN_DATA_REG (regno))
|
||||
{
|
||||
empty_stack_frame = 0;
|
||||
|
||||
if (offset > 255)
|
||||
{
|
||||
if (offset > 65535)
|
||||
@ -1106,8 +1088,6 @@ mmix_target_asm_function_epilogue (stream, locals_size)
|
||||
/* Get back the old frame-pointer-value. */
|
||||
if (frame_pointer_needed)
|
||||
{
|
||||
empty_stack_frame = 0;
|
||||
|
||||
if (offset > 255)
|
||||
{
|
||||
if (offset > 65535)
|
||||
@ -1135,27 +1115,22 @@ mmix_target_asm_function_epilogue (stream, locals_size)
|
||||
offset += 8;
|
||||
}
|
||||
|
||||
/* Do not deallocate the return-address slot if the stack frame is
|
||||
empty, because then it was never allocated. */
|
||||
if (! empty_stack_frame)
|
||||
/* We do not need to restore pretended incoming args, just add back
|
||||
offset to sp. */
|
||||
if (stack_space_to_deallocate > 65535)
|
||||
{
|
||||
/* We do not need to restore pretended incoming args, just add
|
||||
back offset to sp. */
|
||||
if (stack_space_to_deallocate > 65535)
|
||||
{
|
||||
/* There's better support for incrementing than decrementing, so
|
||||
we might be able to optimize this as we see a need. */
|
||||
mmix_output_register_setting (stream, 255,
|
||||
stack_space_to_deallocate, 1);
|
||||
fprintf (stream, "\tADDU %s,%s,$255\n",
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM],
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM]);
|
||||
}
|
||||
else
|
||||
fprintf (stream, "\tINCL %s,%d\n",
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM],
|
||||
stack_space_to_deallocate);
|
||||
/* There's better support for incrementing than decrementing, so
|
||||
we might be able to optimize this as we see a need. */
|
||||
mmix_output_register_setting (stream, 255,
|
||||
stack_space_to_deallocate, 1);
|
||||
fprintf (stream, "\tADDU %s,%s,$255\n",
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM],
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM]);
|
||||
}
|
||||
else if (stack_space_to_deallocate != 0)
|
||||
fprintf (stream, "\tINCL %s,%d\n",
|
||||
reg_names[MMIX_STACK_POINTER_REGNUM],
|
||||
stack_space_to_deallocate);
|
||||
|
||||
if (current_function_calls_eh_return)
|
||||
/* Adjustment the (normal) stack-pointer to that of the receiver.
|
||||
@ -1343,9 +1318,9 @@ void
|
||||
mmix_trampoline_template (stream)
|
||||
FILE * stream;
|
||||
{
|
||||
/* Read a value from to static-chain, jump somewhere. The static chain
|
||||
is stored at offset 16, and the function address is stored at offset
|
||||
24. */
|
||||
/* Read a value into the static-chain register and jump somewhere. The
|
||||
static chain is stored at offset 16, and the function address is
|
||||
stored at offset 24. */
|
||||
/* FIXME: GCC copies this using *intsize* (tetra), when it should use
|
||||
register size (octa). */
|
||||
fprintf (stream, "\tGETA $255,1F\n\t");
|
||||
|
@ -483,7 +483,7 @@ extern int target_flags;
|
||||
assuming it is referenced a very limited number of times. Other global
|
||||
and fixed registers come next; they are never allocated. */
|
||||
#define MMIX_GNU_ABI_REG_ALLOC_ORDER \
|
||||
{ 252, 251, 250, 249, 248, 247, 246, \
|
||||
{ 252, 251, 250, 249, 248, 247, 246, \
|
||||
245, 244, 243, 242, 241, 240, 239, 238, \
|
||||
237, 236, 235, 234, 233, 232, 231, \
|
||||
\
|
||||
@ -549,10 +549,10 @@ extern int target_flags;
|
||||
/* Node: Register Classes */
|
||||
|
||||
enum reg_class
|
||||
{
|
||||
NO_REGS, GENERAL_REGS, REMAINDER_REG, HIMULT_REG,
|
||||
SYSTEM_REGS, ALL_REGS, LIM_REG_CLASSES
|
||||
};
|
||||
{
|
||||
NO_REGS, GENERAL_REGS, REMAINDER_REG, HIMULT_REG,
|
||||
SYSTEM_REGS, ALL_REGS, LIM_REG_CLASSES
|
||||
};
|
||||
|
||||
#define N_REG_CLASSES (int) LIM_REG_CLASSES
|
||||
|
||||
@ -626,10 +626,7 @@ enum reg_class
|
||||
#define STARTING_FRAME_OFFSET \
|
||||
mmix_starting_frame_offset ()
|
||||
|
||||
/* There is a stack slot between the frame-pointer and the first
|
||||
parameter, where the return address is sometimes stored. FIXME:
|
||||
Unnecessary. */
|
||||
#define FIRST_PARM_OFFSET(FUNDECL) 8
|
||||
#define FIRST_PARM_OFFSET(FUNDECL) 0
|
||||
|
||||
#define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) \
|
||||
mmix_dynamic_chain_address (FRAMEADDR)
|
||||
@ -1104,10 +1101,6 @@ const_section () \
|
||||
#define PRINT_OPERAND_ADDRESS(STREAM, X) \
|
||||
mmix_print_operand_address (STREAM, X)
|
||||
|
||||
#if 0
|
||||
#define USER_LABEL_PREFIX "_"
|
||||
#endif
|
||||
|
||||
#define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
|
||||
mmix_asm_output_reg_push (STREAM, REGNO)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user