]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mpx-os-support.h: New file.
authorUros Bizjak <ubizjak@gmail.com>
Mon, 4 Sep 2017 18:48:36 +0000 (20:48 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 4 Sep 2017 18:48:36 +0000 (20:48 +0200)
* gcc.target/i386/mpx/mpx-os-support.h: New file.
* gcc.target/i386/mpx/mpx-check.h: Include mpx-os-support.h.
(check_osxsave): New function.
(main): Use __get_cpuid_count and return NORUNRES on failure.
Use check_osxsave.
* gcc.target/i386/mpx/va-arg-pack-1-lbv.c (foo1): Use
__builtin_va_arg_pack instead of __va_arg_pack.
* gcc.target/i386/mpx/va-arg-pack-1-nov.c (foo1): Ditto.
* gcc.target/i386/mpx/va-arg-pack-1-ubv.c (foo1): Ditto.
* gcc.target/i386/mpx/va-arg-pack-2-lbv.c (foo1): Ditto.
* gcc.target/i386/mpx/va-arg-pack-2-nov.c (foo1): Ditto.
* gcc.target/i386/mpx/va-arg-pack-2-ubv.c (foo1): Ditto.

From-SVN: r251685

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/mpx/mpx-check.h
gcc/testsuite/gcc.target/i386/mpx/mpx-os-support.h [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-1-lbv.c
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-1-nov.c
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-1-ubv.c
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-2-lbv.c
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-2-nov.c
gcc/testsuite/gcc.target/i386/mpx/va-arg-pack-2-ubv.c

index 1fd35cad5a08f5e88c627e1c90b5151bcd021b4c..967da8ce347141672600ca893f26225d2bc5ed43 100644 (file)
@@ -1,3 +1,18 @@
+2017-09-04  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/mpx/mpx-os-support.h: New file.
+       * gcc.target/i386/mpx/mpx-check.h: Include mpx-os-support.h.
+       (check_osxsave): New function.
+       (main): Use __get_cpuid_count and return NORUNRES on failure.
+       Use check_osxsave.
+       * gcc.target/i386/mpx/va-arg-pack-1-lbv.c (foo1): Use
+       __builtin_va_arg_pack instead of __va_arg_pack.
+       * gcc.target/i386/mpx/va-arg-pack-1-nov.c (foo1): Ditto.
+       * gcc.target/i386/mpx/va-arg-pack-1-ubv.c (foo1): Ditto.
+       * gcc.target/i386/mpx/va-arg-pack-2-lbv.c (foo1): Ditto.
+       * gcc.target/i386/mpx/va-arg-pack-2-nov.c (foo1): Ditto.
+       * gcc.target/i386/mpx/va-arg-pack-2-ubv.c (foo1): Ditto.
+
 2017-09-02  Janus Weil  <janus@gcc.gnu.org>
 
        Backport from trunk
index 3afa46093d1e538cfee03a5e1206070a74b662de..e622934fe32a55f4d22cbd24f2ae5c43d24753d3 100644 (file)
@@ -1,8 +1,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
-
 #include "cpuid.h"
+#include "mpx-os-support.h"
 
 static int
 __attribute__ ((noinline))
@@ -16,18 +16,25 @@ mpx_test (int, const char **);
 
 #define DEBUG
 
+static int
+check_osxsave (void)
+{
+  unsigned int eax, ebx, ecx, edx;
+
+  __cpuid (1, eax, ebx, ecx, edx);
+  return (ecx & bit_OSXSAVE) != 0;
+}
+
 int
 main (int argc, const char **argv)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (__get_cpuid_max (0, NULL) < 7)
-    return 0;
-
-  __cpuid_count (7, 0, eax, ebx, ecx, edx);
+  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
+    return NORUNRES;
 
   /* Run MPX test only if host has MPX support.  */
-  if (ebx & bit_MPX)
+  if (check_osxsave () && (ebx & bit_MPX) && mpx_os_support ())
     mpx_test (argc, argv);
   else
     {
diff --git a/gcc/testsuite/gcc.target/i386/mpx/mpx-os-support.h b/gcc/testsuite/gcc.target/i386/mpx/mpx-os-support.h
new file mode 100644 (file)
index 0000000..8c9294d
--- /dev/null
@@ -0,0 +1,16 @@
+/* Check if the OS supports executing MPX instructions.  */
+
+#define XCR_XFEATURE_ENABLED_MASK      0x0
+
+#define XSTATE_BNDREGS 0x8
+
+static int
+mpx_os_support (void)
+{
+  unsigned int eax, edx;
+  unsigned int ecx = XCR_XFEATURE_ENABLED_MASK;
+
+  __asm__ ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (ecx));
+
+  return (eax & XSTATE_BNDREGS) != 0;
+}
index 5aa60072df339445be2d16495a95b730d326f60b..bbbb256ae30910010e55a560415b301ced9985b0 100644 (file)
@@ -28,7 +28,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];
index 55c65d92bd969084643c0176d9bec4e87dbc00a8..4beda02b9515746b612ef81d8ed163450d23a07f 100644 (file)
@@ -25,7 +25,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];
index 11b498eba479f55f0a9bd536a1c2026314a4d945..4b76384275568d00e986a6354c25faddf0e76012 100644 (file)
@@ -28,7 +28,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];
index 9f1941d69f14b8f83a4a2c3bee5f06bd89205644..dab1dc86792a394b445b4f04105aac0fb24c59df 100644 (file)
@@ -30,7 +30,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];
index 903afbce29290fca0c9051f9f10464876a756f29..6bf4721f75adfcbfc926832e83cf1d765d4d40b8 100644 (file)
@@ -27,7 +27,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];
index f5d842abf0d43ab46593ac8c441da18036c50fdf..4af59758fb01eaf654c8dd823e141c36790791a8 100644 (file)
@@ -30,7 +30,7 @@ foo2 (int i1, int *p1, ...)
 static __attribute__((always_inline)) int
 foo1 (int *p1, ...)
 {
-  return foo2 (10, p1, __va_arg_pack ());
+  return foo2 (10, p1, __builtin_va_arg_pack ());
 }
 
 int prebuf[100];