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.