Commit 64dedd72 by Jiong Wang Committed by Marcus Shawcroft

[AArch64] Refactor code out into aarch64_next_callee_save

From-SVN: r212952
parent bc5f5f36
2014-07-23 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64.c (aarch64_next_callee_save): New function.
(aarch64_save_or_restore_callee_save_registers)
(aarch64_save_or_restore_fprs): Use aarch64_next_callee_save.
2014-07-23 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64.c
(aarch64_save_or_restore_callee_save_registers)
(aarch64_save_or_restore_fprs): Hoist calculation of register rtx.
......
......@@ -1908,6 +1908,13 @@ aarch64_register_saved_on_entry (int regno)
return cfun->machine->frame.reg_offset[regno] >= 0;
}
static unsigned
aarch64_next_callee_save (unsigned regno, unsigned limit)
{
while (regno <= limit && !aarch64_register_saved_on_entry (regno))
regno ++;
return regno;
}
static void
aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
......@@ -1918,9 +1925,10 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
rtx (*gen_mem_ref) (enum machine_mode, rtx)
= frame_pointer_needed ? gen_frame_mem : gen_rtx_MEM;
for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
{
if (aarch64_register_saved_on_entry (regno))
for (regno = aarch64_next_callee_save (V0_REGNUM, V31_REGNUM);
regno <= V31_REGNUM;
regno = aarch64_next_callee_save (regno + 1, V31_REGNUM))
{
rtx reg = gen_rtx_REG (DFmode, regno);
rtx mem;
......@@ -1930,24 +1938,16 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
mem = gen_mem_ref (DFmode, plus_constant (Pmode, stack_pointer_rtx,
offset));
for (regno2 = regno + 1;
regno2 <= V31_REGNUM
&& !aarch64_register_saved_on_entry (regno2);
regno2++)
{
/* Empty loop. */
}
regno2 = aarch64_next_callee_save (regno + 1, V31_REGNUM);
if (regno2 <= V31_REGNUM
&& aarch64_register_saved_on_entry (regno2))
if (regno2 <= V31_REGNUM)
{
rtx reg2 = gen_rtx_REG (DFmode, regno2);
rtx mem2;
offset = start_offset + cfun->machine->frame.reg_offset[regno2];
mem2 = gen_mem_ref (DFmode,
plus_constant (Pmode, stack_pointer_rtx,
offset));
plus_constant (Pmode, stack_pointer_rtx, offset));
if (restore == false)
insn = emit_insn (gen_store_pairdf (mem, reg, mem2, reg2));
else
......@@ -1976,7 +1976,6 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
}
RTX_FRAME_RELATED_P (insn) = 1;
}
}
}
......@@ -1993,9 +1992,9 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
unsigned regno;
unsigned regno2;
for (regno = R0_REGNUM; regno <= limit; regno++)
{
if (aarch64_register_saved_on_entry (regno))
for (regno = aarch64_next_callee_save (R0_REGNUM, limit);
regno <= limit;
regno = aarch64_next_callee_save (regno + 1, limit))
{
rtx reg = gen_rtx_REG (DImode, regno);
rtx mem;
......@@ -2005,26 +2004,19 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
mem = gen_mem_ref (Pmode, plus_constant (Pmode, stack_pointer_rtx,
offset));
for (regno2 = regno + 1;
regno2 <= limit
&& !aarch64_register_saved_on_entry (regno2);
regno2++)
{
/* Empty loop. */
}
regno2 = aarch64_next_callee_save (regno + 1, limit);
if (regno2 <= limit
&& aarch64_register_saved_on_entry (regno2)
&& ((cfun->machine->frame.reg_offset[regno] + UNITS_PER_WORD)
== cfun->machine->frame.reg_offset[regno2]))
{
rtx reg2 = gen_rtx_REG (DImode, regno2);
rtx mem2;
offset = start_offset + cfun->machine->frame.reg_offset[regno2];
mem2 = gen_mem_ref (Pmode,
plus_constant (Pmode, stack_pointer_rtx,
offset));
plus_constant (Pmode, stack_pointer_rtx, offset));
if (restore == false)
insn = emit_insn (gen_store_pairdi (mem, reg, mem2, reg2));
else
......@@ -2053,8 +2045,6 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
}
RTX_FRAME_RELATED_P (insn) = 1;
}
}
aarch64_save_or_restore_fprs (start_offset, restore);
}
......
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