aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2014-07-23 16:17:08 +0000
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>2014-07-23 16:17:08 +0000
commit72df5c1f6212b258f2daef128db4e74723001dde (patch)
treea67a5ed5e47305628a5588c179feb10478501dce /gcc
parent64dedd72f61a8925812675d180d274c47e6511b3 (diff)
downloadgcc-72df5c1f6212b258f2daef128db4e74723001dde.zip
gcc-72df5c1f6212b258f2daef128db4e74723001dde.tar.gz
gcc-72df5c1f6212b258f2daef128db4e74723001dde.tar.bz2
[AArch64] Use helper functions to handle multiple modes.
From-SVN: r212954
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64.c42
2 files changed, 45 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0a3f477..2900bc6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2014-07-23 Jiong Wang <jiong.wang@arm.com>
+ * config/aarch64/aarch64.c (aarch64_gen_load_pair)
+ (aarch64_gen_store_pair): New helper function.
+ (aarch64_save_or_restore_callee_save_registers)
+ (aarch64_save_or_restore_fprs): Use new helper functions.
+
+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.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 681dbe4..21745a0 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -1916,6 +1916,40 @@ aarch64_next_callee_save (unsigned regno, unsigned limit)
return regno;
}
+static rtx
+aarch64_gen_store_pair (enum machine_mode mode, rtx mem1, rtx reg1, rtx mem2,
+ rtx reg2)
+{
+ switch (mode)
+ {
+ case DImode:
+ return gen_store_pairdi (mem1, reg1, mem2, reg2);
+
+ case DFmode:
+ return gen_store_pairdf (mem1, reg1, mem2, reg2);
+
+ default:
+ gcc_unreachable ();
+ }
+}
+
+static rtx
+aarch64_gen_load_pair (enum machine_mode mode, rtx reg1, rtx mem1, rtx reg2,
+ rtx mem2)
+{
+ switch (mode)
+ {
+ case DImode:
+ return gen_load_pairdi (reg1, mem1, reg2, mem2);
+
+ case DFmode:
+ return gen_load_pairdf (reg1, mem1, reg2, mem2);
+
+ default:
+ gcc_unreachable ();
+ }
+}
+
static void
aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
{
@@ -1949,10 +1983,10 @@ aarch64_save_or_restore_fprs (HOST_WIDE_INT start_offset, bool restore)
mem2 = gen_mem_ref (DFmode,
plus_constant (Pmode, stack_pointer_rtx, offset));
if (restore == false)
- insn = emit_insn (gen_store_pairdf (mem, reg, mem2, reg2));
+ insn = emit_insn (aarch64_gen_store_pair (DFmode, mem, reg, mem2, reg2));
else
{
- insn = emit_insn (gen_load_pairdf (reg, mem, reg2, mem2));
+ insn = emit_insn (aarch64_gen_load_pair (DFmode, reg, mem, reg2, mem2));
add_reg_note (insn, REG_CFA_RESTORE, reg);
add_reg_note (insn, REG_CFA_RESTORE, reg2);
}
@@ -2018,10 +2052,10 @@ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT start_offset,
mem2 = gen_mem_ref (Pmode,
plus_constant (Pmode, stack_pointer_rtx, offset));
if (restore == false)
- insn = emit_insn (gen_store_pairdi (mem, reg, mem2, reg2));
+ insn = emit_insn (aarch64_gen_store_pair (DImode, mem, reg, mem2, reg2));
else
{
- insn = emit_insn (gen_load_pairdi (reg, mem, reg2, mem2));
+ insn = emit_insn (aarch64_gen_load_pair (DImode, reg, mem, reg2, mem2));
add_reg_note (insn, REG_CFA_RESTORE, reg);
add_reg_note (insn, REG_CFA_RESTORE, reg2);
}