This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, i386, PR57623] Introduce synonyms for BMI intrinsics
- From: Kirill Yukhin <kirill dot yukhin at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Uros Bizjak <ubizjak at gmail dot com>, Richard Henderson <rth at redhat dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 17 Apr 2014 15:18:02 +0400
- Subject: Re: [PATCH, i386, PR57623] Introduce synonyms for BMI intrinsics
- Authentication-results: sourceware.org; auth=none
- References: <51D29033 dot 8090301 at gmail dot com> <CAFULd4YmYO-cqF5rXhBsQ7AC-7zvDcg-rCh-qStfb_CTfU2_Uw at mail dot gmail dot com> <20140417101308 dot GQ1817 at tucnak dot redhat dot com>
Thanks! Sorry, missed that!
K
On Thu, Apr 17, 2014 at 2:13 PM, Jakub Jelinek <jakub@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.yukhin@gmail.com> wrote:
>> > Bootstrap passing. Updated tests passing on BMI-featured HW.
>> >
>> > ChangeLog:
>> > 2013-07-02 Kirill Yukhin <kirill.yukhin@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.yukhin@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 <jakub@redhat.com>
>
> PR target/60847
> Forward port from 4.8 branch
> 2013-07-19 Kirill Yukhin <kirill.yukhin@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