aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2014-07-23 16:11:50 +0000
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>2014-07-23 16:11:50 +0000
commitbc5f5f369553ba7cc82a612527e0f1b2a37c4caa (patch)
tree08e7cc153402e5b03b2fc345e2f9f650cab6ce0f /gcc
parent55185278aba98ee8219ed8b73ba6336be5f7aeb6 (diff)
downloadgcc-bc5f5f369553ba7cc82a612527e0f1b2a37c4caa.zip
gcc-bc5f5f369553ba7cc82a612527e0f1b2a37c4caa.tar.gz
gcc-bc5f5f369553ba7cc82a612527e0f1b2a37c4caa.tar.bz2
[AArch64] Hoist calculation of register rtx.
From-SVN: r212951
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/aarch64/aarch64.c54
2 files changed, 24 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7fb2c22..323b2ea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,12 @@
* config/aarch64/aarch64.c
(aarch64_save_or_restore_callee_save_registers)
+ (aarch64_save_or_restore_fprs): Hoist calculation of register rtx.
+
+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): Remove 'increment'.
2014-07-23 Jiong Wang <jiong.wang@arm.com>
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index f8453e3..ac2dc79 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -1922,6 +1922,7 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
{
if (aarch64_register_saved_on_entry (regno))
{
+ rtx reg = gen_rtx_REG (DFmode, regno);
rtx mem;
HOST_WIDE_INT offset = start_offset
@@ -1940,6 +1941,7 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
if (regno2 <= V31_REGNUM
&& aarch64_register_saved_on_entry (regno2))
{
+ rtx reg2 = gen_rtx_REG (DFmode, regno2);
rtx mem2;
offset = start_offset + cfun->machine->frame.reg_offset[regno2];
@@ -1947,22 +1949,12 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
plus_constant (Pmode, stack_pointer_rtx,
offset));
if (restore == false)
- {
- insn = emit_insn
- (gen_store_pairdf (mem, gen_rtx_REG (DFmode, regno),
- mem2, gen_rtx_REG (DFmode, regno2)));
-
- }
+ insn = emit_insn (gen_store_pairdf (mem, reg, mem2, reg2));
else
{
- insn = emit_insn
- (gen_load_pairdf (gen_rtx_REG (DFmode, regno), mem,
- gen_rtx_REG (DFmode, regno2), mem2));
-
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DFmode, regno));
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DFmode, regno2));
+ insn = emit_insn (gen_load_pairdf (reg, mem, reg2, mem2));
+ add_reg_note (insn, REG_CFA_RESTORE, reg);
+ add_reg_note (insn, REG_CFA_RESTORE, reg2);
}
/* The first part of a frame-related parallel insn is
@@ -1975,12 +1967,11 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
else
{
if (restore == false)
- insn = emit_move_insn (mem, gen_rtx_REG (DFmode, regno));
+ insn = emit_move_insn (mem, reg);
else
{
- insn = emit_move_insn (gen_rtx_REG (DFmode, regno), mem);
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DFmode, regno));
+ insn = emit_move_insn (reg, mem);
+ add_reg_note (insn, REG_CFA_RESTORE, reg);
}
}
RTX_FRAME_RELATED_P (insn) = 1;
@@ -2006,6 +1997,7 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
{
if (aarch64_register_saved_on_entry (regno))
{
+ rtx reg = gen_rtx_REG (DImode, regno);
rtx mem;
HOST_WIDE_INT offset = start_offset
@@ -2026,6 +2018,7 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
&& ((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];
@@ -2033,22 +2026,12 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
plus_constant (Pmode, stack_pointer_rtx,
offset));
if (restore == false)
- {
- insn = emit_insn
- (gen_store_pairdi (mem, gen_rtx_REG (DImode, regno),
- mem2, gen_rtx_REG (DImode, regno2)));
-
- }
+ insn = emit_insn (gen_store_pairdi (mem, reg, mem2, reg2));
else
{
- insn = emit_insn
- (gen_load_pairdi (gen_rtx_REG (DImode, regno), mem,
- gen_rtx_REG (DImode, regno2), mem2));
-
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DImode, regno));
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DImode, regno2));
+ insn = emit_insn (gen_load_pairdi (reg, mem, reg2, mem2));
+ add_reg_note (insn, REG_CFA_RESTORE, reg);
+ add_reg_note (insn, REG_CFA_RESTORE, reg2);
}
/* The first part of a frame-related parallel insn is
@@ -2061,12 +2044,11 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
else
{
if (restore == false)
- insn = emit_move_insn (mem, gen_rtx_REG (DImode, regno));
+ insn = emit_move_insn (mem, reg);
else
{
- insn = emit_move_insn (gen_rtx_REG (DImode, regno), mem);
- add_reg_note (insn, REG_CFA_RESTORE,
- gen_rtx_REG (DImode, regno));
+ insn = emit_move_insn (reg, mem);
+ add_reg_note (insn, REG_CFA_RESTORE, reg);
}
}
RTX_FRAME_RELATED_P (insn) = 1;