Commit 78607708 by Tom de Vries Committed by Tom de Vries

-fuse-caller-save - Enable for AArch64

2014-05-30  Tom de Vries  <tom@codesourcery.com>

	* config/aarch64/aarch64-protos.h (aarch64_emit_call_insn): Declare.
	* config/aarch64/aarch64.c
	(TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS): Redefine as true.
	(aarch64_emit_call_insn): New function.
	(aarch64_load_symref_appropriately): Use aarch64_emit_call_insn instead
	of emit_call_insn.
	* config/aarch64/aarch64.md (define_expand "call_internal")
	(define_expand "call_value_internal", define_expand "sibcall_internal")
	(define_expand "sibcall_value_internal"): New.
	(define_expand "call", define_expand "call_value")
	(define_expand "sibcall", define_expand "sibcall_value"): Use internal
	expand variant and aarch64_emit_call_insn.

	* gcc.target/aarch64/fuse-caller-save.c: New test.

From-SVN: r211799
parent 7a32d6c4
2014-06-18 Tom de Vries <tom@codesourcery.com>
* config/aarch64/aarch64-protos.h (aarch64_emit_call_insn): Declare.
* config/aarch64/aarch64.c
(TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS): Redefine as true.
(aarch64_emit_call_insn): New function.
(aarch64_load_symref_appropriately): Use aarch64_emit_call_insn instead
of emit_call_insn.
* config/aarch64/aarch64.md (define_expand "call_internal")
(define_expand "call_value_internal", define_expand "sibcall_internal")
(define_expand "sibcall_value_internal"): New.
(define_expand "call", define_expand "call_value")
(define_expand "sibcall", define_expand "sibcall_value"): Use internal
expand variant and aarch64_emit_call_insn.
2014-06-18 Radovan Obradovic <robradovic@mips.com> 2014-06-18 Radovan Obradovic <robradovic@mips.com>
Tom de Vries <tom@codesourcery.com> Tom de Vries <tom@codesourcery.com>
......
...@@ -245,6 +245,7 @@ void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx, ...@@ -245,6 +245,7 @@ void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
void aarch64_init_expanders (void); void aarch64_init_expanders (void);
void aarch64_print_operand (FILE *, rtx, char); void aarch64_print_operand (FILE *, rtx, char);
void aarch64_print_operand_address (FILE *, rtx); void aarch64_print_operand_address (FILE *, rtx);
bool aarch64_emit_call_insn (rtx);
/* Initialize builtins for SIMD intrinsics. */ /* Initialize builtins for SIMD intrinsics. */
void init_aarch64_simd_builtins (void); void init_aarch64_simd_builtins (void);
......
...@@ -696,7 +696,7 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm, ...@@ -696,7 +696,7 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
rtx result = gen_rtx_REG (Pmode, R0_REGNUM); rtx result = gen_rtx_REG (Pmode, R0_REGNUM);
start_sequence (); start_sequence ();
emit_call_insn (gen_tlsgd_small (result, imm)); aarch64_emit_call_insn (gen_tlsgd_small (result, imm));
insns = get_insns (); insns = get_insns ();
end_sequence (); end_sequence ();
...@@ -3393,6 +3393,18 @@ aarch64_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2) ...@@ -3393,6 +3393,18 @@ aarch64_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
return true; return true;
} }
/* Emit call insn with PAT and do aarch64-specific handling. */
bool
aarch64_emit_call_insn (rtx pat)
{
rtx insn = emit_call_insn (pat);
rtx *fusage = &CALL_INSN_FUNCTION_USAGE (insn);
clobber_reg (fusage, gen_rtx_REG (word_mode, IP0_REGNUM));
clobber_reg (fusage, gen_rtx_REG (word_mode, IP1_REGNUM));
}
enum machine_mode enum machine_mode
aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y) aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y)
{ {
...@@ -9813,6 +9825,9 @@ aarch64_expand_movmem (rtx *operands) ...@@ -9813,6 +9825,9 @@ aarch64_expand_movmem (rtx *operands)
#undef TARGET_FLAGS_REGNUM #undef TARGET_FLAGS_REGNUM
#define TARGET_FLAGS_REGNUM CC_REGNUM #define TARGET_FLAGS_REGNUM CC_REGNUM
#undef TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
#define TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS true
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-aarch64.h" #include "gt-aarch64.h"
...@@ -428,6 +428,12 @@ ...@@ -428,6 +428,12 @@
;; Subroutine calls and sibcalls ;; Subroutine calls and sibcalls
;; ------------------------------------------------------------------- ;; -------------------------------------------------------------------
(define_expand "call_internal"
[(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" ""))
(use (match_operand 2 "" ""))
(clobber (reg:DI LR_REGNUM))])])
(define_expand "call" (define_expand "call"
[(parallel [(call (match_operand 0 "memory_operand" "") [(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" "")) (match_operand 1 "general_operand" ""))
...@@ -436,7 +442,7 @@ ...@@ -436,7 +442,7 @@
"" ""
" "
{ {
rtx callee; rtx callee, pat;
/* In an untyped call, we can get NULL for operand 2. */ /* In an untyped call, we can get NULL for operand 2. */
if (operands[2] == NULL) if (operands[2] == NULL)
...@@ -450,6 +456,10 @@ ...@@ -450,6 +456,10 @@
? aarch64_is_long_call_p (callee) ? aarch64_is_long_call_p (callee)
: !REG_P (callee)) : !REG_P (callee))
XEXP (operands[0], 0) = force_reg (Pmode, callee); XEXP (operands[0], 0) = force_reg (Pmode, callee);
pat = gen_call_internal (operands[0], operands[1], operands[2]);
aarch64_emit_call_insn (pat);
DONE;
}" }"
) )
...@@ -474,6 +484,13 @@ ...@@ -474,6 +484,13 @@
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
(define_expand "call_value_internal"
[(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "")
(match_operand 2 "general_operand" "")))
(use (match_operand 3 "" ""))
(clobber (reg:DI LR_REGNUM))])])
(define_expand "call_value" (define_expand "call_value"
[(parallel [(set (match_operand 0 "" "") [(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "") (call (match_operand 1 "memory_operand" "")
...@@ -483,7 +500,7 @@ ...@@ -483,7 +500,7 @@
"" ""
" "
{ {
rtx callee; rtx callee, pat;
/* In an untyped call, we can get NULL for operand 3. */ /* In an untyped call, we can get NULL for operand 3. */
if (operands[3] == NULL) if (operands[3] == NULL)
...@@ -497,6 +514,11 @@ ...@@ -497,6 +514,11 @@
? aarch64_is_long_call_p (callee) ? aarch64_is_long_call_p (callee)
: !REG_P (callee)) : !REG_P (callee))
XEXP (operands[1], 0) = force_reg (Pmode, callee); XEXP (operands[1], 0) = force_reg (Pmode, callee);
pat = gen_call_value_internal (operands[0], operands[1], operands[2],
operands[3]);
aarch64_emit_call_insn (pat);
DONE;
}" }"
) )
...@@ -524,6 +546,12 @@ ...@@ -524,6 +546,12 @@
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
(define_expand "sibcall_internal"
[(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" ""))
(return)
(use (match_operand 2 "" ""))])])
(define_expand "sibcall" (define_expand "sibcall"
[(parallel [(call (match_operand 0 "memory_operand" "") [(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" "")) (match_operand 1 "general_operand" ""))
...@@ -531,15 +559,28 @@ ...@@ -531,15 +559,28 @@
(use (match_operand 2 "" ""))])] (use (match_operand 2 "" ""))])]
"" ""
{ {
rtx pat;
if (!REG_P (XEXP (operands[0], 0)) if (!REG_P (XEXP (operands[0], 0))
&& (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF)) && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF))
XEXP (operands[0], 0) = force_reg (Pmode, XEXP (operands[0], 0)); XEXP (operands[0], 0) = force_reg (Pmode, XEXP (operands[0], 0));
if (operands[2] == NULL_RTX) if (operands[2] == NULL_RTX)
operands[2] = const0_rtx; operands[2] = const0_rtx;
pat = gen_sibcall_internal (operands[0], operands[1], operands[2]);
aarch64_emit_call_insn (pat);
DONE;
} }
) )
(define_expand "sibcall_value_internal"
[(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "")
(match_operand 2 "general_operand" "")))
(return)
(use (match_operand 3 "" ""))])])
(define_expand "sibcall_value" (define_expand "sibcall_value"
[(parallel [(set (match_operand 0 "" "") [(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "") (call (match_operand 1 "memory_operand" "")
...@@ -548,12 +589,19 @@ ...@@ -548,12 +589,19 @@
(use (match_operand 3 "" ""))])] (use (match_operand 3 "" ""))])]
"" ""
{ {
rtx pat;
if (!REG_P (XEXP (operands[1], 0)) if (!REG_P (XEXP (operands[1], 0))
&& (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF)) && (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF))
XEXP (operands[1], 0) = force_reg (Pmode, XEXP (operands[1], 0)); XEXP (operands[1], 0) = force_reg (Pmode, XEXP (operands[1], 0));
if (operands[3] == NULL_RTX) if (operands[3] == NULL_RTX)
operands[3] = const0_rtx; operands[3] = const0_rtx;
pat = gen_sibcall_value_internal (operands[0], operands[1], operands[2],
operands[3]);
aarch64_emit_call_insn (pat);
DONE;
} }
) )
......
2014-06-18 Tom de Vries <tom@codesourcery.com>
* gcc.target/aarch64/fuse-caller-save.c: New test.
2014-06-18 Radovan Obradovic <robradovic@mips.com> 2014-06-18 Radovan Obradovic <robradovic@mips.com>
Tom de Vries <tom@codesourcery.com> Tom de Vries <tom@codesourcery.com>
......
/* { dg-do compile } */
/* { dg-options "-O2 -fuse-caller-save" } */
/* Testing -fuse-caller-save optimization option. */
static int __attribute__((noinline))
bar (int x)
{
return x + 3;
}
int __attribute__((noinline))
foo (int y)
{
return y + bar (y);
}
int
main (void)
{
return !(foo (5) == 13);
}
/* { dg-final { scan-assembler-times "\\\[sp, -16\\\]!" 2 } } */
/* { dg-final { scan-assembler-not "\\\[sp, -32\\\]!" } } */
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