This is the mail archive of the gcc-patches@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]

ppc frame cleanup patch


we have code duplicated all over the prologue and epilogue generation code
to do basically the same thing.

this patch abstracts some of it in an effort to clean this up.

i also changed rs6000_frame_related to do the second substitution before we
munge everything.  as it stands now it sometimes munges things up and
then it can't do the second substitution.

i'm working on a ppc variant port that has more restrictive addressing
modes, so the frame related stuff is a bit different, and we have to
annotate the rtl.   so we need to make sure this substitution happens 
correctly.

[i've also noted that the altivec frame notes are incorrect.  i really
doubt altivec code and exception handling has ever worked.  i'll be
fixing this later.]

regression tested on ppc linux.

ok?

2002-07-08  Aldy Hernandez  <aldyh@redhat.com>

	* rs6000.c (emit_frame_save): New.
	(rs6000_frame_related): Replace reg2 before reg.
	(rs6000_emit_prologue): Use emit_frame_save for saving gprs, fprs,
	and eh_return registers.


Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/uberbaum/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.340
diff -c -p -r1.340 rs6000.c
*** config/rs6000/rs6000.c	1 Jul 2002 23:07:10 -0000	1.340
--- config/rs6000/rs6000.c	9 Jul 2002 23:29:28 -0000
*************** static rtx rs6000_generate_compare PARAM
*** 140,145 ****
--- 140,147 ----
  static void rs6000_maybe_dead PARAMS ((rtx));
  static void rs6000_emit_stack_tie PARAMS ((void));
  static void rs6000_frame_related PARAMS ((rtx, rtx, HOST_WIDE_INT, rtx, rtx));
+ static void emit_frame_save PARAMS ((rtx, rtx, enum machine_mode,
+ 				     unsigned int, int, int));
  static void rs6000_emit_allocate_stack PARAMS ((HOST_WIDE_INT, int));
  static unsigned rs6000_hash_constant PARAMS ((rtx));
  static unsigned toc_hash_function PARAMS ((const void *));
*************** rs6000_frame_related (insn, reg, val, re
*** 8452,8457 ****
--- 8454,8462 ----
  
    real = copy_rtx (PATTERN (insn));
  
+   if (reg2 != NULL_RTX)
+     real = replace_rtx (real, reg2, rreg);
+   
    real = replace_rtx (real, reg, 
  		      gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
  							STACK_POINTER_REGNUM),
*************** rs6000_frame_related (insn, reg, val, re
*** 8504,8512 ****
    else
      abort ();
    
-   if (reg2 != NULL_RTX)
-     real = replace_rtx (real, reg2, rreg);
-   
    RTX_FRAME_RELATED_P (insn) = 1;
    REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
  					real,
--- 8509,8514 ----
*************** generate_set_vrsave (reg, info, epilogue
*** 8575,8580 ****
--- 8577,8629 ----
    return insn;
  }
  
+ /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
+    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
+ 
+ static void
+ emit_frame_save (frame_reg, frame_ptr, mode, regno, offset, total_size)
+      rtx frame_reg;
+      rtx frame_ptr;
+      enum machine_mode mode;
+      unsigned int regno;
+      int offset;
+      int total_size;
+ {
+   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
+   rtx replacea, replaceb;
+ 
+   int_rtx = GEN_INT (offset);
+ 
+   /* Some cases that need register indexed addressing.  */
+   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
+       /* Add more cases here.  */
+       )
+     {
+       /* Whomever calls us must make sure r11 is available in the
+          flow path of instructions in the prologue.  */
+       offset_rtx = gen_rtx_REG (Pmode, 11);
+       emit_move_insn (offset_rtx, int_rtx);
+ 
+       replacea = offset_rtx;
+       replaceb = int_rtx;
+     }
+   else
+     {
+       offset_rtx = int_rtx;
+       replacea = NULL_RTX;
+       replaceb = NULL_RTX;
+     }
+ 
+   reg = gen_rtx_REG (mode, regno);
+   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
+   mem = gen_rtx_MEM (mode, addr);
+   set_mem_alias_set (mem, rs6000_sr_alias_set);
+ 
+   insn = emit_move_insn (mem, reg);
+ 
+   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
+ }
+ 
  /* Emit function prologue as insns.  */
  
  void
*************** rs6000_emit_prologue ()
*** 8702,8721 ****
        for (i = 0; i < 64 - info->first_fp_reg_save; i++)
  	if ((regs_ever_live[info->first_fp_reg_save+i] 
  	     && ! call_used_regs[info->first_fp_reg_save+i]))
! 	  {
! 	    rtx addr, reg, mem;
! 	    reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
! 	    addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
! 				 GEN_INT (info->fp_save_offset 
! 					  + sp_offset 
! 					  + 8 * i));
! 	    mem = gen_rtx_MEM (DFmode, addr);
! 	    set_mem_alias_set (mem, rs6000_sr_alias_set);
! 
! 	    insn = emit_move_insn (mem, reg);
! 	    rs6000_frame_related (insn, frame_ptr_rtx, info->total_size, 
! 				  NULL_RTX, NULL_RTX);
! 	  }
      }
    else if (info->first_fp_reg_save != 64)
      {
--- 8751,8760 ----
        for (i = 0; i < 64 - info->first_fp_reg_save; i++)
  	if ((regs_ever_live[info->first_fp_reg_save+i] 
  	     && ! call_used_regs[info->first_fp_reg_save+i]))
! 	  emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
! 			   info->first_fp_reg_save + i,
! 			   info->fp_save_offset + sp_offset + 8 * i,
! 			   info->total_size);
      }
    else if (info->first_fp_reg_save != 64)
      {
*************** rs6000_emit_prologue ()
*** 8785,8804 ****
  	    || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
  		&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
  		    || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
! 	  {
! 	    rtx addr, reg, mem;
! 	    reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
! 	    addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, 
! 				 GEN_INT (info->gp_save_offset 
! 					  + sp_offset 
! 					  + reg_size * i));
! 	    mem = gen_rtx_MEM (reg_mode, addr);
! 	    set_mem_alias_set (mem, rs6000_sr_alias_set);
! 
! 	    insn = emit_move_insn (mem, reg);
! 	    rs6000_frame_related (insn, frame_ptr_rtx, info->total_size, 
! 				  NULL_RTX, NULL_RTX);
! 	  }
      }
  
    /* ??? There's no need to emit actual instructions here, but it's the
--- 8824,8833 ----
  	    || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
  		&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
  		    || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
! 	  emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode,
! 			   info->first_gp_reg_save + i,
! 			   info->gp_save_offset + sp_offset + reg_size * i,
! 			   info->total_size);
      }
  
    /* ??? There's no need to emit actual instructions here, but it's the
*************** rs6000_emit_prologue ()
*** 8809,8830 ****
  
        for (i = 0; ; ++i)
  	{
- 	  rtx addr, reg, mem;
- 
  	  regno = EH_RETURN_DATA_REGNO (i);
  	  if (regno == INVALID_REGNUM)
  	    break;
  
! 	  reg = gen_rtx_REG (reg_mode, regno);
! 	  addr = plus_constant (frame_reg_rtx,
! 				info->ehrd_offset + sp_offset
! 				+ reg_size * (int) i);
! 	  mem = gen_rtx_MEM (reg_mode, addr);
! 	  set_mem_alias_set (mem, rs6000_sr_alias_set);
! 
! 	  insn = emit_move_insn (mem, reg);
! 	  rs6000_frame_related (insn, frame_ptr_rtx, info->total_size, 
! 				NULL_RTX, NULL_RTX);
  	}
      }
  
--- 8838,8851 ----
  
        for (i = 0; ; ++i)
  	{
  	  regno = EH_RETURN_DATA_REGNO (i);
  	  if (regno == INVALID_REGNUM)
  	    break;
  
! 	  emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
! 			   info->ehrd_offset + sp_offset
! 			   + reg_size * (int) i,
! 			   info->total_size);
  	}
      }
  


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