From: Jim Wilson Date: Tue, 13 Oct 1992 18:09:59 +0000 (-0700) Subject: (i960_output_call_insn): Emit bx instead of b, callx instead of callj. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=76542a00ceb4e026211ad4a91333b464b1b73906;p=gcc.git (i960_output_call_insn): Emit bx instead of b, callx instead of callj. From-SVN: r2430 --- diff --git a/gcc/config/i960/i960.c b/gcc/config/i960/i960.c index 0f4e5ae2a7b..2880827e125 100644 --- a/gcc/config/i960/i960.c +++ b/gcc/config/i960/i960.c @@ -1193,15 +1193,16 @@ char * i960_output_call_insn (target, argsize_rtx, insn) register rtx target, argsize_rtx, insn; { - int non_indirect; int argsize = INTVAL (argsize_rtx); rtx nexti = next_real_insn (insn); rtx operands[1]; operands[0] = target; - non_indirect = ((GET_CODE (target) == MEM) - && (GET_CODE (XEXP (target, 0)) == SYMBOL_REF)); + /* The code used to assume that calls to SYMBOL_REFs could not be more + than 24 bits away (b vs bx, callj vs callx). This is not true. This + feature is now implemented by relaxing in the GNU linker. It can convert + bx to b if in range, and callx to calls/call/balx/bal as appropriate. */ /* Nexti could be zero if the called routine is volatile. */ if (optimize && (*epilogue_string == 0) && argsize == 0 && tail_call_ok @@ -1210,12 +1211,11 @@ i960_output_call_insn (target, argsize_rtx, insn) /* Delete following return insn. */ if (nexti && no_labels_between_p (insn, nexti)) delete_insn (nexti); - output_asm_insn (non_indirect ? "b %0" : "bx %0", - operands); + output_asm_insn ("bx %0", operands); return "# notreached"; } - output_asm_insn (non_indirect ? "callj %0" : "callx %0", operands); + output_asm_insn ("callx %0", operands); return ""; }