This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RS6000] Fix PR12817
On Fri, Nov 26, 2004 at 07:40:58PM -0800, Geoffrey Keating wrote:
> I think that would just quadruple the amount of incomprehensible code.
Perhaps so. Hmm, talking about quadrupling code, the save_world_p
stuff is useless bloat for anything other than Darwin. Here is a fix.
* config/rs6000/rs6000.h (WORLD_SAVE_P): Define.
* config/rs6000/darwin.h (WORLD_SAVE_P): Define.
* config/rs6000/rs6000.c (compute_save_world_info): Use WORLD_SAVE_P
to allow non-darwin ABIs to optimize away code.
(rs6000_emit_prologue, rs6000_emit_epilogue): Likewise.
text data bss dec hex filename
184620 29152 5032 218804 356b4 rs6000.o.orig
180948 29096 5032 215076 34824 rs6000.o
powerpc-linux bootstrap in progress. OK for mainline?
diff -urp -xCVS -x'*~' gcc-virgin/gcc/config/rs6000/darwin.h gcc-current/gcc/config/rs6000/darwin.h
--- gcc-virgin/gcc/config/rs6000/darwin.h 2004-11-26 14:48:19.770112722 +1030
+++ gcc-current/gcc/config/rs6000/darwin.h 2004-11-27 15:21:48.944295052 +1030
@@ -208,6 +208,10 @@ do { \
#undef FP_SAVE_INLINE
#define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64)
+/* Darwin uses a function call if everything needs to be saved/restored. */
+#undef WORLD_SAVE_P
+#define WORLD_SAVE_P(INFO) ((INFO)->world_save_p)
+
/* The assembler wants the alternate register names, but without
leading percent sign. */
#undef REGISTER_NAMES
diff -urp -xCVS -x'*~' gcc-virgin/gcc/config/rs6000/rs6000.h gcc-current/gcc/config/rs6000/rs6000.h
--- gcc-virgin/gcc/config/rs6000/rs6000.h 2004-11-19 08:39:47.000000000 +1030
+++ gcc-current/gcc/config/rs6000/rs6000.h 2004-11-27 15:06:06.443374912 +1030
@@ -1627,6 +1622,10 @@ extern enum rs6000_abi rs6000_current_ab
#define CALL_LONG 0x00000008 /* always call indirect */
#define CALL_LIBCALL 0x00000010 /* libcall */
+/* We don't have prologue and epilogue functions to save/restore
+ everything for most ABIs. */
+#define WORLD_SAVE_P(INFO) 0
+
/* 1 if N is a possible register number for a function value
as seen by the caller.
diff -urp -xCVS -x'*~' gcc-virgin/gcc/config/rs6000/rs6000.c gcc-current/gcc/config/rs6000/rs6000.c
--- gcc-virgin/gcc/config/rs6000/rs6000.c 2004-11-27 11:30:01.513696539 +1030
+++ gcc-current/gcc/config/rs6000/rs6000.c 2004-11-27 15:21:41.273499406 +1030
@@ -12428,17 +12443,19 @@ compute_vrsave_mask (void)
static void
compute_save_world_info(rs6000_stack_t *info_ptr)
{
- info_ptr->world_save_p =
- (DEFAULT_ABI == ABI_DARWIN)
- && ! (current_function_calls_setjmp && flag_exceptions)
- && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
- && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
- && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
- && info_ptr->cr_save_p;
+ info_ptr->world_save_p = 1;
+ info_ptr->world_save_p
+ = (WORLD_SAVE_P (info_ptr)
+ && DEFAULT_ABI == ABI_DARWIN
+ && ! (current_function_calls_setjmp && flag_exceptions)
+ && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
+ && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
+ && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
+ && info_ptr->cr_save_p);
/* This will not work in conjunction with sibcalls. Make sure there
are none. (This check is expensive, but seldom executed.) */
- if ( info_ptr->world_save_p )
+ if (WORLD_SAVE_P (info_ptr))
{
rtx insn;
for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
@@ -12450,7 +12467,7 @@ compute_save_world_info(rs6000_stack_t *
}
}
- if (info_ptr->world_save_p)
+ if (WORLD_SAVE_P (info_ptr))
{
/* Even if we're not touching VRsave, make sure there's room on the
stack for it, if it looks like we're calling SAVE_WORLD, which
@@ -13862,7 +13879,7 @@ rs6000_emit_prologue (void)
}
/* Handle world saves specially here. */
- if (info->world_save_p)
+ if (WORLD_SAVE_P (info))
{
int i, j, sz;
rtx treg;
@@ -13982,7 +13999,7 @@ rs6000_emit_prologue (void)
}
/* Save AltiVec registers if needed. */
- if (! info->world_save_p && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
+ if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
{
int i;
@@ -14023,7 +14040,7 @@ rs6000_emit_prologue (void)
epilogue. */
if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
- && ! info->world_save_p && info->vrsave_mask != 0)
+ && !WORLD_SAVE_P (info) && info->vrsave_mask != 0)
{
rtx reg, mem, vrsave;
int offset;
@@ -14051,7 +14070,7 @@ rs6000_emit_prologue (void)
}
/* If we use the link register, get it into r0. */
- if (! info->world_save_p && info->lr_save_p)
+ if (!WORLD_SAVE_P (info) && info->lr_save_p)
{
insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
@@ -14059,7 +14078,7 @@ rs6000_emit_prologue (void)
}
/* If we need to save CR, put it into r12. */
- if (! info->world_save_p && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
+ if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
{
rtx set;
@@ -14081,7 +14100,7 @@ rs6000_emit_prologue (void)
/* Do any required saving of fpr's. If only one or two to save, do
it ourselves. Otherwise, call function. */
- if (! info->world_save_p && saving_FPRs_inline)
+ if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
{
int i;
for (i = 0; i < 64 - info->first_fp_reg_save; i++)
@@ -14092,7 +14111,7 @@ rs6000_emit_prologue (void)
info->fp_save_offset + sp_offset + 8 * i,
info->total_size);
}
- else if (! info->world_save_p && info->first_fp_reg_save != 64)
+ else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
{
int i;
char rname[30];
@@ -14128,7 +14147,7 @@ rs6000_emit_prologue (void)
/* Save GPRs. This is done as a PARALLEL if we are using
the store-multiple instructions. */
- if (! info->world_save_p && using_store_multiple)
+ if (!WORLD_SAVE_P (info) && using_store_multiple)
{
rtvec p;
int i;
@@ -14150,7 +14169,7 @@ rs6000_emit_prologue (void)
rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
NULL_RTX, NULL_RTX);
}
- else if (! info->world_save_p)
+ else if (!WORLD_SAVE_P (info))
{
int i;
for (i = 0; i < 32 - info->first_gp_reg_save; i++)
@@ -14209,7 +14228,7 @@ rs6000_emit_prologue (void)
/* ??? There's no need to emit actual instructions here, but it's the
easiest way to get the frame unwind information emitted. */
- if (! info->world_save_p && current_function_calls_eh_return)
+ if (!WORLD_SAVE_P (info) && current_function_calls_eh_return)
{
unsigned int i, regno;
@@ -14244,7 +14263,7 @@ rs6000_emit_prologue (void)
}
/* Save lr if we used it. */
- if (! info->world_save_p && info->lr_save_p)
+ if (!WORLD_SAVE_P (info) && info->lr_save_p)
{
rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
GEN_INT (info->lr_save_offset + sp_offset));
@@ -14259,7 +14278,7 @@ rs6000_emit_prologue (void)
}
/* Save CR if we use any that must be preserved. */
- if (! info->world_save_p && info->cr_save_p)
+ if (!WORLD_SAVE_P (info) && info->cr_save_p)
{
rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
GEN_INT (info->cr_save_offset + sp_offset));
@@ -14292,7 +14311,7 @@ rs6000_emit_prologue (void)
/* Update stack and set back pointer unless this is V.4,
for which it was done previously. */
- if (! info->world_save_p && info->push_p
+ if (!WORLD_SAVE_P (info) && info->push_p
&& !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
rs6000_emit_allocate_stack (info->total_size, FALSE);
@@ -14461,7 +14480,7 @@ rs6000_emit_epilogue (int sibcall)
|| rs6000_cpu == PROCESSOR_PPC750
|| optimize_size);
- if (info->world_save_p)
+ if (WORLD_SAVE_P (info))
{
int i, j;
char rname[30];
--
Alan Modra
IBM OzLabs - Linux Technology Centre