Thanks! Sorry, missed that! K
On Thu, Apr 17, 2014 at 2:13 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Wed, Jul 03, 2013 at 08:14:25AM +0200, Uros Bizjak wrote: >> On Tue, Jul 2, 2013 at 10:32 AM, Kirill Yukhin <kirill.yuk...@gmail.com> >> wrote: >> > Bootstrap passing. Updated tests passing on BMI-featured HW. >> > >> > ChangeLog: >> > 2013-07-02 Kirill Yukhin <kirill.yuk...@intel.com> >> > >> > * config/i386/bmiintrin.h (_blsi_u32): New. >> > (_blsi_u64): Ditto. >> > (_blsr_u32): Ditto. >> > (_blsr_u64): Ditto. >> > (_blsmsk_u32): Ditto. >> > (_blsmsk_u64): Ditto. >> > (_tzcnt_u32): Ditto. >> > (_tzcnt_u64): Ditto. >> > >> > testsuite/ChangeLog: >> > 2013-07-02 Kirill Yukhin <kirill.yuk...@intel.com> >> > >> > * gcc.target/i386/bmi-1.c: Extend with new instrinsics. >> > Fix scan patterns. >> > * gcc.target/i386/bmi-2.c: Ditto. >> > >> > [1] http://gcc.gnu.org/ml/gcc-patches/2013-06/msg01286.html >> >> This is OK for mainline. >> >> BTW: Do we want to backport this patch (and your previous) to 4.8 branch? > > Kyrill, you've committed this only to the 4.8 branch and not to the trunk, > which means we actually regress on this on in 4.9 compared to 4.8.2. > > As the patch has been approved, I went ahead and after testing it > on x86_64 (-m32/-m64) committed it to the trunk and 4.9. > > 2014-04-17 Jakub Jelinek <ja...@redhat.com> > > PR target/60847 > Forward port from 4.8 branch > 2013-07-19 Kirill Yukhin <kirill.yuk...@intel.com> > > * config/i386/bmiintrin.h (_blsi_u32): New. > (_blsi_u64): Ditto. > (_blsr_u32): Ditto. > (_blsr_u64): Ditto. > (_blsmsk_u32): Ditto. > (_blsmsk_u64): Ditto. > (_tzcnt_u32): Ditto. > (_tzcnt_u64): Ditto. > > * gcc.target/i386/bmi-1.c: Extend with new instrinsics. > Fix scan patterns. > * gcc.target/i386/bmi-2.c: Ditto. > > --- gcc/config/i386/bmiintrin.h (revision 201046) > +++ gcc/config/i386/bmiintrin.h (revision 201047) > @@ -40,7 +40,6 @@ __tzcnt_u16 (unsigned short __X) > return __builtin_ctzs (__X); > } > > - > extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __andn_u32 (unsigned int __X, unsigned int __Y) > { > @@ -66,17 +65,34 @@ __blsi_u32 (unsigned int __X) > } > > extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsi_u32 (unsigned int __X) > +{ > + return __blsi_u32 (__X); > +} > + > +extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __blsmsk_u32 (unsigned int __X) > { > return __X ^ (__X - 1); > } > > extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsmsk_u32 (unsigned int __X) > +{ > + return __blsmsk_u32 (__X); > +} > + > +extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __blsr_u32 (unsigned int __X) > { > return __X & (__X - 1); > } > > +extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsr_u32 (unsigned int __X) > +{ > + return __blsr_u32 (__X); > +} > > extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __tzcnt_u32 (unsigned int __X) > @@ -84,6 +100,12 @@ __tzcnt_u32 (unsigned int __X) > return __builtin_ctz (__X); > } > > +extern __inline unsigned int __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_tzcnt_u32 (unsigned int __X) > +{ > + return __builtin_ctz (__X); > +} > + > > #ifdef __x86_64__ > extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > @@ -111,22 +133,46 @@ __blsi_u64 (unsigned long long __X) > } > > extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsi_u64 (unsigned long long __X) > +{ > + return __blsi_u64 (__X); > +} > + > +extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __blsmsk_u64 (unsigned long long __X) > { > return __X ^ (__X - 1); > } > > extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsmsk_u64 (unsigned long long __X) > +{ > + return __blsmsk_u64 (__X); > +} > + > +extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __blsr_u64 (unsigned long long __X) > { > return __X & (__X - 1); > } > > extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_blsr_u64 (unsigned long long __X) > +{ > + return __blsr_u64 (__X); > +} > + > +extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > __tzcnt_u64 (unsigned long long __X) > { > return __builtin_ctzll (__X); > } > + > +extern __inline unsigned long long __attribute__((__gnu_inline__, > __always_inline__, __artificial__)) > +_tzcnt_u64 (unsigned long long __X) > +{ > + return __builtin_ctzll (__X); > +} > > #endif /* __x86_64__ */ > > --- gcc/testsuite/gcc.target/i386/bmi-1.c (revision 201046) > +++ gcc/testsuite/gcc.target/i386/bmi-1.c (revision 201047) > @@ -2,10 +2,10 @@ > /* { dg-options "-O2 -mbmi " } */ > /* { dg-final { scan-assembler "andn\[^\\n]*eax" } } */ > /* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*eax" 2 } } */ > -/* { dg-final { scan-assembler "blsi\[^\\n]*eax" } } */ > -/* { dg-final { scan-assembler "blsmsk\[^\\n]*eax" } } */ > -/* { dg-final { scan-assembler "blsr\[^\\n]*eax" } } */ > -/* { dg-final { scan-assembler "tzcntl\[^\\n]*eax" } } */ > +/* { dg-final { scan-assembler-times "blsi\[^\\n]*eax" 2 } } */ > +/* { dg-final { scan-assembler-times "blsmsk\[^\\n]*eax" 2 } } */ > +/* { dg-final { scan-assembler-times "blsr\[^\\n]*eax" 2 } } */ > +/* { dg-final { scan-assembler-times "tzcntl\[^\\n]*eax" 2 } } */ > > #include <x86intrin.h> > > @@ -36,19 +36,43 @@ func_blsi32 (unsigned int X) > } > > unsigned int > +func_blsi32_2 (unsigned int X) > +{ > + return _blsi_u32(X); > +} > + > +unsigned int > func_blsmsk32 (unsigned int X) > { > return __blsmsk_u32(X); > } > > unsigned int > +func_blsmsk32_2 (unsigned int X) > +{ > + return _blsmsk_u32(X); > +} > + > +unsigned int > func_blsr32 (unsigned int X) > { > return __blsr_u32(X); > } > > unsigned int > +func_blsr32_2 (unsigned int X) > +{ > + return _blsr_u32(X); > +} > + > +unsigned int > func_tzcnt32 (unsigned int X) > { > return __tzcnt_u32(X); > } > + > +unsigned int > +func_tzcnt32_2 (unsigned int X) > +{ > + return _tzcnt_u32(X); > +} > --- gcc/testsuite/gcc.target/i386/bmi-2.c (revision 201046) > +++ gcc/testsuite/gcc.target/i386/bmi-2.c (revision 201047) > @@ -2,10 +2,10 @@ > /* { dg-options "-O2 -mbmi " } */ > /* { dg-final { scan-assembler "andn\[^\\n]*rax" } } */ > /* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*rax" 2 } } */ > -/* { dg-final { scan-assembler "blsi\[^\\n]*rax" } } */ > -/* { dg-final { scan-assembler "blsmsk\[^\\n]*rax" } } */ > -/* { dg-final { scan-assembler "blsr\[^\\n]*rax" } } */ > -/* { dg-final { scan-assembler "tzcntq\[^\\n]*rax" } } */ > +/* { dg-final { scan-assembler-times "blsi\[^\\n]*rax" 2 } } */ > +/* { dg-final { scan-assembler-times "blsmsk\[^\\n]*rax" 2 } } */ > +/* { dg-final { scan-assembler-times "blsr\[^\\n]*rax" 2 } } */ > +/* { dg-final { scan-assembler-times "tzcntq\[^\\n]*rax" 2 } } */ > > #include <x86intrin.h> > > @@ -36,19 +36,43 @@ func_blsi64 (unsigned long long X) > } > > unsigned long long > +func_blsi64_2 (unsigned long long X) > +{ > + return _blsi_u64 (X); > +} > + > +unsigned long long > func_blsmsk64 (unsigned long long X) > { > return __blsmsk_u64 (X); > } > > unsigned long long > +func_blsmsk64_2 (unsigned long long X) > +{ > + return _blsmsk_u64 (X); > +} > + > +unsigned long long > func_blsr64 (unsigned long long X) > { > return __blsr_u64 (X); > } > > unsigned long long > +func_blsr64_2 (unsigned long long X) > +{ > + return _blsr_u64 (X); > +} > + > +unsigned long long > func_tzcnt64 (unsigned long long X) > { > return __tzcnt_u64 (X); > } > + > +unsigned long long > +func_tzcnt64_2 (unsigned long long X) > +{ > + return _tzcnt_u64 (X); > +} > > > Jakub