Remove workaround for register stack overwrite bug in mmix.
* config/mmix/mmix.c (mmix_target_asm_function_prologue): Remove support for TARGET_REG_STACK_FILL_BUG. * config/mmix/mmix.h: Remove member has_call_without_parameters. (TARGET_MASK_REG_STACK_FILL_BUG, TARGET_REG_STACK_FILL_BUG): Delete. (TARGET_DEFAULT): Remove TARGET_MASK_REG_STACK_FILL_BUG. (TARGET_SWITCHES): Remove -mreg-stack-fill-bug-workaround and -mno-reg-stack-fill-bug-workaround. * config/mmix/mmix.md ("call", "call_value"): Don't set struct machine member has_call_without_parameters. * doc/invoke.texi (Option Summary) <MMIX Options>: Remove -mreg-stack-fill-bug-workaround and -mno-reg-stack-fill-bug-workaround. (MMIX Options): Ditto. From-SVN: r49035
This commit is contained in:
parent
7192cbf1e2
commit
07338cf892
|
@ -1,3 +1,21 @@
|
||||||
|
2002-01-21 Hans-Peter Nilsson <hp@bitrange.com>
|
||||||
|
|
||||||
|
Remove workaround for register stack overwrite bug in mmix.
|
||||||
|
* config/mmix/mmix.c (mmix_target_asm_function_prologue): Remove
|
||||||
|
support for TARGET_REG_STACK_FILL_BUG.
|
||||||
|
* config/mmix/mmix.h: Remove member has_call_without_parameters.
|
||||||
|
(TARGET_MASK_REG_STACK_FILL_BUG, TARGET_REG_STACK_FILL_BUG):
|
||||||
|
Delete.
|
||||||
|
(TARGET_DEFAULT): Remove TARGET_MASK_REG_STACK_FILL_BUG.
|
||||||
|
(TARGET_SWITCHES): Remove -mreg-stack-fill-bug-workaround and
|
||||||
|
-mno-reg-stack-fill-bug-workaround.
|
||||||
|
* config/mmix/mmix.md ("call", "call_value"): Don't set struct
|
||||||
|
machine member has_call_without_parameters.
|
||||||
|
* doc/invoke.texi (Option Summary) <MMIX Options>: Remove
|
||||||
|
-mreg-stack-fill-bug-workaround and
|
||||||
|
-mno-reg-stack-fill-bug-workaround.
|
||||||
|
(MMIX Options): Ditto.
|
||||||
|
|
||||||
2002-01-21 Kazu Hirata <kazu@hxi.com>
|
2002-01-21 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
* config/h8300/h8300.c (function_arg): Replace 0 with NULL_RTX
|
* config/h8300/h8300.c (function_arg): Replace 0 with NULL_RTX
|
||||||
|
|
|
@ -966,52 +966,6 @@ mmix_target_asm_function_prologue (stream, locals_size)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
mmix_highest_saved_stack_register = regno;
|
mmix_highest_saved_stack_register = regno;
|
||||||
|
|
||||||
/* FIXME: Remove this when a corrected mmix version is released.
|
|
||||||
|
|
||||||
This kludge is a work-around for a presumed bug in the mmix simulator
|
|
||||||
(reported to knuth-bug), all versions up and including "Version of 14
|
|
||||||
October 2001". When the circular register stack fills up, the parts
|
|
||||||
that would be overwritten need to be written to memory. If the
|
|
||||||
"filling" instruction is a PUSHJ or PUSHGO, rL == 0 afterwards. That
|
|
||||||
precise condition (rS == rO && rL == 0) is the same as for an empty
|
|
||||||
register stack, which means no more data is written to memory for
|
|
||||||
that round. A hack is to remove the "&& L!=0" from "@<Increase
|
|
||||||
rL@>=" in mmix-sim.w: the register stack isn't empty under normal
|
|
||||||
circumstances, unless SAVE or UNSAVE is used, interrupts are enabled
|
|
||||||
or cases where rS == rO and rL is explicitly written to 0 as in
|
|
||||||
"PUT rL,0".
|
|
||||||
|
|
||||||
A workaround is to make sure PUSHJ or PUSHGO isn't filling up the
|
|
||||||
register stac. This is accomplished if $16 or higher is written
|
|
||||||
before the function call. This doesn't happen from a leaf functions
|
|
||||||
of course. For the MMIXware ABI, this can't happen if all called
|
|
||||||
functions have parameters, because parameters start at $16.
|
|
||||||
Otherwise, and for the GNU ABI, if any register $16 and up is used,
|
|
||||||
we can see if it's mentioned before any function-call without
|
|
||||||
parameters. This isn't too important; the bug will probably be fixed
|
|
||||||
soon and there's an option to not emit the work-around code. The
|
|
||||||
call-with-parameters kludge wouldn't be there if it hadn't been for
|
|
||||||
it being left-over from a previous mmix version.
|
|
||||||
|
|
||||||
The actual code makes sure any register stack fill happens as early
|
|
||||||
as in the function prologue with a "SET $16,$16" (essentially a nop
|
|
||||||
except for the effects on the register stack). */
|
|
||||||
if (TARGET_REG_STACK_FILL_BUG
|
|
||||||
&& ((TARGET_ABI_GNU && !leaf_function_p ())
|
|
||||||
|| (!TARGET_ABI_GNU
|
|
||||||
&& cfun->machine->has_call_without_parameters)))
|
|
||||||
{
|
|
||||||
/* We don't have a specific macro or derivable expression for the
|
|
||||||
first non-call-saved register. If we need it in other places
|
|
||||||
than here (which is temporary code anyway), such a macro should
|
|
||||||
be added. */
|
|
||||||
int flush_regno
|
|
||||||
= TARGET_ABI_GNU ? mmix_highest_saved_stack_register + 2 : 16;
|
|
||||||
|
|
||||||
fprintf (stream, "\tSET %s,%s\n",
|
|
||||||
reg_names[flush_regno], reg_names[flush_regno]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TARGET_ASM_FUNCTION_EPILOGUE. */
|
/* TARGET_ASM_FUNCTION_EPILOGUE. */
|
||||||
|
|
|
@ -90,7 +90,6 @@ extern struct rtx_def *mmix_compare_op1;
|
||||||
mmix.md too. */
|
mmix.md too. */
|
||||||
struct machine_function
|
struct machine_function
|
||||||
{
|
{
|
||||||
int has_call_without_parameters;
|
|
||||||
int has_landing_pad;
|
int has_landing_pad;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -157,7 +156,6 @@ extern int target_flags;
|
||||||
#define TARGET_MASK_KNUTH_DIVISION 16
|
#define TARGET_MASK_KNUTH_DIVISION 16
|
||||||
#define TARGET_MASK_TOPLEVEL_SYMBOLS 32
|
#define TARGET_MASK_TOPLEVEL_SYMBOLS 32
|
||||||
#define TARGET_MASK_BRANCH_PREDICT 64
|
#define TARGET_MASK_BRANCH_PREDICT 64
|
||||||
#define TARGET_MASK_REG_STACK_FILL_BUG 128
|
|
||||||
|
|
||||||
/* FIXME: Get rid of this one. */
|
/* FIXME: Get rid of this one. */
|
||||||
#define TARGET_LIBFUNC (target_flags & TARGET_MASK_LIBFUNCS)
|
#define TARGET_LIBFUNC (target_flags & TARGET_MASK_LIBFUNCS)
|
||||||
|
@ -167,11 +165,9 @@ extern int target_flags;
|
||||||
#define TARGET_KNUTH_DIVISION (target_flags & TARGET_MASK_KNUTH_DIVISION)
|
#define TARGET_KNUTH_DIVISION (target_flags & TARGET_MASK_KNUTH_DIVISION)
|
||||||
#define TARGET_TOPLEVEL_SYMBOLS (target_flags & TARGET_MASK_TOPLEVEL_SYMBOLS)
|
#define TARGET_TOPLEVEL_SYMBOLS (target_flags & TARGET_MASK_TOPLEVEL_SYMBOLS)
|
||||||
#define TARGET_BRANCH_PREDICT (target_flags & TARGET_MASK_BRANCH_PREDICT)
|
#define TARGET_BRANCH_PREDICT (target_flags & TARGET_MASK_BRANCH_PREDICT)
|
||||||
#define TARGET_REG_STACK_FILL_BUG \
|
|
||||||
(target_flags & TARGET_MASK_REG_STACK_FILL_BUG)
|
|
||||||
|
|
||||||
#define TARGET_DEFAULT \
|
#define TARGET_DEFAULT \
|
||||||
(TARGET_MASK_BRANCH_PREDICT | TARGET_MASK_REG_STACK_FILL_BUG)
|
(TARGET_MASK_BRANCH_PREDICT)
|
||||||
|
|
||||||
/* FIXME: Provide a way to *load* the epsilon register. */
|
/* FIXME: Provide a way to *load* the epsilon register. */
|
||||||
#define TARGET_SWITCHES \
|
#define TARGET_SWITCHES \
|
||||||
|
@ -202,12 +198,6 @@ extern int target_flags;
|
||||||
N_("Use P-mnemonics for branches statically predicted as taken")}, \
|
N_("Use P-mnemonics for branches statically predicted as taken")}, \
|
||||||
{"no-branch-predict", -TARGET_MASK_BRANCH_PREDICT, \
|
{"no-branch-predict", -TARGET_MASK_BRANCH_PREDICT, \
|
||||||
N_("Don't use P-mnemonics for branches")}, \
|
N_("Don't use P-mnemonics for branches")}, \
|
||||||
{"reg-stack-fill-bug-workaround", TARGET_MASK_REG_STACK_FILL_BUG, \
|
|
||||||
N_("Work around inconsistent behavior when a PUSHJ or PUSHGO\
|
|
||||||
instruction fills the register stack")}, \
|
|
||||||
{"no-reg-stack-fill-bug-workaround", -TARGET_MASK_REG_STACK_FILL_BUG,\
|
|
||||||
N_("Don't work around inconsistent behavior when a PUSHJ or PUSHGO\
|
|
||||||
instruction fills the register stack")}, \
|
|
||||||
{"", TARGET_DEFAULT, ""}}
|
{"", TARGET_DEFAULT, ""}}
|
||||||
|
|
||||||
/* Unfortunately, this must not reference anything in "mmix.c". */
|
/* Unfortunately, this must not reference anything in "mmix.c". */
|
||||||
|
|
|
@ -996,11 +996,6 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
|
||||||
if (operands[2] == NULL_RTX)
|
if (operands[2] == NULL_RTX)
|
||||||
operands[2] = const0_rtx;
|
operands[2] = const0_rtx;
|
||||||
|
|
||||||
/* FIXME: Documentation bug: operands[3] (operands[2] for 'call') is the
|
|
||||||
*next* argument register, not the number of arguments in registers. */
|
|
||||||
cfun->machine->has_call_without_parameters
|
|
||||||
|= REG_P (operands[2]) && REGNO (operands[2]) == MMIX_FIRST_ARG_REGNUM;
|
|
||||||
|
|
||||||
operands[4] = gen_rtx_REG (DImode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM);
|
operands[4] = gen_rtx_REG (DImode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM);
|
||||||
}")
|
}")
|
||||||
|
|
||||||
|
@ -1025,9 +1020,8 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
|
||||||
operands[3] = const0_rtx;
|
operands[3] = const0_rtx;
|
||||||
|
|
||||||
/* FIXME: Documentation bug: operands[3] (operands[2] for 'call') is the
|
/* FIXME: Documentation bug: operands[3] (operands[2] for 'call') is the
|
||||||
*next* argument register, not the number of arguments in registers. */
|
*next* argument register, not the number of arguments in registers.
|
||||||
cfun->machine->has_call_without_parameters
|
(There used to be code here where that mattered.) */
|
||||||
|= REG_P (operands[3]) && REGNO (operands[3]) == MMIX_FIRST_ARG_REGNUM;
|
|
||||||
|
|
||||||
operands[5] = gen_rtx_REG (DImode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM);
|
operands[5] = gen_rtx_REG (DImode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM);
|
||||||
}")
|
}")
|
||||||
|
|
|
@ -593,8 +593,7 @@ in the following sections.
|
||||||
@gccoptlist{
|
@gccoptlist{
|
||||||
-mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu @gol
|
-mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu @gol
|
||||||
-mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols @gol
|
-mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols @gol
|
||||||
-melf -mbranch-predict -mreg-stack-fill-bug-workaround @gol
|
-melf -mbranch-predict -mno-branch-predict}
|
||||||
-mno-branch-predict -mno-reg-stack-fill-bug-workaround}
|
|
||||||
|
|
||||||
@emph{IA-64 Options}
|
@emph{IA-64 Options}
|
||||||
@gccoptlist{
|
@gccoptlist{
|
||||||
|
@ -9486,15 +9485,6 @@ Generate an executable in the ELF format, rather than the default
|
||||||
@opindex mno-branch-predict
|
@opindex mno-branch-predict
|
||||||
Use (do not use) the probable-branch instructions, when static branch
|
Use (do not use) the probable-branch instructions, when static branch
|
||||||
prediction indicates a probable branch.
|
prediction indicates a probable branch.
|
||||||
|
|
||||||
@item -mreg-stack-fill-bug-workaround
|
|
||||||
@itemx -mno-reg-stack-fill-bug-workaround
|
|
||||||
@opindex mreg-stack-fill-bug-workaround
|
|
||||||
@opindex mno-reg-stack-fill-bug-workaround
|
|
||||||
Work around (do not work around) an inconsistency in the circular
|
|
||||||
register stack mechanism in the @command{mmix} simulator, which
|
|
||||||
causes entries in the register stack to not be flushed to memory if
|
|
||||||
the instruction causing the fill-up is @code{PUSHJ} or @code{PUSHGO}.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node PDP-11 Options
|
@node PDP-11 Options
|
||||||
|
|
Loading…
Reference in New Issue