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 >