* [PATCH] [i386]Add missing BMI function to align with clang
@ 2021-12-21 5:22 Haochen Jiang
2021-12-21 7:25 ` Uros Bizjak
0 siblings, 1 reply; 2+ messages in thread
From: Haochen Jiang @ 2021-12-21 5:22 UTC (permalink / raw)
To: gcc-patches; +Cc: ubizjak, hongtao.liu
Hi all,
This patch adds missing BMI function _tzcnt_u16, _andn_u32, _andn_u64 to align with clang.
Regtested on x86_64-pc-linux-gnu. Ok for trunk?
BRs,
Haochen
gcc/ChangeLog:
* config/i386/bmiintrin.h (_tzcnt_u16): New define function.
(_andn_u32): Ditto.
(_andn_u64): Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/i386/bmi-1.c: Add new test for new define function.
* gcc.target/i386/bmi-2.c: Ditto.
* gcc.target/i386/bmi-3.c: Ditto.
---
gcc/config/i386/bmiintrin.h | 18 ++++++++++++++++++
gcc/testsuite/gcc.target/i386/bmi-1.c | 8 +++++++-
gcc/testsuite/gcc.target/i386/bmi-2.c | 8 +++++++-
gcc/testsuite/gcc.target/i386/bmi-3.c | 8 +++++++-
4 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/gcc/config/i386/bmiintrin.h b/gcc/config/i386/bmiintrin.h
index 439d81cba11..92450a644eb 100644
--- a/gcc/config/i386/bmiintrin.h
+++ b/gcc/config/i386/bmiintrin.h
@@ -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)
{
diff --git a/gcc/testsuite/gcc.target/i386/bmi-1.c b/gcc/testsuite/gcc.target/i386/bmi-1.c
index 738705e29d8..141adaac016 100644
--- a/gcc/testsuite/gcc.target/i386/bmi-1.c
+++ b/gcc/testsuite/gcc.target/i386/bmi-1.c
@@ -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)
{
diff --git a/gcc/testsuite/gcc.target/i386/bmi-2.c b/gcc/testsuite/gcc.target/i386/bmi-2.c
index 6b8595eb9e1..3f9052a4991 100644
--- a/gcc/testsuite/gcc.target/i386/bmi-2.c
+++ b/gcc/testsuite/gcc.target/i386/bmi-2.c
@@ -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)
{
diff --git a/gcc/testsuite/gcc.target/i386/bmi-3.c b/gcc/testsuite/gcc.target/i386/bmi-3.c
index ddc5e0f66e2..0b91bc25bf8 100644
--- a/gcc/testsuite/gcc.target/i386/bmi-3.c
+++ b/gcc/testsuite/gcc.target/i386/bmi-3.c
@@ -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);
+}
--
2.18.1
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] [i386]Add missing BMI function to align with clang
2021-12-21 5:22 [PATCH] [i386]Add missing BMI function to align with clang Haochen Jiang
@ 2021-12-21 7:25 ` Uros Bizjak
0 siblings, 0 replies; 2+ messages in thread
From: Uros Bizjak @ 2021-12-21 7:25 UTC (permalink / raw)
To: Haochen Jiang; +Cc: gcc-patches, Hongtao Liu
On Tue, Dec 21, 2021 at 6:22 AM Haochen Jiang <haochen.jiang@intel.com> wrote:
>
> Hi all,
>
> This patch adds missing BMI function _tzcnt_u16, _andn_u32, _andn_u64 to align with clang.
>
> Regtested on x86_64-pc-linux-gnu. Ok for trunk?
>
> BRs,
> Haochen
>
> gcc/ChangeLog:
>
> * config/i386/bmiintrin.h (_tzcnt_u16): New define function.
> (_andn_u32): Ditto.
> (_andn_u64): Ditto.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/i386/bmi-1.c: Add new test for new define function.
> * gcc.target/i386/bmi-2.c: Ditto.
> * gcc.target/i386/bmi-3.c: Ditto.
OK.
Thanks,
Uros.
> ---
> gcc/config/i386/bmiintrin.h | 18 ++++++++++++++++++
> gcc/testsuite/gcc.target/i386/bmi-1.c | 8 +++++++-
> gcc/testsuite/gcc.target/i386/bmi-2.c | 8 +++++++-
> gcc/testsuite/gcc.target/i386/bmi-3.c | 8 +++++++-
> 4 files changed, 39 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/config/i386/bmiintrin.h b/gcc/config/i386/bmiintrin.h
> index 439d81cba11..92450a644eb 100644
> --- a/gcc/config/i386/bmiintrin.h
> +++ b/gcc/config/i386/bmiintrin.h
> @@ -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)
> {
> diff --git a/gcc/testsuite/gcc.target/i386/bmi-1.c b/gcc/testsuite/gcc.target/i386/bmi-1.c
> index 738705e29d8..141adaac016 100644
> --- a/gcc/testsuite/gcc.target/i386/bmi-1.c
> +++ b/gcc/testsuite/gcc.target/i386/bmi-1.c
> @@ -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)
> {
> diff --git a/gcc/testsuite/gcc.target/i386/bmi-2.c b/gcc/testsuite/gcc.target/i386/bmi-2.c
> index 6b8595eb9e1..3f9052a4991 100644
> --- a/gcc/testsuite/gcc.target/i386/bmi-2.c
> +++ b/gcc/testsuite/gcc.target/i386/bmi-2.c
> @@ -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)
> {
> diff --git a/gcc/testsuite/gcc.target/i386/bmi-3.c b/gcc/testsuite/gcc.target/i386/bmi-3.c
> index ddc5e0f66e2..0b91bc25bf8 100644
> --- a/gcc/testsuite/gcc.target/i386/bmi-3.c
> +++ b/gcc/testsuite/gcc.target/i386/bmi-3.c
> @@ -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);
> +}
> --
> 2.18.1
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-12-21 7:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-21 5:22 [PATCH] [i386]Add missing BMI function to align with clang Haochen Jiang
2021-12-21 7:25 ` Uros Bizjak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).