This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[AArch64/GCC][5/N] Use register offset in 'cfun->machine->frame.reg_offset'
- From: Jiong Wang <jiong dot wang at arm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 22 Jul 2014 15:51:13 +0100
- Subject: [AArch64/GCC][5/N] Use register offset in 'cfun->machine->frame.reg_offset'
- Authentication-results: sourceware.org; auth=none
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.
>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