summaryrefslogtreecommitdiff
path: root/gcc/config/arm/predicates.md
diff options
context:
space:
mode:
authorgretay <gretay@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-18 17:24:25 +0000
committergretay <gretay@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-18 17:24:25 +0000
commit426be8c56ddd712ef1b9959c56c5e01387412f68 (patch)
tree54f6acbbd5d6ba5320cdcd59bc25cd4deceb85cc /gcc/config/arm/predicates.md
parentd0e38b85acb8cef98af8da649f50ce26e55c7ec2 (diff)
downloadgcc-426be8c56ddd712ef1b9959c56c5e01387412f68.tar.gz
This patch adds new define_insn patterns for epilogue with integer
registers. The patterns can handle pop multiple with writeback and return (loading into PC directly). To handle return, the patterns use a new special predicate pop_multiple_return, that uses ldm_stm_operation_p function from a previous patch. To output assembly, the patterns use a new function arm_output_multireg_pop. This patch also adds a new function arm_emit_multi_reg_pop that emits RTL that matches the new pop patterns for integer registers. This is a helper function for epilogue expansion. It is used by a later patch. 2012-06-18 Ian Bolton <ian.bolton@arm.com> Sameera Deshpande <sameera.deshpande@arm.com> Greta Yorsh <greta.yorsh@arm.com> * config/arm/arm.md (load_multiple_with_writeback) New define_insn. (load_multiple, pop_multiple_with_writeback_and_return) Likewise. (pop_multiple_with_return, ldr_with_return) Likewise. * config/arm/predicates.md (pop_multiple_return) New special predicate. * config/arm/arm-protos.h (arm_output_multireg_pop) New declaration. * config/arm/arm.c (arm_output_multireg_pop) New function. (arm_emit_multi_reg_pop): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188739 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/arm/predicates.md')
-rw-r--r--gcc/config/arm/predicates.md8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md
index 355b77281f5..6eaab3d49e9 100644
--- a/gcc/config/arm/predicates.md
+++ b/gcc/config/arm/predicates.md
@@ -368,6 +368,14 @@
/*return_pc=*/false);
})
+(define_special_predicate "pop_multiple_return"
+ (match_code "parallel")
+{
+ return ldm_stm_operation_p (op, /*load=*/true, SImode,
+ /*consecutive=*/false,
+ /*return_pc=*/true);
+})
+
(define_special_predicate "multi_register_push"
(match_code "parallel")
{