aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2012-05-14 20:47:05 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-05-14 20:47:05 +0200
commitf62866740b93747b2d3f1dd4d4637e6890e0fa22 (patch)
treec7f37836c3bd59f4662d6c178f2ef861f2d3a79a
parent210cfe6365e5b2f696bb1e32b8bc25628b1064c1 (diff)
downloadgcc-f62866740b93747b2d3f1dd4d4637e6890e0fa22.zip
gcc-f62866740b93747b2d3f1dd4d4637e6890e0fa22.tar.gz
gcc-f62866740b93747b2d3f1dd4d4637e6890e0fa22.tar.bz2
[multiple changes]
2012-05-14 Andrew Pinski <apinski@cavium.com> H.J. Lu <hongjiu.lu@intel.com> Jakub Jelinek <jakub@redhat.com> PR target/53315 * config/i386/i386.md (xbegin_1): Use + in constraint and match_dup. (xbegin): Updated. 2012-05-14 Andi Kleen <ak@linux.intel.com> Jakub Jelinek <jakub@redhat.com> PR target/53315 * gcc.target/i386/i386.exp (check_effective_target_rtm): New. * gcc.target/i386/rtm-check.h: New file. * gcc.target/i386/pr53315.c: New test. From-SVN: r187477
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/i386.md13
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/i386.exp13
-rw-r--r--gcc/testsuite/gcc.target/i386/pr53315.c27
-rw-r--r--gcc/testsuite/gcc.target/i386/rtm-check.h32
6 files changed, 95 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bdb3a5b..da88c52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2012-05-14 Andrew Pinski <apinski@cavium.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR target/53315
+ * config/i386/i386.md (xbegin_1): Use + in constraint and
+ match_dup.
+ (xbegin): Updated.
+
2012-05-14 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (dwarf2out_define, dwarf2out_undef): Treat
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 45db0ac..01e2421 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -18436,11 +18436,13 @@
operands[1] = force_reg (SImode, constm1_rtx);
- emit_jump_insn (gen_xbegin_1 (operands[0], operands[1], label));
+ emit_jump_insn (gen_xbegin_1 (operands[1], label));
emit_label (label);
LABEL_NUSES (label) = 1;
+ emit_move_insn (operands[0], operands[1]);
+
DONE;
})
@@ -18448,13 +18450,12 @@
[(set (pc)
(if_then_else (ne (unspec [(const_int 0)] UNSPEC_XBEGIN_ABORT)
(const_int 0))
- (label_ref (match_operand 2))
+ (label_ref (match_operand 1))
(pc)))
- (set (match_operand:SI 0 "register_operand" "=a")
- (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "0")]
- UNSPECV_XBEGIN))]
+ (set (match_operand:SI 0 "register_operand" "+a")
+ (unspec_volatile:SI [(match_dup 0)] UNSPECV_XBEGIN))]
"TARGET_RTM"
- "xbegin\t%l2"
+ "xbegin\t%l1"
[(set_attr "type" "other")
(set_attr "length" "6")])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9025441..c160fae 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2012-05-14 Andi Kleen <ak@linux.intel.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR target/53315
+ * gcc.target/i386/i386.exp (check_effective_target_rtm): New.
+ * gcc.target/i386/rtm-check.h: New file.
+ * gcc.target/i386/pr53315.c: New test.
+
2012-05-14 Tobias Burnus <burnus@net-b.de>
PR fortran/49110
diff --git a/gcc/testsuite/gcc.target/i386/i386.exp b/gcc/testsuite/gcc.target/i386/i386.exp
index 75bea9b..88ff715 100644
--- a/gcc/testsuite/gcc.target/i386/i386.exp
+++ b/gcc/testsuite/gcc.target/i386/i386.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 1997, 2004, 2007, 2008, 2009, 2010
+# Copyright (C) 1997, 2004, 2007, 2008, 2009, 2010, 2011, 2012
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@@ -243,6 +243,17 @@ proc check_effective_target_bmi2 { } {
} "-mbmi2" ]
}
+# Return 1 if rtm instructions can be compiled.
+proc check_effective_target_rtm { } {
+ return [check_no_compiler_messages rtm object {
+ void
+ _rtm_xend (void)
+ {
+ return __builtin_ia32_xend ();
+ }
+ } "-mrtm" ]
+}
+
# If the linker used understands -M <mapfile>, pass it to clear hardware
# capabilities set by the Sun assembler.
set clearcap_ldflags "-Wl,-M,$srcdir/$subdir/clearcap.map"
diff --git a/gcc/testsuite/gcc.target/i386/pr53315.c b/gcc/testsuite/gcc.target/i386/pr53315.c
new file mode 100644
index 0000000..350efa7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr53315.c
@@ -0,0 +1,27 @@
+/* PR target/53315 and PR target/53291 */
+/* { dg-do run } */
+/* { dg-options "-O2 -mrtm" } */
+/* { dg-require-effective-target rtm } */
+
+#include <x86intrin.h>
+#include "rtm-check.h"
+
+static void
+rtm_test (void)
+{
+ int flag = -1;
+ unsigned status;
+
+ if ((status = _xbegin ()) == _XBEGIN_STARTED)
+ {
+ flag = _xtest ();
+ _xend ();
+ }
+ else
+ return;
+
+ if (flag != 1)
+ abort ();
+ if (_xtest () != 0)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/rtm-check.h b/gcc/testsuite/gcc.target/i386/rtm-check.h
new file mode 100644
index 0000000..593b403
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/rtm-check.h
@@ -0,0 +1,32 @@
+#include <stdlib.h>
+#include "cpuid.h"
+
+static void rtm_test (void);
+
+static void __attribute__ ((noinline)) do_test (void)
+{
+ rtm_test ();
+}
+
+int
+main ()
+{
+ unsigned int eax, ebx, ecx, edx;
+
+ if (__get_cpuid_max (0, NULL) >= 7)
+ {
+ __cpuid_count (7, 0, eax, ebx, ecx, edx);
+ if (ebx & bit_RTM)
+ {
+ do_test ();
+#ifdef DEBUG
+ printf ("PASSED\n");
+#endif
+ return 0;
+ }
+ }
+#ifdef DEBUG
+ printf ("SKIPPED\n");
+#endif
+ return 0;
+}