Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
fee9ba42
Commit
fee9ba42
authored
May 23, 2014
by
Jiong Wang
Committed by
Marcus Shawcroft
May 23, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[AARCH64] Support tail indirect function call.
From-SVN: r210861
parent
09af4b4c
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
74 additions
and
20 deletions
+74
-20
gcc/ChangeLog
+14
-0
gcc/config/aarch64/aarch64.c
+4
-11
gcc/config/aarch64/aarch64.h
+3
-0
gcc/config/aarch64/aarch64.md
+20
-9
gcc/config/aarch64/constraints.md
+7
-0
gcc/config/aarch64/predicates.md
+4
-0
gcc/testsuite/ChangeLog
+4
-0
gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
+18
-0
No files found.
gcc/ChangeLog
View file @
fee9ba42
2014-05-23 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/predicates.md (aarch64_call_insn_operand): New
predicate.
* config/aarch64/constraints.md ("Ucs", "Usf"): New constraints.
* config/aarch64/aarch64.md (*sibcall_insn, *sibcall_value_insn):
Adjust for tailcalling through registers.
* config/aarch64/aarch64.h (enum reg_class): New caller save
register class.
(REG_CLASS_NAMES): Likewise.
(REG_CLASS_CONTENTS): Likewise.
* config/aarch64/aarch64.c (aarch64_function_ok_for_sibcall):
Allow tailcalling without decls.
2014-05-23 Thomas Schwinge <thomas@codesourcery.com>
* gimplify.c (omp_notice_variable) <case OMP_CLAUSE_DEFAULT_NONE>:
...
...
gcc/config/aarch64/aarch64.c
View file @
fee9ba42
...
...
@@ -1268,18 +1268,10 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
}
static
bool
aarch64_function_ok_for_sibcall
(
tree
decl
,
tree
exp
ATTRIBUTE_UNUSED
)
aarch64_function_ok_for_sibcall
(
tree
decl
ATTRIBUTE_UNUSED
,
tree
exp
ATTRIBUTE_UNUSED
)
{
/* Indirect calls are not currently supported. */
if
(
decl
==
NULL
)
return
false
;
/* Cannot tail-call to long-calls, since these are outside of the
range of a branch instruction (we could handle this if we added
support for indirect tail-calls. */
if
(
aarch64_decl_is_long_call_p
(
decl
))
return
false
;
/* Currently, always true. */
return
true
;
}
...
...
@@ -4360,6 +4352,7 @@ aarch64_class_max_nregs (reg_class_t regclass, enum machine_mode mode)
{
switch
(
regclass
)
{
case
CALLER_SAVE_REGS
:
case
POINTER_REGS
:
case
GENERAL_REGS
:
case
ALL_REGS
:
...
...
gcc/config/aarch64/aarch64.h
View file @
fee9ba42
...
...
@@ -408,6 +408,7 @@ extern unsigned long aarch64_tune_flags;
enum
reg_class
{
NO_REGS
,
CALLER_SAVE_REGS
,
GENERAL_REGS
,
STACK_REG
,
POINTER_REGS
,
...
...
@@ -422,6 +423,7 @@ enum reg_class
#define REG_CLASS_NAMES \
{ \
"NO_REGS", \
"CALLER_SAVE_REGS", \
"GENERAL_REGS", \
"STACK_REG", \
"POINTER_REGS", \
...
...
@@ -433,6 +435,7 @@ enum reg_class
#define REG_CLASS_CONTENTS \
{ \
{ 0x00000000, 0x00000000, 0x00000000 },
/* NO_REGS */
\
{ 0x0007ffff, 0x00000000, 0x00000000 },
/* CALLER_SAVE_REGS */
\
{ 0x7fffffff, 0x00000000, 0x00000003 },
/* GENERAL_REGS */
\
{ 0x80000000, 0x00000000, 0x00000000 },
/* STACK_REG */
\
{ 0xffffffff, 0x00000000, 0x00000003 },
/* POINTER_REGS */
\
...
...
gcc/config/aarch64/aarch64.md
View file @
fee9ba42
...
...
@@ -523,6 +523,10 @@
(use (match_operand 2 "" ""))])]
""
{
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;
}
...
...
@@ -536,31 +540,38 @@
(use (match_operand 3 "" ""))])]
""
{
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;
}
)
(define_insn "
*
sibcall_insn"
[
(call (mem:DI (match_operand:DI 0 "
" "X
"))
[
(call (mem:DI (match_operand:DI 0 "
aarch64_call_insn_operand" "Ucs, Usf
"))
(match_operand 1 "" ""))
(return)
(use (match_operand 2 "" ""))]
"GET_CODE (operands
[
0
]
) == SYMBOL_REF"
"b
\\
t%a0"
[
(set_attr "type" "branch")
]
"SIBLING_CALL_P (insn)"
"@
br
\\
t%0
b
\\
t%a0"
[
(set_attr "type" "branch, branch")
]
)
(define_insn "
*
sibcall_value_insn"
[
(set (match_operand 0 "" "")
(call (mem:DI (match_operand 1 "
" "X
"))
(call (mem:DI (match_operand 1 "
aarch64_call_insn_operand" "Ucs, Usf
"))
(match_operand 2 "" "")))
(return)
(use (match_operand 3 "" ""))]
"GET_CODE (operands
[
1
]
) == SYMBOL_REF"
"b
\\
t%a1"
[
(set_attr "type" "branch")
]
"SIBLING_CALL_P (insn)"
"@
br
\\
t%1
b
\\
t%a1"
[
(set_attr "type" "branch, branch")
]
)
;; Call subroutine returning any type.
...
...
gcc/config/aarch64/constraints.md
View file @
fee9ba42
...
...
@@ -21,6 +21,9 @@
(define_register_constraint "k" "STACK_REG"
"@internal The stack register.")
(define_register_constraint "Ucs" "CALLER_SAVE_REGS"
"@internal The caller save registers.")
(define_register_constraint "w" "FP_REGS"
"Floating point and SIMD vector registers.")
...
...
@@ -92,6 +95,10 @@
(and (match_code "const_int")
(match_test "(unsigned HOST_WIDE_INT) ival < 64")))
(define_constraint "Usf"
"@internal Usf is a symbol reference."
(match_code "symbol_ref"))
(define_constraint "UsM"
"@internal
A constraint that matches the immediate constant -1."
...
...
gcc/config/aarch64/predicates.md
View file @
fee9ba42
...
...
@@ -26,6 +26,10 @@
&& GET_MODE_CLASS (GET_MODE (op)) == MODE_CC"))))
)
(define_predicate "aarch64_call_insn_operand"
(ior (match_code "symbol_ref")
(match_operand 0 "register_operand")))
(define_predicate "aarch64_simd_register"
(and (match_code "reg")
(ior (match_test "REGNO_REG_CLASS (REGNO (op)) == FP_LO_REGS")
...
...
gcc/testsuite/ChangeLog
View file @
fee9ba42
2014-05-23 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/tail_indirect_call_1.c: New.
2014-05-23 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp1y/lambda-init9.C: New.
...
...
gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
0 → 100644
View file @
fee9ba42
/* { dg-do compile } */
/* { dg-options "-O2" } */
typedef
void
FP
(
int
);
/* { dg-final { scan-assembler "br" } } */
/* { dg-final { scan-assembler-not "blr" } } */
void
f1
(
FP
fp
,
int
n
)
{
(
fp
)
(
n
);
}
void
f2
(
int
n
,
FP
fp
)
{
(
fp
)
(
n
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment