mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 00:01:21 +08:00
re PR target/60847 (x86 BMI intrinsics not recognized)
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. From-SVN: r209471
This commit is contained in:
parent
59b266b1d7
commit
5a65129e4e
@ -1,3 +1,18 @@
|
||||
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.
|
||||
|
||||
2014-04-17 Kito Cheng <kito@0xlab.org>
|
||||
|
||||
* gcc.c (used_arg): Prevent out of bound access for multilib_options.
|
||||
|
@ -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)
|
||||
{
|
||||
@ -65,18 +64,35 @@ __blsi_u32 (unsigned int __X)
|
||||
return __X & -__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__))
|
||||
@ -110,24 +132,48 @@ __blsi_u64 (unsigned long long __X)
|
||||
return __X & -__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__ */
|
||||
|
||||
#ifdef __DISABLE_BMI__
|
||||
|
@ -1,3 +1,13 @@
|
||||
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>
|
||||
|
||||
* gcc.target/i386/bmi-1.c: Extend with new instrinsics.
|
||||
Fix scan patterns.
|
||||
* gcc.target/i386/bmi-2.c: Ditto.
|
||||
|
||||
2014-04-17 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/60849
|
||||
|
@ -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>
|
||||
|
||||
@ -35,20 +35,44 @@ func_blsi32 (unsigned int X)
|
||||
return __blsi_u32(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);
|
||||
}
|
||||
|
@ -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>
|
||||
|
||||
@ -35,20 +35,44 @@ func_blsi64 (unsigned long long X)
|
||||
return __blsi_u64 (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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user