Commit dadf084c by Jiong Wang Committed by Marcus Shawcroft

[AArch64] Fix layout of frame layout code.

From-SVN: r211416
parent 2a74759f
2014-06-10 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64.c (aarch64_save_or_restore_fprs)
(aarch64_save_or_restore_callee_save_registers): Fix layout.
2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64-simd.md (aarch64_sqdmulh_lane<mode>): * config/aarch64/aarch64-simd.md (aarch64_sqdmulh_lane<mode>):
......
...@@ -1917,7 +1917,6 @@ aarch64_save_or_restore_fprs (int start_offset, int increment, ...@@ -1917,7 +1917,6 @@ aarch64_save_or_restore_fprs (int start_offset, int increment,
rtx (*gen_mem_ref)(enum machine_mode, rtx) rtx (*gen_mem_ref)(enum machine_mode, rtx)
= (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM; = (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM;
for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++) for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
{ {
if (aarch64_register_saved_on_entry (regno)) if (aarch64_register_saved_on_entry (regno))
...@@ -1935,10 +1934,12 @@ aarch64_save_or_restore_fprs (int start_offset, int increment, ...@@ -1935,10 +1934,12 @@ aarch64_save_or_restore_fprs (int start_offset, int increment,
{ {
/* Empty loop. */ /* Empty loop. */
} }
if (regno2 <= V31_REGNUM && if (regno2 <= V31_REGNUM &&
aarch64_register_saved_on_entry (regno2)) aarch64_register_saved_on_entry (regno2))
{ {
rtx mem2; rtx mem2;
/* Next highest register to be saved. */ /* Next highest register to be saved. */
mem2 = gen_mem_ref (DFmode, mem2 = gen_mem_ref (DFmode,
plus_constant plus_constant
...@@ -1964,10 +1965,10 @@ aarch64_save_or_restore_fprs (int start_offset, int increment, ...@@ -1964,10 +1965,10 @@ aarch64_save_or_restore_fprs (int start_offset, int increment,
gen_rtx_REG (DFmode, regno2)); gen_rtx_REG (DFmode, regno2));
} }
/* The first part of a frame-related parallel insn /* The first part of a frame-related parallel insn is
is always assumed to be relevant to the frame always assumed to be relevant to the frame
calculations; subsequent parts, are only calculations; subsequent parts, are only
frame-related if explicitly marked. */ frame-related if explicitly marked. */
RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1; RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
regno = regno2; regno = regno2;
start_offset += increment * 2; start_offset += increment * 2;
...@@ -1987,7 +1988,6 @@ aarch64_save_or_restore_fprs (int start_offset, int increment, ...@@ -1987,7 +1988,6 @@ aarch64_save_or_restore_fprs (int start_offset, int increment,
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
} }
} }
} }
...@@ -1995,7 +1995,7 @@ aarch64_save_or_restore_fprs (int start_offset, int increment, ...@@ -1995,7 +1995,7 @@ aarch64_save_or_restore_fprs (int start_offset, int increment,
restore's have to happen. */ restore's have to happen. */
static void static void
aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset, aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
bool restore) bool restore)
{ {
rtx insn; rtx insn;
rtx base_rtx = stack_pointer_rtx; rtx base_rtx = stack_pointer_rtx;
...@@ -2027,6 +2027,7 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset, ...@@ -2027,6 +2027,7 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
aarch64_register_saved_on_entry (regno2)) aarch64_register_saved_on_entry (regno2))
{ {
rtx mem2; rtx mem2;
/* Next highest register to be saved. */ /* Next highest register to be saved. */
mem2 = gen_mem_ref (Pmode, mem2 = gen_mem_ref (Pmode,
plus_constant plus_constant
...@@ -2050,12 +2051,11 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset, ...@@ -2050,12 +2051,11 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno2)); add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno2));
} }
/* The first part of a frame-related parallel insn /* The first part of a frame-related parallel insn is
is always assumed to be relevant to the frame always assumed to be relevant to the frame
calculations; subsequent parts, are only calculations; subsequent parts, are only
frame-related if explicitly marked. */ frame-related if explicitly marked. */
RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
1)) = 1;
regno = regno2; regno = regno2;
start_offset += increment * 2; start_offset += increment * 2;
} }
...@@ -2075,7 +2075,6 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset, ...@@ -2075,7 +2075,6 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
} }
aarch64_save_or_restore_fprs (start_offset, increment, restore, base_rtx); aarch64_save_or_restore_fprs (start_offset, increment, restore, base_rtx);
} }
/* AArch64 stack frames generated by this compiler look like: /* AArch64 stack frames generated by this compiler look like:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment