aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-11-22 12:12:05 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2016-11-22 12:12:05 +0000
commitc69fb8161a4fcfc302c026dec3c0c4103731cd37 (patch)
tree13fa9d80862d235db48363df5a2bac19108f8af4 /gcc
parent4ac52f1614e8d199e55b915dc23e687a76327ba8 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/vfp.md4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr78439.c56
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);
+}