aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2012-01-17 15:41:50 +0000
committerNick Clifton <nickc@gcc.gnu.org>2012-01-17 15:41:50 +0000
commitbe61ce52148c5bc1bc7183089d99ee8470c723d3 (patch)
treebb0ef4b6da1546ce66dc815d2a326a532b55d55b
parent99eb180f6619a88a87bcf7afa4845d1d5aaec597 (diff)
downloadgcc-be61ce52148c5bc1bc7183089d99ee8470c723d3.zip
gcc-be61ce52148c5bc1bc7183089d99ee8470c723d3.tar.gz
gcc-be61ce52148c5bc1bc7183089d99ee8470c723d3.tar.bz2
rx.c (rx_can_use_simple_return): New function.
* config/rx/rx.c (rx_can_use_simple_return): New function. * config/rx/rx-protos.h (rx_can_use_simple_return): Prototype. * config/rx/rx.md (return): Predicate on rx_can_use_simple_return. From-SVN: r183252
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rx/rx-protos.h6
-rw-r--r--gcc/config/rx/rx.c29
-rw-r--r--gcc/config/rx/rx.md5
4 files changed, 40 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 055cc2e..ceba9c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-17 Nick Clifton <nickc@redhat.com>
+
+ * config/rx/rx.c (rx_can_use_simple_return): New function.
+ * config/rx/rx-protos.h (rx_can_use_simple_return): Prototype.
+ * config/rx/rx.md (return): Predicate on rx_can_use_simple_return.
+
2012-01-17 Richard Guenther <rguenther@suse.de>
PR middle-end/51782
diff --git a/gcc/config/rx/rx-protos.h b/gcc/config/rx/rx-protos.h
index 365bf66..f0352a8 100644
--- a/gcc/config/rx/rx-protos.h
+++ b/gcc/config/rx/rx-protos.h
@@ -1,5 +1,6 @@
/* Exported function prototypes from the Renesas RX backend.
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010, 2011, 2012
+ Free Software Foundation, Inc.
Contributed by Red Hat.
This file is part of GCC.
@@ -21,6 +22,8 @@
#ifndef GCC_RX_PROTOS_H
#define GCC_RX_PROTOS_H
+extern bool rx_can_use_simple_return (void);
+extern void rx_expand_epilogue (bool);
extern void rx_expand_prologue (void);
extern int rx_initial_elimination_offset (int, int);
@@ -29,7 +32,6 @@ extern int rx_adjust_insn_length (rtx, int);
extern int rx_align_for_label (rtx, int);
extern void rx_emit_stack_popm (rtx *, bool);
extern void rx_emit_stack_pushm (rtx *);
-extern void rx_expand_epilogue (bool);
extern char * rx_gen_move_template (rtx *, bool);
extern bool rx_is_legitimate_constant (enum machine_mode, rtx);
extern bool rx_is_restricted_memory_address (rtx,
diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c
index 4a73285..655f318 100644
--- a/gcc/config/rx/rx.c
+++ b/gcc/config/rx/rx.c
@@ -1,5 +1,6 @@
/* Subroutines used for code generation on Renesas RX processors.
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010, 2011, 2012
+ Free Software Foundation, Inc.
Contributed by Red Hat.
This file is part of GCC.
@@ -1818,7 +1819,31 @@ gen_rx_popm_vector (unsigned int low, unsigned int high)
return vector;
}
-
+
+/* Returns true if a simple return insn can be used. */
+
+bool
+rx_can_use_simple_return (void)
+{
+ unsigned int low;
+ unsigned int high;
+ unsigned int frame_size;
+ unsigned int stack_size;
+ unsigned int register_mask;
+
+ if (is_naked_func (NULL_TREE)
+ || is_fast_interrupt_func (NULL_TREE)
+ || is_interrupt_func (NULL_TREE))
+ return false;
+
+ rx_get_stack_layout (& low, & high, & register_mask,
+ & frame_size, & stack_size);
+
+ return (register_mask == 0
+ && (frame_size + stack_size) == 0
+ && low == 0);
+}
+
void
rx_expand_epilogue (bool is_sibcall)
{
diff --git a/gcc/config/rx/rx.md b/gcc/config/rx/rx.md
index 92768c6..1ba603f 100644
--- a/gcc/config/rx/rx.md
+++ b/gcc/config/rx/rx.md
@@ -1,5 +1,6 @@
;; Machine Description for Renesas RX processors
-;; Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 2008, 2009, 2010, 2011, 2012
+;; Free Software Foundation, Inc.
;; Contributed by Red Hat.
;; This file is part of GCC.
@@ -342,7 +343,7 @@
(define_expand "return"
[(return)]
- ""
+ "rx_can_use_simple_return ()"
"rx_expand_epilogue (false); DONE;"
)