diff mbox

[AArch64/GCC,5/N] Use register offset in 'cfun->machine->frame.reg_offset'

Message ID 53CE7A61.2050205@arm.com
State New
Headers show

Commit Message

Jiong Wang July 22, 2014, 2:51 p.m. UTC
We should use offset calculated during frame layout instead of
ad-hoc interative increment.

This patch let the code fetch reg offsets from cfun->machine->frame.reg_offset.
By this fix, FP/LR could be treated as normal register also.

*no functional change*

OK to install?

thanks

gcc/
   * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Use register offset in
   cfun->machine->frame.reg_offset.
   (aarch64_save_or_restore_callee_save_registers): Likewise.

Comments

Marcus Shawcroft July 23, 2014, 4:07 p.m. UTC | #1
On 22 July 2014 15:51, Jiong Wang <jiong.wang@arm.com> wrote:

> gcc/
>   * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Use register
> offset in
>   cfun->machine->frame.reg_offset.
>   (aarch64_save_or_restore_callee_save_registers): Likewise.

OK and applied.
/Marcus
diff mbox

Patch

>From 03256b4c456569da68e5b33d82ecd9d47f281fba Mon Sep 17 00:00:00 2001
From: Jiong Wang <jiong.wang@arm.com>
Date: Tue, 17 Jun 2014 21:39:35 +0100
Subject: [PATCH 05/19] [AArch64/GCC][5/20] Use register offset in
 'cfun->machine->frame.reg_offset'

We should use offset calculated during frame layout instead of
ad-hoc interative increment.

This patch let the code fetch reg offsets from cfun->machine->frame.reg_offset.
By this fix, FP/LR could be treated as normal register also.

*no functional change*

2014-06-16  Jiong Wang <jiong.wang@arm.com>
	    Marcus Shawcroft  <marcus.shawcroft@arm.com>
gcc/
  * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Use register offset
  in cfun->machine->frame.reg_offset.
  (aarch64_save_or_restore_callee_save_registers): Likewise.
---
 gcc/config/aarch64/aarch64.c |   49 +++++++++++++++++++-----------------------
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index abcf30b..f61d96a 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -1922,10 +1922,11 @@  aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, int increment,
       if (aarch64_register_saved_on_entry (regno))
 	{
 	  rtx mem;
-	  mem = gen_mem_ref (DFmode,
-			     plus_constant (Pmode,
-					    stack_pointer_rtx,
-					    start_offset));
+
+	  HOST_WIDE_INT offset = start_offset
+				 + cfun->machine->frame.reg_offset[regno];
+	  mem = gen_mem_ref (DFmode, plus_constant (Pmode, stack_pointer_rtx,
+						    offset));
 
 	  for (regno2 = regno + 1;
 	       regno2 <= V31_REGNUM
@@ -1940,12 +1941,10 @@  aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, int increment,
 	    {
 	      rtx mem2;
 
-	      /* Next highest register to be saved.  */
+	      offset = start_offset + cfun->machine->frame.reg_offset[regno2];
 	      mem2 = gen_mem_ref (DFmode,
-				  plus_constant
-				  (Pmode,
-				   stack_pointer_rtx,
-				   start_offset + increment));
+				  plus_constant (Pmode, stack_pointer_rtx,
+						 offset));
 	      if (restore == false)
 		{
 		  insn = emit_insn
@@ -1971,7 +1970,6 @@  aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, int increment,
 		 frame-related if explicitly marked.  */
 	      RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
 	      regno = regno2;
-	      start_offset += increment * 2;
 	    }
 	  else
 	    {
@@ -1983,7 +1981,6 @@  aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, int increment,
 		  add_reg_note (insn, REG_CFA_RESTORE,
 				gen_rtx_REG (DFmode, regno));
 		}
-	      start_offset += increment;
 	    }
 	  RTX_FRAME_RELATED_P (insn) = 1;
 	}
@@ -2010,10 +2007,11 @@  aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
       if (aarch64_register_saved_on_entry (regno))
 	{
 	  rtx mem;
-	  mem = gen_mem_ref (Pmode,
-			     plus_constant (Pmode,
-					    stack_pointer_rtx,
-					    start_offset));
+
+	  HOST_WIDE_INT offset = start_offset
+				 + cfun->machine->frame.reg_offset[regno];
+	  mem = gen_mem_ref (Pmode, plus_constant (Pmode, stack_pointer_rtx,
+						   offset));
 
 	  for (regno2 = regno + 1;
 	       regno2 <= limit
@@ -2022,17 +2020,18 @@  aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
 	    {
 	      /* Empty loop.  */
 	    }
+
 	  if (regno2 <= limit
-	      && aarch64_register_saved_on_entry (regno2))
+	      && aarch64_register_saved_on_entry (regno2)
+	      && ((cfun->machine->frame.reg_offset[regno] + UNITS_PER_WORD)
+		  == cfun->machine->frame.reg_offset[regno2]))
 	    {
 	      rtx mem2;
 
-	      /* Next highest register to be saved.  */
+	      offset = start_offset + cfun->machine->frame.reg_offset[regno2];
 	      mem2 = gen_mem_ref (Pmode,
-				  plus_constant
-				  (Pmode,
-				   stack_pointer_rtx,
-				   start_offset + increment));
+				  plus_constant (Pmode, stack_pointer_rtx,
+						 offset));
 	      if (restore == false)
 		{
 		  insn = emit_insn
@@ -2058,7 +2057,6 @@  aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
 		 frame-related if explicitly marked.  */
 	      RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
 	      regno = regno2;
-	      start_offset += increment * 2;
 	    }
 	  else
 	    {
@@ -2070,7 +2068,6 @@  aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
 		  add_reg_note (insn, REG_CFA_RESTORE,
 				gen_rtx_REG (DImode, regno));
 		}
-	      start_offset += increment;
 	    }
 	  RTX_FRAME_RELATED_P (insn) = 1;
 	}
@@ -2269,8 +2266,7 @@  aarch64_expand_prologue (void)
 	  RTX_FRAME_RELATED_P (insn) = 1;
 	}
 
-      aarch64_save_or_restore_callee_save_registers
-	(fp_offset + cfun->machine->frame.hardfp_offset, 0);
+      aarch64_save_or_restore_callee_save_registers (fp_offset, 0);
     }
 
   /* when offset >= 512,
@@ -2341,8 +2337,7 @@  aarch64_expand_epilogue (bool for_sibcall)
       cfa_reg = stack_pointer_rtx;
     }
 
-  aarch64_save_or_restore_callee_save_registers
-    (fp_offset + cfun->machine->frame.hardfp_offset, 1);
+  aarch64_save_or_restore_callee_save_registers (fp_offset, 1);
 
   /* Restore the frame pointer and lr if the frame pointer is needed.  */
   if (offset > 0)
-- 
1.7.9.5