Commit 5a65129e by Jakub Jelinek Committed by Jakub Jelinek

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
parent 59b266b1
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> 2014-04-17 Kito Cheng <kito@0xlab.org>
* gcc.c (used_arg): Prevent out of bound access for multilib_options. * gcc.c (used_arg): Prevent out of bound access for multilib_options.
......
...@@ -40,7 +40,6 @@ __tzcnt_u16 (unsigned short __X) ...@@ -40,7 +40,6 @@ __tzcnt_u16 (unsigned short __X)
return __builtin_ctzs (__X); return __builtin_ctzs (__X);
} }
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__andn_u32 (unsigned int __X, unsigned int __Y) __andn_u32 (unsigned int __X, unsigned int __Y)
{ {
...@@ -66,17 +65,34 @@ __blsi_u32 (unsigned int __X) ...@@ -66,17 +65,34 @@ __blsi_u32 (unsigned int __X)
} }
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 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) __blsmsk_u32 (unsigned int __X)
{ {
return __X ^ (__X - 1); return __X ^ (__X - 1);
} }
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 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) __blsr_u32 (unsigned int __X)
{ {
return __X & (__X - 1); 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__)) extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__tzcnt_u32 (unsigned int __X) __tzcnt_u32 (unsigned int __X)
...@@ -84,6 +100,12 @@ __tzcnt_u32 (unsigned int __X) ...@@ -84,6 +100,12 @@ __tzcnt_u32 (unsigned int __X)
return __builtin_ctz (__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__ #ifdef __x86_64__
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
...@@ -111,23 +133,47 @@ __blsi_u64 (unsigned long long __X) ...@@ -111,23 +133,47 @@ __blsi_u64 (unsigned long long __X)
} }
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 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) __blsmsk_u64 (unsigned long long __X)
{ {
return __X ^ (__X - 1); return __X ^ (__X - 1);
} }
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 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) __blsr_u64 (unsigned long long __X)
{ {
return __X & (__X - 1); return __X & (__X - 1);
} }
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 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) __tzcnt_u64 (unsigned long long __X)
{ {
return __builtin_ctzll (__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__ */ #endif /* __x86_64__ */
#ifdef __DISABLE_BMI__ #ifdef __DISABLE_BMI__
......
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> 2014-04-17 Richard Biener <rguenther@suse.de>
PR middle-end/60849 PR middle-end/60849
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
/* { dg-options "-O2 -mbmi " } */ /* { dg-options "-O2 -mbmi " } */
/* { dg-final { scan-assembler "andn\[^\\n]*eax" } } */ /* { dg-final { scan-assembler "andn\[^\\n]*eax" } } */
/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*eax" 2 } } */ /* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*eax" 2 } } */
/* { dg-final { scan-assembler "blsi\[^\\n]*eax" } } */ /* { dg-final { scan-assembler-times "blsi\[^\\n]*eax" 2 } } */
/* { dg-final { scan-assembler "blsmsk\[^\\n]*eax" } } */ /* { dg-final { scan-assembler-times "blsmsk\[^\\n]*eax" 2 } } */
/* { dg-final { scan-assembler "blsr\[^\\n]*eax" } } */ /* { dg-final { scan-assembler-times "blsr\[^\\n]*eax" 2 } } */
/* { dg-final { scan-assembler "tzcntl\[^\\n]*eax" } } */ /* { dg-final { scan-assembler-times "tzcntl\[^\\n]*eax" 2 } } */
#include <x86intrin.h> #include <x86intrin.h>
...@@ -36,19 +36,43 @@ func_blsi32 (unsigned int X) ...@@ -36,19 +36,43 @@ func_blsi32 (unsigned int X)
} }
unsigned int unsigned int
func_blsi32_2 (unsigned int X)
{
return _blsi_u32(X);
}
unsigned int
func_blsmsk32 (unsigned int X) func_blsmsk32 (unsigned int X)
{ {
return __blsmsk_u32(X); return __blsmsk_u32(X);
} }
unsigned int unsigned int
func_blsmsk32_2 (unsigned int X)
{
return _blsmsk_u32(X);
}
unsigned int
func_blsr32 (unsigned int X) func_blsr32 (unsigned int X)
{ {
return __blsr_u32(X); return __blsr_u32(X);
} }
unsigned int unsigned int
func_blsr32_2 (unsigned int X)
{
return _blsr_u32(X);
}
unsigned int
func_tzcnt32 (unsigned int X) func_tzcnt32 (unsigned int X)
{ {
return __tzcnt_u32(X); return __tzcnt_u32(X);
} }
unsigned int
func_tzcnt32_2 (unsigned int X)
{
return _tzcnt_u32(X);
}
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
/* { dg-options "-O2 -mbmi " } */ /* { dg-options "-O2 -mbmi " } */
/* { dg-final { scan-assembler "andn\[^\\n]*rax" } } */ /* { dg-final { scan-assembler "andn\[^\\n]*rax" } } */
/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*rax" 2 } } */ /* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*rax" 2 } } */
/* { dg-final { scan-assembler "blsi\[^\\n]*rax" } } */ /* { dg-final { scan-assembler-times "blsi\[^\\n]*rax" 2 } } */
/* { dg-final { scan-assembler "blsmsk\[^\\n]*rax" } } */ /* { dg-final { scan-assembler-times "blsmsk\[^\\n]*rax" 2 } } */
/* { dg-final { scan-assembler "blsr\[^\\n]*rax" } } */ /* { dg-final { scan-assembler-times "blsr\[^\\n]*rax" 2 } } */
/* { dg-final { scan-assembler "tzcntq\[^\\n]*rax" } } */ /* { dg-final { scan-assembler-times "tzcntq\[^\\n]*rax" 2 } } */
#include <x86intrin.h> #include <x86intrin.h>
...@@ -36,19 +36,43 @@ func_blsi64 (unsigned long long X) ...@@ -36,19 +36,43 @@ func_blsi64 (unsigned long long X)
} }
unsigned long long unsigned long long
func_blsi64_2 (unsigned long long X)
{
return _blsi_u64 (X);
}
unsigned long long
func_blsmsk64 (unsigned long long X) func_blsmsk64 (unsigned long long X)
{ {
return __blsmsk_u64 (X); return __blsmsk_u64 (X);
} }
unsigned long long unsigned long long
func_blsmsk64_2 (unsigned long long X)
{
return _blsmsk_u64 (X);
}
unsigned long long
func_blsr64 (unsigned long long X) func_blsr64 (unsigned long long X)
{ {
return __blsr_u64 (X); return __blsr_u64 (X);
} }
unsigned long long unsigned long long
func_blsr64_2 (unsigned long long X)
{
return _blsr_u64 (X);
}
unsigned long long
func_tzcnt64 (unsigned long long X) func_tzcnt64 (unsigned long long X)
{ {
return __tzcnt_u64 (X); return __tzcnt_u64 (X);
} }
unsigned long long
func_tzcnt64_2 (unsigned long long X)
{
return _tzcnt_u64 (X);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment