aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2014-06-18 16:09:01 +0000
committerTom de Vries <vries@gcc.gnu.org>2014-06-18 16:09:01 +0000
commit786077082ee3d554cc3dc22212b77c67e378d3aa (patch)
tree3dcf0e21a4221c98aaae9f13c2ce0d22715cc5dc /gcc
parent7a32d6c491b450dfe86263ef28a9947cd57d09b6 (diff)
downloadgcc-786077082ee3d554cc3dc22212b77c67e378d3aa.zip
gcc-786077082ee3d554cc3dc22212b77c67e378d3aa.tar.gz
gcc-786077082ee3d554cc3dc22212b77c67e378d3aa.tar.bz2
-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/config/aarch64/aarch64-protos.h1
-rw-r--r--gcc/config/aarch64/aarch64.c17
-rw-r--r--gcc/config/aarch64/aarch64.md52
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/fuse-caller-save.c24
6 files changed, 110 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b0c9ed8..564c503 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+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>
Tom de Vries <tom@codesourcery.com>
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index c4f75b3..213c8dc 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -245,6 +245,7 @@ void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
void aarch64_init_expanders (void);
void aarch64_print_operand (FILE *, rtx, char);
void aarch64_print_operand_address (FILE *, rtx);
+bool aarch64_emit_call_insn (rtx);
/* Initialize builtins for SIMD intrinsics. */
void init_aarch64_simd_builtins (void);
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index e0c25e7..b2d005b 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -696,7 +696,7 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
rtx result = gen_rtx_REG (Pmode, R0_REGNUM);
start_sequence ();
- emit_call_insn (gen_tlsgd_small (result, imm));
+ aarch64_emit_call_insn (gen_tlsgd_small (result, imm));
insns = get_insns ();
end_sequence ();
@@ -3393,6 +3393,18 @@ aarch64_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
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
aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y)
{
@@ -9813,6 +9825,9 @@ aarch64_expand_movmem (rtx *operands)
#undef TARGET_FLAGS_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;
#include "gt-aarch64.h"
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 1ee2cae..7f8bb82 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -428,6 +428,12 @@
;; 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"
[(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" ""))
@@ -436,7 +442,7 @@
""
"
{
- rtx callee;
+ rtx callee, pat;
/* In an untyped call, we can get NULL for operand 2. */
if (operands[2] == NULL)
@@ -450,6 +456,10 @@
? aarch64_is_long_call_p (callee)
: !REG_P (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 @@
[(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"
[(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "")
@@ -483,7 +500,7 @@
""
"
{
- rtx callee;
+ rtx callee, pat;
/* In an untyped call, we can get NULL for operand 3. */
if (operands[3] == NULL)
@@ -497,6 +514,11 @@
? aarch64_is_long_call_p (callee)
: !REG_P (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 @@
[(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"
[(parallel [(call (match_operand 0 "memory_operand" "")
(match_operand 1 "general_operand" ""))
@@ -531,15 +559,28 @@
(use (match_operand 2 "" ""))])]
""
{
+ rtx pat;
+
if (!REG_P (XEXP (operands[0], 0))
&& (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF))
XEXP (operands[0], 0) = force_reg (Pmode, XEXP (operands[0], 0));
if (operands[2] == NULL_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"
[(parallel [(set (match_operand 0 "" "")
(call (match_operand 1 "memory_operand" "")
@@ -548,12 +589,19 @@
(use (match_operand 3 "" ""))])]
""
{
+ rtx pat;
+
if (!REG_P (XEXP (operands[1], 0))
&& (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF))
XEXP (operands[1], 0) = force_reg (Pmode, XEXP (operands[1], 0));
if (operands[3] == NULL_RTX)
operands[3] = const0_rtx;
+
+ pat = gen_sibcall_value_internal (operands[0], operands[1], operands[2],
+ operands[3]);
+ aarch64_emit_call_insn (pat);
+ DONE;
}
)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f41f3df..6f77a38 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+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>
Tom de Vries <tom@codesourcery.com>
diff --git a/gcc/testsuite/gcc.target/aarch64/fuse-caller-save.c b/gcc/testsuite/gcc.target/aarch64/fuse-caller-save.c
new file mode 100644
index 0000000..45e535c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/fuse-caller-save.c
@@ -0,0 +1,24 @@
+/* { 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\\\]!" } } */