diff options
author | gretay <gretay@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-18 17:24:25 +0000 |
---|---|---|
committer | gretay <gretay@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-18 17:24:25 +0000 |
commit | 426be8c56ddd712ef1b9959c56c5e01387412f68 (patch) | |
tree | 54f6acbbd5d6ba5320cdcd59bc25cd4deceb85cc /gcc/config/arm/predicates.md | |
parent | d0e38b85acb8cef98af8da649f50ce26e55c7ec2 (diff) | |
download | gcc-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.md | 8 |
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") { |