mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 05:10:25 +08:00
i386: Add missing BMI intrinsic to align with clang
gcc/ChangeLog: * config/i386/bmiintrin.h (_tzcnt_u16): New intrinsic. (_andn_u32): Ditto. (_andn_u64): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/bmi-1.c: Add test for new intrinsic. * gcc.target/i386/bmi-2.c: Ditto. * gcc.target/i386/bmi-3.c: Ditto.
This commit is contained in:
parent
6fad101f30
commit
d22907975b
@ -40,12 +40,24 @@ __tzcnt_u16 (unsigned short __X)
|
||||
return __builtin_ia32_tzcnt_u16 (__X);
|
||||
}
|
||||
|
||||
extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
_tzcnt_u16 (unsigned short __X)
|
||||
{
|
||||
return __builtin_ia32_tzcnt_u16 (__X);
|
||||
}
|
||||
|
||||
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
__andn_u32 (unsigned int __X, unsigned int __Y)
|
||||
{
|
||||
return ~__X & __Y;
|
||||
}
|
||||
|
||||
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
_andn_u32 (unsigned int __X, unsigned int __Y)
|
||||
{
|
||||
return __andn_u32 (__X, __Y);
|
||||
}
|
||||
|
||||
extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
__bextr_u32 (unsigned int __X, unsigned int __Y)
|
||||
{
|
||||
@ -114,6 +126,12 @@ __andn_u64 (unsigned long long __X, unsigned long long __Y)
|
||||
return ~__X & __Y;
|
||||
}
|
||||
|
||||
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
_andn_u64 (unsigned long long __X, unsigned long long __Y)
|
||||
{
|
||||
return __andn_u64 (__X, __Y);
|
||||
}
|
||||
|
||||
extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
|
||||
__bextr_u64 (unsigned long long __X, unsigned long long __Y)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-ipa-icf -mbmi " } */
|
||||
/* { dg-final { scan-assembler "andn\[^\\n]*eax" } } */
|
||||
/* { dg-final { scan-assembler-times "andn\[^\\n]*eax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*eax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "blsi\[^\\n]*eax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "blsmsk\[^\\n]*eax" 2 } } */
|
||||
@ -15,6 +15,12 @@ func_andn32 (unsigned int X, unsigned int Y)
|
||||
return __andn_u32(X, Y);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
func_andn32_2 (unsigned int X, unsigned int Y)
|
||||
{
|
||||
return _andn_u32(X, Y);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
func_bextr32 (unsigned int X, unsigned int Y)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* { dg-do compile { target { ! ia32 } } } */
|
||||
/* { dg-options "-O2 -fno-ipa-icf -mbmi " } */
|
||||
/* { dg-final { scan-assembler "andn\[^\\n]*rax" } } */
|
||||
/* { dg-final { scan-assembler-times "andn\[^\\n]*rax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*rax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "blsi\[^\\n]*rax" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "blsmsk\[^\\n]*rax" 2 } } */
|
||||
@ -15,6 +15,12 @@ func_andn64 (unsigned long long X, unsigned long long Y)
|
||||
return __andn_u64 (X, Y);
|
||||
}
|
||||
|
||||
unsigned long long
|
||||
func_andn64_2 (unsigned long long X, unsigned long long Y)
|
||||
{
|
||||
return _andn_u64 (X, Y);
|
||||
}
|
||||
|
||||
unsigned long long
|
||||
func_bextr64 (unsigned long long X, unsigned long long Y)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mbmi " } */
|
||||
/* { dg-final { scan-assembler "tzcntw\[^\\n]*(%|)ax" } } */
|
||||
/* { dg-final { scan-assembler-times "tzcntw\[^\\n]*%?ax" 2 } } */
|
||||
|
||||
#include <x86intrin.h>
|
||||
|
||||
@ -9,3 +9,9 @@ func_tzcnt16 (unsigned short X)
|
||||
{
|
||||
return __tzcnt_u16(X);
|
||||
}
|
||||
|
||||
unsigned short
|
||||
func_tzcnt16_2 (unsigned short X)
|
||||
{
|
||||
return _tzcnt_u16(X);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user