aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDoug Evans <dje@gnu.org>1994-05-07 00:31:51 +0000
committerDoug Evans <dje@gnu.org>1994-05-07 00:31:51 +0000
commit5c56efde0ffb3d25d744211d20984020f2a75e33 (patch)
tree41d6fe9d3799792f2e8c2da7eea8a4523130c82a /gcc
parentc6aa9ce1220d7ee06053af57cd923d080701d20b (diff)
downloadgcc-5c56efde0ffb3d25d744211d20984020f2a75e33.zip
gcc-5c56efde0ffb3d25d744211d20984020f2a75e33.tar.gz
gcc-5c56efde0ffb3d25d744211d20984020f2a75e33.tar.bz2
(TARGET_FRW): Add note saying this option is deprecated.
(TARGET_FLAT): Renamed from TARGET_FRW_COMPAT. (TARGET_SWITCHES): Delete references to -mfrw, -mfrw-compat. Add -mflat. (CONDITIONAL_REGISTER_USAGE): If -mflat, fix %i7, rename "%fp" to "%i7", and make %g7 a global_reg. (FRAME_POINTER_REQUIRED): Handle -mflat. (INITIAL_FRAME_POINTER_OFFSET): Likewise. (ARG_POINTER_REGNUM): Explicitly say it's the frame pointer. (LEAF_REGISTERS): Make %g7 not a leaf register. (leaf_reg_backmap): Delete. (LEAF_REG_BACKMAP): Likewise. (FUNCTION_PROLOGUE): Handle -mflat. (FUNCTION_EPILOGUE): Likewise. (DELAY_SLOTS_FOR_EPILOGUE): Likewise. (ELIGIBLE_FOR_EPILOGUE_DELAY): Likewise. From-SVN: r7259
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/sparc/sparc.h50
1 files changed, 31 insertions, 19 deletions
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 97cef6f..e0ce855 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -118,16 +118,17 @@ extern int target_flags;
efficient manner. This code is not compatible with normal sparc code. */
/* This is not a user selectable option yet, because it requires changes
that are not yet switchable via command line arguments. */
+/* ??? This flag is deprecated and may disappear at some point. */
#define TARGET_FRW (target_flags & 256)
/* Nonzero means that we should generate code using a flat register window
model, i.e. no save/restore instructions are generated, but which is
compatible with normal sparc code. This is the same as above, except
- that the frame pointer is %l6 instead of %fp. This code is not as efficient
- as TARGET_FRW, because it has one less allocatable register. */
-/* This is not a user selectable option yet, because it requires changes
- that are not yet switchable via command line arguments. */
-#define TARGET_FRW_COMPAT (target_flags & 512)
+ that the frame pointer is %i7 instead of %fp. */
+/* ??? This use to be named TARGET_FRW_COMPAT. At some point TARGET_FRW will
+ go away, but until that time only use this one when necessary.
+ -mflat sets both. */
+#define TARGET_FLAT (target_flags & 512)
/* Nonzero means use the registers that the Sparc ABI reserves for
application software. This is the default. */
@@ -162,13 +163,11 @@ extern int target_flags;
{"no-v8", -64}, \
{"sparclite", 128}, \
{"no-sparclite", -128}, \
-/* {"frw", 256}, */ \
-/* {"no-frw", -256}, */ \
-/* {"frw-compat", 256+512}, */ \
-/* {"no-frw-compat", -(256+512)}, */ \
{"f930", 128}, \
{"f930", -1}, \
{"f934", 128}, \
+ {"flat", 256+512}, \
+ {"no-flat", -(256+512)}, \
{"app-regs", 1024}, \
{"no-app-regs", -1024}, \
{"hard-quad-float", 2048}, \
@@ -381,6 +380,15 @@ do \
fixed_regs[3] = 1; \
fixed_regs[4] = 1; \
} \
+ if (TARGET_FLAT) \
+ { \
+ /* Let the compiler believe the frame pointer is still \
+ %fp, but output it as %i7. */ \
+ fixed_regs[31] = 1; \
+ reg_names[FRAME_POINTER_REGNUM] = "%i7"; \
+ /* ??? This is a hack to disable leaf functions. */ \
+ global_regs[7] = 1; \
+ } \
} \
while (0)
@@ -447,7 +455,8 @@ extern int hard_regno_mode_ok[FIRST_PSEUDO_REGISTER];
extern int leaf_function;
#define FRAME_POINTER_REQUIRED \
- (! (leaf_function_p () && only_leaf_regs_used ()))
+ (TARGET_FRW ? (current_function_calls_alloca || current_function_varargs) \
+ : ! (leaf_function_p () && only_leaf_regs_used ()))
/* C statement to store the difference between the frame pointer
and the stack pointer values immediately after the function prologue.
@@ -456,11 +465,11 @@ extern int leaf_function;
it's not, there's no point in trying to eliminate the
frame pointer. If it is a leaf function, we guessed right! */
#define INITIAL_FRAME_POINTER_OFFSET(VAR) \
- ((VAR) = (TARGET_FRW ? sparc_frw_compute_frame_size (get_frame_size ()) \
+ ((VAR) = (TARGET_FRW ? sparc_flat_compute_frame_size (get_frame_size ()) \
: compute_frame_size (get_frame_size (), 1)))
/* Base register for access to arguments of the function. */
-#define ARG_POINTER_REGNUM 30
+#define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
/* Register in which static-chain is passed to a function. This must
not be a register used by the prologue. */
@@ -577,8 +586,13 @@ enum reg_class { NO_REGS, GENERAL_REGS, FP_REGS, ALL_REGS, LIM_REG_CLASSES };
#define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
+/* ??? %g7 is not a leaf register to effectively #undef LEAF_REGISTERS when
+ -mflat is used. Function only_leaf_regs_used will return 0 if a global
+ register is used and is not permitted in a leaf function. We make %g7
+ a global reg if -mflat and voila. Since %g7 is a system register and is
+ fixed it won't be used by gcc anyway. */
#define LEAF_REGISTERS \
-{ 1, 1, 1, 1, 1, 1, 1, 1, \
+{ 1, 1, 1, 1, 1, 1, 1, 0, \
0, 0, 0, 0, 0, 0, 1, 0, \
0, 0, 0, 0, 0, 0, 0, 0, \
1, 1, 1, 1, 1, 1, 0, 1, \
@@ -589,8 +603,6 @@ enum reg_class { NO_REGS, GENERAL_REGS, FP_REGS, ALL_REGS, LIM_REG_CLASSES };
extern char leaf_reg_remap[];
#define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
-extern char leaf_reg_backmap[];
-#define LEAF_REG_BACKMAP(REGNO) (leaf_reg_backmap[REGNO])
/* The class value for index registers, and the one for base regs. */
#define INDEX_REG_CLASS GENERAL_REGS
@@ -939,7 +951,7 @@ do { \
to do this is made in regclass.c. */
#define FUNCTION_PROLOGUE(FILE, SIZE) \
- (TARGET_FRW ? sparc_frw_output_function_prologue (FILE, SIZE, leaf_function)\
+ (TARGET_FRW ? sparc_flat_output_function_prologue (FILE, SIZE) \
: output_function_prologue (FILE, SIZE, leaf_function))
/* Output assembler code to FILE to increment profiler label # LABELNO
@@ -1002,13 +1014,13 @@ extern int current_function_outgoing_args_size;
extern union tree_node *current_function_decl;
#define FUNCTION_EPILOGUE(FILE, SIZE) \
- (TARGET_FRW ? sparc_frw_output_function_epilogue (FILE, SIZE, leaf_function)\
+ (TARGET_FRW ? sparc_flat_output_function_epilogue (FILE, SIZE) \
: output_function_epilogue (FILE, SIZE, leaf_function))
#define DELAY_SLOTS_FOR_EPILOGUE \
- (TARGET_FRW ? sparc_frw_epilogue_delay_slots () : 1)
+ (TARGET_FRW ? sparc_flat_epilogue_delay_slots () : 1)
#define ELIGIBLE_FOR_EPILOGUE_DELAY(trial, slots_filled) \
- (TARGET_FRW ? sparc_frw_eligible_for_epilogue_delay (trial, slots_filled) \
+ (TARGET_FRW ? sparc_flat_eligible_for_epilogue_delay (trial, slots_filled) \
: eligible_for_epilogue_delay (trial, slots_filled))
/* Output assembler code for a block containing the constant parts