This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Testing m68k changes on AmigaOS and Linux/m68k


On Thu, Oct 16, 2003 at 07:00:14PM +0200, Bernardo Innocenti wrote:
> Hmmm... with regargs, there are no pushes on the stack making things more
> complicated.

  Why does that make thinks more complicate? I would say its the opposite.

> IIRC, GCC knows how to accumulate pushes from multiple function calls and
> should optimize then the control flow ends into the epilogue where unlink
> can take care of it.

  This is probably a missed optimization case.

> >  Yes, with framepointer it was ok. I guess that the FP can't be eliminated
> >  because that would change the offset into the frame and tracking that is
> >  probably hard.
> 
> The old SAS/C knew how to do that pretty well :-)

  SAS/C started to use SP-only with version 6 and they needed several
  subreleases to squeeze the last bugs out for it to work reliable
  according to their releasenotes.

> It could even inline varargs functions, something that GCC still can't do.
> It was pretty useful for inline stubs such as DoMethod() or Printf().

  Printf() is handled by a pragma, but indeed DoMethod() can be inlined.

> Could you please post the revised patch to gcc-patches for approval?
> GCC's front page still says that 3.4 is in stage 2. If we're lucky we
> can still get this in without opening a PR :-)

  3.4 is in stage 3. Does that mean that a PR is required now?
  The attached patch fixes the regressions caused by the switch to always
  use the computed values from m68k_compute_frame_layout.

  Gunther

--cut--
2003-10-21  Gunther Nikl  <gni@gecko.de>

	* config/m68k/m68k.c (m68k_compute_frame_layout): swap reg_mask and
	reg_rev_mask computation
	* config/m68k/m68k.c (m68k_output_function_prologue): Fix usage of
	current_frame (one typo and one missing); use reg_rev_mask not
	reg_mask
	* config/m68k/m68k.c (m68k_output_function_epilogue): Fix usage of
	current_frame; use fpu_rev_mask not fpu_mask

--- m68k.c.orig	Tue Oct 21 13:31:13 2003
+++ m68k.c	Tue Oct 21 13:32:35 2003
@@ -358,8 +358,8 @@ m68k_compute_frame_layout (void)
       for (regno = 16; regno < 24; regno++)
 	if (m68k_save_reg (regno, interrupt_handler))
 	  {
-	    mask |= 1 << (23 - regno);
-	    rmask |= 1 << (regno - 16);
+	    mask |= 1 << (regno - 16);
+	    rmask |= 1 << (23 - regno);
 	    saved++;
 	  }
       current_frame.foffset = saved * 12 /* (TARGET_CFV4E ? 8 : 12) */;
@@ -616,7 +616,7 @@ m68k_output_function_prologue (FILE *str
 #ifdef MOTOROLA
 	  asm_fprintf (stream, "\tfmovm %I0x%x,-(%Rsp)\n", current_frame.fpu_mask);
 #else
-	  asm_fprintf (stream, "\tfmovem %I0x%x,%Rsp@-\n", current_frmae.fpu_mask);
+	  asm_fprintf (stream, "\tfmovem %I0x%x,%Rsp@-\n", current_frame.fpu_mask);
 #endif
 	  if (dwarf2out_do_frame ())
 	    {
@@ -651,8 +651,8 @@ m68k_output_function_prologue (FILE *str
       else if (GET_CODE (stack_limit_rtx) != SYMBOL_REF)
 	warning ("stack limit expression is not supported");
     }
-  
-  if (num_saved_regs <= 2)
+
+  if (current_frame.reg_no <= 2)
     {
       /* Store each separately in the same order moveml uses.
          Using two movel instructions instead of a single moveml
@@ -701,9 +701,9 @@ m68k_output_function_prologue (FILE *str
       else
 	{
 #ifdef MOTOROLA
-	  asm_fprintf (stream, "\tmovm.l %I0x%x,-(%Rsp)\n", current_frame.reg_mask);
+	  asm_fprintf (stream, "\tmovm.l %I0x%x,-(%Rsp)\n", current_frame.reg_rev_mask);
 #else
-	  asm_fprintf (stream, "\tmoveml %I0x%x,%Rsp@-\n", current_frame.reg_mask);
+	  asm_fprintf (stream, "\tmoveml %I0x%x,%Rsp@-\n", current_frame.reg_rev_mask);
 #endif
 	}
       if (dwarf2out_do_frame ())
@@ -928,7 +928,7 @@ m68k_output_function_epilogue (FILE *str
 #else
               asm_fprintf (stream, "\tmoveml %s@(-%wd),%I0x%x\n",
                            reg_names[FRAME_POINTER_REGNUM],
-                           offset + fsize,
+                           current_frame.offset + fsize,
 			   current_frame.reg_mask);
 #endif
 	    }
@@ -1007,7 +1007,7 @@ m68k_output_function_epilogue (FILE *str
 	  asm_fprintf (stream, "\tfmovm -%wd(%s),%I0x%x\n",
 		       current_frame.foffset + fsize,
 		       reg_names[FRAME_POINTER_REGNUM],
-		       current_frame.fpu_mask);
+		       current_frame.fpu_rev_mask);
 #else
 	  asm_fprintf (stream, "\tfmovem %s@(-%wd),%I0x%x\n",
 		       reg_names[FRAME_POINTER_REGNUM],
--cut--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]