2017-09-04 Uros Bizjak <ubiz...@gmail.com> * gcc.target/i386/mpx/mpx-os-support.h: New file. * gcc.target/i386/mpx/mpx-check.h: Include mpx-os-support.h.
Tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN. Uros.
Index: gcc.target/i386/mpx/mpx-check.h =================================================================== --- gcc.target/i386/mpx/mpx-check.h (revision 251661) +++ gcc.target/i386/mpx/mpx-check.h (working copy) @@ -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,16 +16,6 @@ #define DEBUG -#define XSTATE_BNDREGS (1 << 3) - -/* This should be an intrinsic, but isn't. */ -static int xgetbv (unsigned x) -{ - unsigned eax, edx; - asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (x)); - return eax; -} - static int check_osxsave (void) { @@ -44,7 +34,7 @@ return NORUNRES; /* Run MPX test only if host has MPX support. */ - if (check_osxsave () && (ebx & bit_MPX) && (xgetbv (0) & XSTATE_BNDREGS)) + if (check_osxsave () && (ebx & bit_MPX) && mpx_os_support ()) mpx_test (argc, argv); else { Index: gcc.target/i386/mpx/mpx-os-support.h =================================================================== --- gcc.target/i386/mpx/mpx-os-support.h (nonexistent) +++ gcc.target/i386/mpx/mpx-os-support.h (working copy) @@ -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; +}