diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2016-11-22 12:12:05 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2016-11-22 12:12:05 +0000 |
commit | c69fb8161a4fcfc302c026dec3c0c4103731cd37 (patch) | |
tree | 13fa9d80862d235db48363df5a2bac19108f8af4 | |
parent | 4ac52f1614e8d199e55b915dc23e687a76327ba8 (diff) | |
download | gcc-c69fb8161a4fcfc302c026dec3c0c4103731cd37.zip gcc-c69fb8161a4fcfc302c026dec3c0c4103731cd37.tar.gz gcc-c69fb8161a4fcfc302c026dec3c0c4103731cd37.tar.bz2 |
[ARM] PR target/78439: Update movdi constraints for Cortex-A8 tuning to handle LDRD/STRD
PR target/78439
* config/arm/vfp.md (*movdi_vfp_cortexa8): Use 'q' constraints for the
register operand in alternatives 4,5,6.
* gcc.c-torture/compile/pr78439.c: New test.
From-SVN: r242695
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/vfp.md | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr78439.c | 56 |
4 files changed, 69 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5e1e54..3dc1af0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-22 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR target/78439 + * config/arm/vfp.md (*movdi_vfp_cortexa8): Use 'q' constraints for the + register operand in alternatives 4,5,6. + 2016-11-22 Thomas Preud'homme <thomas.preudhomme@arm.com> PR target/77904 diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index 2051f10..ce56e16 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -355,8 +355,8 @@ ) (define_insn "*movdi_vfp_cortexa8" - [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,r,r,m,w,!r,w,w, Uv") - (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,r,r,w,w,Uvi,w"))] + [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,!r,w,w, Uv") + (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))] "TARGET_32BIT && TARGET_HARD_FLOAT && arm_tune == TARGET_CPU_cortexa8 && ( register_operand (operands[0], DImode) || register_operand (operands[1], DImode)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index edcc79e..a9ef58c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-22 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR target/78439 + * gcc.c-torture/compile/pr78439.c: New test. + 2016-11-22 Thomas Preud'homme <thomas.preudhomme@arm.com> PR target/77904 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr78439.c b/gcc/testsuite/gcc.c-torture/compile/pr78439.c new file mode 100644 index 0000000..a8af86b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr78439.c @@ -0,0 +1,56 @@ +/* PR target/78439. */ + +enum demangle_component_type +{ + DEMANGLE_COMPONENT_THROW_SPEC +}; +struct demangle_component +{ + enum demangle_component_type type; + struct + { + struct + { + struct demangle_component *left; + struct demangle_component *right; + }; + }; +}; + +int a, b; + +struct d_info +{ + struct demangle_component *comps; + int next_comp; + int num_comps; + struct demangle_component *subs; + int num_subs; + int is_conversion; +}; + +void +fn1 (int p1, struct d_info *p2) +{ + p2->num_comps = 2 * p1; + p2->next_comp = p2->num_subs = p1; + p2->is_conversion = 0; +} + +int fn3 (int *); +void fn4 (struct d_info *, int); + +void +fn2 () +{ + int c; + struct d_info d; + b = 0; + c = fn3 (&a); + fn1 (c, &d); + struct demangle_component e[d.num_comps]; + struct demangle_component *f[d.num_subs]; + d.comps = e; + d.subs = (struct demangle_component *) f; + fn4 (&d, 1); +} |