[rx] avoid long calls
DJ Delorie
dj@redhat.com
Wed Dec 9 02:59:00 GMT 2015
Immediate mode jumps have limits; this new option tells gcc to avoid
those instructions (by using indirect mode ones) in those rare cases
where the user has a program that big. Committed.
* config/rx/rx.opt (-mjsr): Add.
* config/rx/predicates.md (rx_call_operand): Avoid overflowing
calls when -mjsr.
* config/rx/rx.c (rx_function_ok_for_sibcall): Likewise for
overflowing jumps.
* doc/invoke.texi (-mjsr): Document it.
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 231438)
+++ doc/invoke.texi (working copy)
@@ -965,12 +965,13 @@ See RS/6000 and PowerPC Options.
-mas100-syntax -mno-as100-syntax@gol
-mrelax@gol
-mmax-constant-size=@gol
-mint-register=@gol
-mpid@gol
-mallow-string-insns -mno-allow-string-insns@gol
+-mjsr@gol
-mno-warn-multiple-fast-interrupts@gol
-msave-acc-in-interrupts}
@emph{S/390 and zSeries Options}
@gccoptlist{-mtune=@var{cpu-type} -march=@var{cpu-type} @gol
-mhard-float -msoft-float -mhard-dfp -mno-hard-dfp @gol
@@ -20682,12 +20683,21 @@ disabled automatically. Instead it is r
use the @option{-mno-allow-string-insns} option if their program
accesses I/O space.
When the instructions are enabled GCC defines the C preprocessor
symbol @code{__RX_ALLOW_STRING_INSNS__}, otherwise it defines the
symbol @code{__RX_DISALLOW_STRING_INSNS__}.
+
+@item -mjsr
+@itemx -mno-jsr
+@opindex mjsr
+@opindex mno-jsr
+Use only (or not only) @code{JSR} instructions to access functions.
+This option can be used when code size exceeds the range of @code{BSR}
+instructions. Note that @option{-mno-jsr} does not mean to not use
+@code{JSR} but instead means that any type of branch may be used.
@end table
@emph{Note:} The generic GCC command-line option @option{-ffixed-@var{reg}}
has special significance to the RX port when used with the
@code{interrupt} function attribute. This attribute indicates a
function intended to process fast interrupts. GCC ensures
Index: config/rx/predicates.md
===================================================================
--- config/rx/predicates.md (revision 231438)
+++ config/rx/predicates.md (working copy)
@@ -21,13 +21,15 @@
;; Check that the operand is suitable for a call insn.
;; Only registers and symbol refs are allowed.
(define_predicate "rx_call_operand"
- (match_code "symbol_ref,reg")
+ (ior (match_code "reg")
+ (and (match_test "!TARGET_JSR")
+ (match_code "symbol_ref")))
)
;; For sibcall operations we can only use a symbolic address.
(define_predicate "rx_symbolic_call_operand"
(match_code "symbol_ref")
Index: config/rx/rx.c
===================================================================
--- config/rx/rx.c (revision 231438)
+++ config/rx/rx.c (working copy)
@@ -2854,12 +2854,15 @@ rx_warn_func_return (tree decl)
/* Return nonzero if it is ok to make a tail-call to DECL,
a function_decl or NULL if this is an indirect call, using EXP */
static bool
rx_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
{
+ if (TARGET_JSR)
+ return false;
+
/* Do not allow indirect tailcalls. The
sibcall patterns do not support them. */
if (decl == NULL)
return false;
/* Never tailcall from inside interrupt handlers or naked functions. */
Index: config/rx/rx.opt
===================================================================
--- config/rx/rx.opt (revision 231438)
+++ config/rx/rx.opt (working copy)
@@ -146,6 +146,12 @@ Enable the use of the LRA register alloc
;---------------------------------------------------
mallow-string-insns
Target Report Var(rx_allow_string_insns) Init(1)
Enables or disables the use of the SMOVF, SMOVB, SMOVU, SUNTIL, SWHILE and RMPA instructions. Enabled by default.
+
+;---------------------------------------------------
+
+mjsr
+Target Report Mask(JSR)
+Always use JSR, never BSR, for calls.
More information about the Gcc-patches
mailing list