On Fri, Jul 3, 2015 at 5:53 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> x86intrin.h has useful intrinsics for instructions for IA MCU.  This
> patch adds __iamcu__ check to x86intrin.h and ia32intrin.h.
>
> OK for trunk?
>
> H.J.
> ---
> gcc/
>
>         PR target/66746
>         * config/i386/ia32intrin.h (__crc32b): Don't define if __iamcu__
>         is defined.
>         (__crc32w): Likewise.
>         (__crc32d): Likewise.
>         (__rdpmc): Likewise.
>         (__rdtscp): Likewise.
>         (_rdpmc): Likewise.
>         (_rdtscp): Likewise.
>         * config/i386/x86intrin.h: Only include ia32intrin.h if __iamcu__
>         is defined.
>
> gcc/testsuite/
>
>         PR target/66746
>         * gcc.target/i386/pr66746.c: New file.

OK.

Thanks,
Uros.

>  gcc/config/i386/ia32intrin.h            | 16 +++++++++++++++-
>  gcc/config/i386/x86intrin.h             |  5 +++++
>  gcc/testsuite/gcc.target/i386/pr66746.c | 10 ++++++++++
>  3 files changed, 30 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr66746.c
>
> diff --git a/gcc/config/i386/ia32intrin.h b/gcc/config/i386/ia32intrin.h
> index 1f728c8..b8d1c31 100644
> --- a/gcc/config/i386/ia32intrin.h
> +++ b/gcc/config/i386/ia32intrin.h
> @@ -49,6 +49,8 @@ __bswapd (int __X)
>    return __builtin_bswap32 (__X);
>  }
>
> +#ifndef __iamcu__
> +
>  #ifndef __SSE4_2__
>  #pragma GCC push_options
>  #pragma GCC target("sse4.2")
> @@ -82,6 +84,8 @@ __crc32d (unsigned int __C, unsigned int __V)
>  #pragma GCC pop_options
>  #endif /* __DISABLE_SSE4_2__ */
>
> +#endif /* __iamcu__ */
> +
>  /* 32bit popcnt */
>  extern __inline int
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> @@ -90,6 +94,8 @@ __popcntd (unsigned int __X)
>    return __builtin_popcount (__X);
>  }
>
> +#ifndef __iamcu__
> +
>  /* rdpmc */
>  extern __inline unsigned long long
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> @@ -98,6 +104,8 @@ __rdpmc (int __S)
>    return __builtin_ia32_rdpmc (__S);
>  }
>
> +#endif /* __iamcu__ */
> +
>  /* rdtsc */
>  extern __inline unsigned long long
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> @@ -106,6 +114,8 @@ __rdtsc (void)
>    return __builtin_ia32_rdtsc ();
>  }
>
> +#ifndef __iamcu__
> +
>  /* rdtscp */
>  extern __inline unsigned long long
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> @@ -114,6 +124,8 @@ __rdtscp (unsigned int *__A)
>    return __builtin_ia32_rdtscp (__A);
>  }
>
> +#endif /* __iamcu__ */
> +
>  /* 8bit rol */
>  extern __inline unsigned char
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> @@ -290,9 +302,11 @@ __writeeflags (unsigned int X)
>  #define _bit_scan_reverse(a)   __bsrd(a)
>  #define _bswap(a)              __bswapd(a)
>  #define _popcnt32(a)           __popcntd(a)
> +#ifndef __iamcu__
>  #define _rdpmc(a)              __rdpmc(a)
> -#define _rdtsc()               __rdtsc()
>  #define _rdtscp(a)             __rdtscp(a)
> +#endif /* __iamcu__ */
> +#define _rdtsc()               __rdtsc()
>  #define _rotwl(a,b)            __rolw((a), (b))
>  #define _rotwr(a,b)            __rorw((a), (b))
>  #define _rotl(a,b)             __rold((a), (b))
> diff --git a/gcc/config/i386/x86intrin.h b/gcc/config/i386/x86intrin.h
> index 6f7b1f6..be0a1a1 100644
> --- a/gcc/config/i386/x86intrin.h
> +++ b/gcc/config/i386/x86intrin.h
> @@ -26,6 +26,8 @@
>
>  #include <ia32intrin.h>
>
> +#ifndef __iamcu__
> +
>  #include <mmintrin.h>
>
>  #include <xmmintrin.h>
> @@ -86,4 +88,7 @@
>  #include <xsavecintrin.h>
>
>  #include <mwaitxintrin.h>
> +
> +#endif /* __iamcu__ */
> +
>  #endif /* _X86INTRIN_H_INCLUDED */
> diff --git a/gcc/testsuite/gcc.target/i386/pr66746.c 
> b/gcc/testsuite/gcc.target/i386/pr66746.c
> new file mode 100644
> index 0000000..3ef77bf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr66746.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile { target ia32 } } */
> +/* { dg-options "-O2 -miamcu" } */
> +
> +/* Defining away "extern" and "__inline" results in all of them being
> +   compiled as proper functions.  */
> +
> +#define extern
> +#define __inline
> +
> +#include <x86intrin.h>
> --
> 2.4.3
>

Reply via email to