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
3ea63f60
Commit
3ea63f60
authored
Jun 04, 2013
by
Ian Bolton
Committed by
Ian Bolton
Jun 04, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AArch64 - Improve MOVI handling (2/5)
From-SVN: r199653
parent
d8edd899
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
30 additions
and
54 deletions
+30
-54
gcc/ChangeLog
+12
-0
gcc/config/aarch64/aarch64-protos.h
+2
-0
gcc/config/aarch64/aarch64.c
+13
-51
gcc/config/aarch64/constraints.md
+3
-3
No files found.
gcc/ChangeLog
View file @
3ea63f60
2013-06-04 Ian Bolton <ian.bolton@arm.com>
2013-06-04 Ian Bolton <ian.bolton@arm.com>
* config/aarch64/aarch64.c (aarch64_simd_valid_immediate): No
longer static.
(aarch64_simd_immediate_valid_for_move): Remove.
(aarch64_simd_scalar_immediate_valid_for_move): Update call.
(aarch64_simd_make_constant): Update call.
(aarch64_output_simd_mov_immediate): Update call.
* config/aarch64/aarch64-protos.h (aarch64_simd_valid_immediate):
Add prototype.
* config/aarch64/constraints.md (Dn): Update call.
2013-06-04 Ian Bolton <ian.bolton@arm.com>
* config/aarch64/aarch64.c (aarch64_simd_valid_immediate): Change
* config/aarch64/aarch64.c (aarch64_simd_valid_immediate): Change
return type to bool for prototype.
return type to bool for prototype.
(aarch64_legitimate_constant_p): Check for true instead of not -1.
(aarch64_legitimate_constant_p): Check for true instead of not -1.
...
...
gcc/config/aarch64/aarch64-protos.h
View file @
3ea63f60
...
@@ -157,6 +157,8 @@ bool aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode);
...
@@ -157,6 +157,8 @@ bool aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode);
bool
aarch64_simd_imm_zero_p
(
rtx
,
enum
machine_mode
);
bool
aarch64_simd_imm_zero_p
(
rtx
,
enum
machine_mode
);
bool
aarch64_simd_scalar_immediate_valid_for_move
(
rtx
,
enum
machine_mode
);
bool
aarch64_simd_scalar_immediate_valid_for_move
(
rtx
,
enum
machine_mode
);
bool
aarch64_simd_shift_imm_p
(
rtx
,
enum
machine_mode
,
bool
);
bool
aarch64_simd_shift_imm_p
(
rtx
,
enum
machine_mode
,
bool
);
bool
aarch64_simd_valid_immediate
(
rtx
,
enum
machine_mode
,
int
,
rtx
*
,
int
*
,
unsigned
char
*
,
int
*
,
int
*
);
bool
aarch64_symbolic_address_p
(
rtx
);
bool
aarch64_symbolic_address_p
(
rtx
);
bool
aarch64_symbolic_constant_p
(
rtx
,
enum
aarch64_symbol_context
,
bool
aarch64_symbolic_constant_p
(
rtx
,
enum
aarch64_symbol_context
,
enum
aarch64_symbol_type
*
);
enum
aarch64_symbol_type
*
);
...
...
gcc/config/aarch64/aarch64.c
View file @
3ea63f60
...
@@ -103,8 +103,6 @@ static bool aarch64_vfp_is_call_or_return_candidate (enum machine_mode,
...
@@ -103,8 +103,6 @@ static bool aarch64_vfp_is_call_or_return_candidate (enum machine_mode,
static
void
aarch64_elf_asm_constructor
(
rtx
,
int
)
ATTRIBUTE_UNUSED
;
static
void
aarch64_elf_asm_constructor
(
rtx
,
int
)
ATTRIBUTE_UNUSED
;
static
void
aarch64_elf_asm_destructor
(
rtx
,
int
)
ATTRIBUTE_UNUSED
;
static
void
aarch64_elf_asm_destructor
(
rtx
,
int
)
ATTRIBUTE_UNUSED
;
static
void
aarch64_override_options_after_change
(
void
);
static
void
aarch64_override_options_after_change
(
void
);
static
bool
aarch64_simd_valid_immediate
(
rtx
,
enum
machine_mode
,
int
,
rtx
*
,
int
*
,
unsigned
char
*
,
int
*
,
int
*
);
static
bool
aarch64_vector_mode_supported_p
(
enum
machine_mode
);
static
bool
aarch64_vector_mode_supported_p
(
enum
machine_mode
);
static
unsigned
bit_count
(
unsigned
HOST_WIDE_INT
);
static
unsigned
bit_count
(
unsigned
HOST_WIDE_INT
);
static
bool
aarch64_const_vec_all_same_int_p
(
rtx
,
static
bool
aarch64_const_vec_all_same_int_p
(
rtx
,
...
@@ -6145,7 +6143,7 @@ aarch64_vect_float_const_representable_p (rtx x)
...
@@ -6145,7 +6143,7 @@ aarch64_vect_float_const_representable_p (rtx x)
}
}
/* Return true for valid and false for invalid. */
/* Return true for valid and false for invalid. */
static
bool
bool
aarch64_simd_valid_immediate
(
rtx
op
,
enum
machine_mode
mode
,
int
inverse
,
aarch64_simd_valid_immediate
(
rtx
op
,
enum
machine_mode
mode
,
int
inverse
,
rtx
*
modconst
,
int
*
elementwidth
,
rtx
*
modconst
,
int
*
elementwidth
,
unsigned
char
*
elementchar
,
unsigned
char
*
elementchar
,
...
@@ -6349,45 +6347,6 @@ aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, int inverse,
...
@@ -6349,45 +6347,6 @@ aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, int inverse,
#undef CHECK
#undef CHECK
}
}
/* Return TRUE if rtx X is legal for use as either a AdvSIMD MOVI instruction
(or, implicitly, MVNI) immediate. Write back width per element
to *ELEMENTWIDTH, and a modified constant (whatever should be output
for a MOVI instruction) in *MODCONST. */
int
aarch64_simd_immediate_valid_for_move
(
rtx
op
,
enum
machine_mode
mode
,
rtx
*
modconst
,
int
*
elementwidth
,
unsigned
char
*
elementchar
,
int
*
mvn
,
int
*
shift
)
{
rtx
tmpconst
;
int
tmpwidth
;
unsigned
char
tmpwidthc
;
int
tmpmvn
=
0
,
tmpshift
=
0
;
bool
retval
=
aarch64_simd_valid_immediate
(
op
,
mode
,
0
,
&
tmpconst
,
&
tmpwidth
,
&
tmpwidthc
,
&
tmpmvn
,
&
tmpshift
);
if
(
!
retval
)
return
0
;
if
(
modconst
)
*
modconst
=
tmpconst
;
if
(
elementwidth
)
*
elementwidth
=
tmpwidth
;
if
(
elementchar
)
*
elementchar
=
tmpwidthc
;
if
(
mvn
)
*
mvn
=
tmpmvn
;
if
(
shift
)
*
shift
=
tmpshift
;
return
1
;
}
static
bool
static
bool
aarch64_const_vec_all_same_int_p
(
rtx
x
,
aarch64_const_vec_all_same_int_p
(
rtx
x
,
HOST_WIDE_INT
minval
,
HOST_WIDE_INT
minval
,
...
@@ -6492,9 +6451,8 @@ aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode)
...
@@ -6492,9 +6451,8 @@ aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode)
gcc_assert
(
!
VECTOR_MODE_P
(
mode
));
gcc_assert
(
!
VECTOR_MODE_P
(
mode
));
vmode
=
aarch64_preferred_simd_mode
(
mode
);
vmode
=
aarch64_preferred_simd_mode
(
mode
);
rtx
op_v
=
aarch64_simd_gen_const_vector_dup
(
vmode
,
INTVAL
(
op
));
rtx
op_v
=
aarch64_simd_gen_const_vector_dup
(
vmode
,
INTVAL
(
op
));
int
retval
=
aarch64_simd_immediate_valid_for_move
(
op_v
,
vmode
,
0
,
return
aarch64_simd_valid_immediate
(
op_v
,
vmode
,
0
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
NULL
,
NULL
,
NULL
,
NULL
);
return
retval
;
}
}
/* Construct and return a PARALLEL RTX vector. */
/* Construct and return a PARALLEL RTX vector. */
...
@@ -6722,8 +6680,8 @@ aarch64_simd_make_constant (rtx vals)
...
@@ -6722,8 +6680,8 @@ aarch64_simd_make_constant (rtx vals)
gcc_unreachable
();
gcc_unreachable
();
if
(
const_vec
!=
NULL_RTX
if
(
const_vec
!=
NULL_RTX
&&
aarch64_simd_
immediate_valid_for_move
(
const_vec
,
mode
,
NULL
,
NULL
,
&&
aarch64_simd_
valid_immediate
(
const_vec
,
mode
,
0
,
NULL
,
NULL
,
NULL
,
NULL
))
NULL
,
NULL
,
NULL
,
NULL
))
/* Load using MOVI/MVNI. */
/* Load using MOVI/MVNI. */
return
const_vec
;
return
const_vec
;
else
if
((
const_dup
=
aarch64_simd_dup_constant
(
vals
))
!=
NULL_RTX
)
else
if
((
const_dup
=
aarch64_simd_dup_constant
(
vals
))
!=
NULL_RTX
)
...
@@ -7285,7 +7243,7 @@ aarch64_output_simd_mov_immediate (rtx *const_vector,
...
@@ -7285,7 +7243,7 @@ aarch64_output_simd_mov_immediate (rtx *const_vector,
enum
machine_mode
mode
,
enum
machine_mode
mode
,
unsigned
width
)
unsigned
width
)
{
{
int
is_valid
;
bool
is_valid
;
unsigned
char
widthc
;
unsigned
char
widthc
;
int
lane_width_bits
;
int
lane_width_bits
;
static
char
templ
[
40
];
static
char
templ
[
40
];
...
@@ -7293,10 +7251,14 @@ aarch64_output_simd_mov_immediate (rtx *const_vector,
...
@@ -7293,10 +7251,14 @@ aarch64_output_simd_mov_immediate (rtx *const_vector,
const
char
*
mnemonic
;
const
char
*
mnemonic
;
unsigned
int
lane_count
=
0
;
unsigned
int
lane_count
=
0
;
/* This will return true to show const_vector is legal for use as either
a AdvSIMD MOVI instruction (or, implicitly, MVNI) immediate. It
writes back various values via the int pointers and it modifies the
operand pointed to by CONST_VECTOR in-place, if required. */
is_valid
=
is_valid
=
aarch64_simd_
immediate_valid_for_move
(
*
const_vector
,
mode
,
aarch64_simd_
valid_immediate
(
*
const_vector
,
mode
,
0
,
const_vector
,
&
lane_width_bits
,
const_vector
,
&
lane_width_bits
,
&
widthc
,
&
mvn
,
&
shift
);
&
widthc
,
&
mvn
,
&
shift
);
gcc_assert
(
is_valid
);
gcc_assert
(
is_valid
);
mode
=
GET_MODE_INNER
(
mode
);
mode
=
GET_MODE_INNER
(
mode
);
...
...
gcc/config/aarch64/constraints.md
View file @
3ea63f60
...
@@ -143,9 +143,9 @@
...
@@ -143,9 +143,9 @@
"@internal
"@internal
A constraint that matches vector of immediates."
A constraint that matches vector of immediates."
(and (match_code "const_vector")
(and (match_code "const_vector")
(match_test "aarch64_simd_
immediate_valid_for_move (op, GET_MODE (op)
,
(match_test "aarch64_simd_
valid_immediate (op, GET_MODE (op), 0
,
NULL, NULL, NULL,
NULL, NULL, NULL,
NULL, NULL) != 0
")))
NULL, NULL)
")))
(define_constraint "Dh"
(define_constraint "Dh"
"@internal
"@internal
...
...
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