Commit 7c19c715 by Julian Brown Committed by Julian Brown

arm.c (arm_function_ok_for_sibcall): Only forbid sibling calls for Thumb-1.

	gcc/
	* config/arm/arm.c (arm_function_ok_for_sibcall): Only forbid
	sibling calls for Thumb-1.
	* config/arm/arm.h (USE_RETURN_INSN): Enable for Thumb-2.
	* config/arm/arm.md (*call_symbol, *call_value_symbol): Use for
	Thumb-2.
	(*call_insn, *call_value_insn): Don't use for Thumb-2.
	(sibcall, sibcall_value, *sibcall_insn, *sibcall_value_insn): Use
	for Thumb-2.
	(return): New expander.
	(*arm_return): New name for ARM return insn.
	* config/arm/thumb2.md (*thumb2_return): New insn pattern.


Co-Authored-By: Mark Mitchell <mark@codesourcery.com>

From-SVN: r159672
parent 204fc550
2010-05-21 Julian Brown <julian@codesourcery.com>
Mark Mitchell <mark@codesourcery.com>
* config/arm/arm.c (arm_function_ok_for_sibcall): Only forbid
sibling calls for Thumb-1.
* config/arm/arm.h (USE_RETURN_INSN): Enable for Thumb-2.
* config/arm/arm.md (*call_symbol, *call_value_symbol): Use for
Thumb-2.
(*call_insn, *call_value_insn): Don't use for Thumb-2.
(sibcall, sibcall_value, *sibcall_insn, *sibcall_value_insn): Use
for Thumb-2.
(return): New expander.
(*arm_return): New name for ARM return insn.
* config/arm/thumb2.md (*thumb2_return): New insn pattern.
2010-05-19 Joel Sherrill <joel.sherrill@oarcorp.com> 2010-05-19 Joel Sherrill <joel.sherrill@oarcorp.com>
* config.gcc (sparc64-*-rtems*): New target. * config.gcc (sparc64-*-rtems*): New target.
......
...@@ -4794,8 +4794,8 @@ arm_function_ok_for_sibcall (tree decl, tree exp) ...@@ -4794,8 +4794,8 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
return false; return false;
/* Never tailcall something for which we have no decl, or if we /* Never tailcall something for which we have no decl, or if we
are in Thumb mode. */ are generating code for Thumb-1. */
if (decl == NULL || TARGET_THUMB) if (decl == NULL || TARGET_THUMB1)
return false; return false;
/* The PIC register is live on entry to VxWorks PLT entries, so we /* The PIC register is live on entry to VxWorks PLT entries, so we
......
...@@ -1814,10 +1814,8 @@ typedef struct ...@@ -1814,10 +1814,8 @@ typedef struct
/* Determine if the epilogue should be output as RTL. /* Determine if the epilogue should be output as RTL.
You should override this if you define FUNCTION_EXTRA_EPILOGUE. */ You should override this if you define FUNCTION_EXTRA_EPILOGUE. */
/* This is disabled for Thumb-2 because it will confuse the
conditional insn counter. */
#define USE_RETURN_INSN(ISCOND) \ #define USE_RETURN_INSN(ISCOND) \
(TARGET_ARM ? use_return_insn (ISCOND, NULL) : 0) (TARGET_32BIT ? use_return_insn (ISCOND, NULL) : 0)
/* Definitions for register eliminations. /* Definitions for register eliminations.
......
...@@ -8650,7 +8650,7 @@ ...@@ -8650,7 +8650,7 @@
(match_operand 1 "" "")) (match_operand 1 "" ""))
(use (match_operand 2 "" "")) (use (match_operand 2 "" ""))
(clobber (reg:SI LR_REGNUM))] (clobber (reg:SI LR_REGNUM))]
"TARGET_ARM "TARGET_32BIT
&& (GET_CODE (operands[0]) == SYMBOL_REF) && (GET_CODE (operands[0]) == SYMBOL_REF)
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))" && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))"
"* "*
...@@ -8666,7 +8666,7 @@ ...@@ -8666,7 +8666,7 @@
(match_operand:SI 2 "" ""))) (match_operand:SI 2 "" "")))
(use (match_operand 3 "" "")) (use (match_operand 3 "" ""))
(clobber (reg:SI LR_REGNUM))] (clobber (reg:SI LR_REGNUM))]
"TARGET_ARM "TARGET_32BIT
&& (GET_CODE (operands[1]) == SYMBOL_REF) && (GET_CODE (operands[1]) == SYMBOL_REF)
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))" && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))"
"* "*
...@@ -8681,7 +8681,7 @@ ...@@ -8681,7 +8681,7 @@
(match_operand:SI 1 "" "")) (match_operand:SI 1 "" ""))
(use (match_operand 2 "" "")) (use (match_operand 2 "" ""))
(clobber (reg:SI LR_REGNUM))] (clobber (reg:SI LR_REGNUM))]
"TARGET_THUMB "TARGET_THUMB1
&& GET_CODE (operands[0]) == SYMBOL_REF && GET_CODE (operands[0]) == SYMBOL_REF
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))" && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))"
"bl\\t%a0" "bl\\t%a0"
...@@ -8695,7 +8695,7 @@ ...@@ -8695,7 +8695,7 @@
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(use (match_operand 3 "" "")) (use (match_operand 3 "" ""))
(clobber (reg:SI LR_REGNUM))] (clobber (reg:SI LR_REGNUM))]
"TARGET_THUMB "TARGET_THUMB1
&& GET_CODE (operands[1]) == SYMBOL_REF && GET_CODE (operands[1]) == SYMBOL_REF
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))" && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))"
"bl\\t%a1" "bl\\t%a1"
...@@ -8709,7 +8709,7 @@ ...@@ -8709,7 +8709,7 @@
(match_operand 1 "general_operand" "")) (match_operand 1 "general_operand" ""))
(return) (return)
(use (match_operand 2 "" ""))])] (use (match_operand 2 "" ""))])]
"TARGET_ARM" "TARGET_32BIT"
" "
{ {
if (operands[2] == NULL_RTX) if (operands[2] == NULL_RTX)
...@@ -8723,7 +8723,7 @@ ...@@ -8723,7 +8723,7 @@
(match_operand 2 "general_operand" ""))) (match_operand 2 "general_operand" "")))
(return) (return)
(use (match_operand 3 "" ""))])] (use (match_operand 3 "" ""))])]
"TARGET_ARM" "TARGET_32BIT"
" "
{ {
if (operands[3] == NULL_RTX) if (operands[3] == NULL_RTX)
...@@ -8736,7 +8736,7 @@ ...@@ -8736,7 +8736,7 @@
(match_operand 1 "" "")) (match_operand 1 "" ""))
(return) (return)
(use (match_operand 2 "" ""))] (use (match_operand 2 "" ""))]
"TARGET_ARM && GET_CODE (operands[0]) == SYMBOL_REF" "TARGET_32BIT && GET_CODE (operands[0]) == SYMBOL_REF"
"* "*
return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\"; return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\";
" "
...@@ -8749,15 +8749,20 @@ ...@@ -8749,15 +8749,20 @@
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(return) (return)
(use (match_operand 3 "" ""))] (use (match_operand 3 "" ""))]
"TARGET_ARM && GET_CODE (operands[1]) == SYMBOL_REF" "TARGET_32BIT && GET_CODE (operands[1]) == SYMBOL_REF"
"* "*
return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\"; return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\";
" "
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
(define_expand "return"
[(return)]
"TARGET_32BIT && USE_RETURN_INSN (FALSE)"
"")
;; Often the return insn will be the same as loading from memory, so set attr ;; Often the return insn will be the same as loading from memory, so set attr
(define_insn "return" (define_insn "*arm_return"
[(return)] [(return)]
"TARGET_ARM && USE_RETURN_INSN (FALSE)" "TARGET_ARM && USE_RETURN_INSN (FALSE)"
"* "*
......
...@@ -1054,6 +1054,19 @@ ...@@ -1054,6 +1054,19 @@
(set_attr "length" "20")] (set_attr "length" "20")]
) )
;; Note: this is not predicable, to avoid issues with linker-generated
;; interworking stubs.
(define_insn "*thumb2_return"
[(return)]
"TARGET_THUMB2 && USE_RETURN_INSN (FALSE)"
"*
{
return output_return_instruction (const_true_rtx, TRUE, FALSE);
}"
[(set_attr "type" "load1")
(set_attr "length" "12")]
)
(define_insn_and_split "thumb2_eh_return" (define_insn_and_split "thumb2_eh_return"
[(unspec_volatile [(match_operand:SI 0 "s_register_operand" "r")] [(unspec_volatile [(match_operand:SI 0 "s_register_operand" "r")]
VUNSPEC_EH_RETURN) VUNSPEC_EH_RETURN)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment