[rx] avoid long calls
diff mbox

Message ID 201512090259.tB92xC95024070@greed.delorie.com
State New
Headers show

Commit Message

DJ Delorie Dec. 9, 2015, 2:59 a.m. UTC
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.

diff mbox

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
 -mallow-string-insns -mno-allow-string-insns@gol
 @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
 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.
+Target Report Mask(JSR)
+Always use JSR, never BSR, for calls.