diff options
author | Jiong Wang <jiong.wang@arm.com> | 2014-07-23 16:17:08 +0000 |
---|---|---|
committer | Marcus Shawcroft <mshawcroft@gcc.gnu.org> | 2014-07-23 16:17:08 +0000 |
commit | 72df5c1f6212b258f2daef128db4e74723001dde (patch) | |
tree | a67a5ed5e47305628a5588c179feb10478501dce | |
parent | 64dedd72f61a8925812675d180d274c47e6511b3 (diff) | |
download | gcc-72df5c1f6212b258f2daef128db4e74723001dde.zip gcc-72df5c1f6212b258f2daef128db4e74723001dde.tar.gz gcc-72df5c1f6212b258f2daef128db4e74723001dde.tar.bz2 |
[AArch64] Use helper functions to handle multiple modes.
From-SVN: r212954
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 42 |
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); } |