Re: [PATCH] i386: Keep _ep[i|u]{32, 64} names of scalar SAT CVT intrinsics [PR126581]

Richard Biener <[email protected]> Mon, 3 Aug 2026 09:23:58 +0200
Newsgroups gmane.comp.gcc.patches
Message-ID <CAFiYyc3AL5G7HWOafe9iRzSy3YRxgSAGtgE7xNLqgb6dDgTahw@mail.gmail.com>
On Mon, Aug 3, 2026 at 9:20 AM Hu, Lin1 <[email protected]> wrote:
>
> Hi, all
>
> r16-9456 renamed the AVX10.2 scalar SAT CVT intrinsics to the _[i|u]{32,64}
> suffix and was backported to releases/gcc-15 and releases/gcc-16.
> Within a release series the old names have to keep working, so add them
> back as aliases.
>
> Bootstrapped and regtested on x86_64-linux-gnu, OK for gcc-15 and gcc-16?

OK.  Please also document this change in changes.html for gcc 17 (in fact I
wonder if we cannot simply support those aliases forever?)

Richard.

>
> BRs,
> Lin
>
> gcc/ChangeLog:
>
>         PR target/126581
>         * config/i386/avx10_2satcvtintrin.h
>         (_mm_cvtts_sd_epi32): New alias of _mm_cvtts_sd_i32.
>         (_mm_cvtts_sd_epu32): New alias of _mm_cvtts_sd_u32.
>         (_mm_cvtts_ss_epi32): New alias of _mm_cvtts_ss_i32.
>         (_mm_cvtts_ss_epu32): New alias of _mm_cvtts_ss_u32.
>         (_mm_cvtts_roundsd_epi32): New alias of _mm_cvtts_roundsd_i32.
>         (_mm_cvtts_roundsd_epu32): New alias of _mm_cvtts_roundsd_u32.
>         (_mm_cvtts_roundss_epi32): New alias of _mm_cvtts_roundss_i32.
>         (_mm_cvtts_roundss_epu32): New alias of _mm_cvtts_roundss_u32.
>         (_mm_cvtts_sd_epi64): New alias of _mm_cvtts_sd_i64.
>         (_mm_cvtts_sd_epu64): New alias of _mm_cvtts_sd_u64.
>         (_mm_cvtts_ss_epi64): New alias of _mm_cvtts_ss_i64.
>         (_mm_cvtts_ss_epu64): New alias of _mm_cvtts_ss_u64.
>         (_mm_cvtts_roundsd_epi64): New alias of _mm_cvtts_roundsd_i64.
>         (_mm_cvtts_roundsd_epu64): New alias of _mm_cvtts_roundsd_u64.
>         (_mm_cvtts_roundss_epi64): New alias of _mm_cvtts_roundss_i64.
>         (_mm_cvtts_roundss_epu64): New alias of _mm_cvtts_roundss_u64.
>
> gcc/testsuite/ChangeLog:
>
>         PR target/126581
>         * gcc.target/i386/pr126581-1.c: New test.
> ---
>  gcc/config/i386/avx10_2satcvtintrin.h      | 131 +++++++++++++++++++++
>  gcc/testsuite/gcc.target/i386/pr126581-1.c |  65 ++++++++++
>  2 files changed, 196 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr126581-1.c
>
> diff --git a/gcc/config/i386/avx10_2satcvtintrin.h b/gcc/config/i386/avx10_2satcvtintrin.h
> index f202ec862c9..3c323c9a52e 100644
> --- a/gcc/config/i386/avx10_2satcvtintrin.h
> +++ b/gcc/config/i386/avx10_2satcvtintrin.h
> @@ -3013,6 +3013,137 @@ _mm_cvtts_roundss_u64 (__m128 __A, const int __R)
>  #endif
>  #endif /* __x86_64__ */
>
> +/* The scalar SAT CVT intrinsics were originally named with an _ep[i|u]{32,64}
> +   suffix, which is reserved for packed elements.  Keep the original names as
> +   aliases.  */
> +extern __inline int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_sd_epi32 (__m128d __A)
> +{
> +  return _mm_cvtts_sd_i32 (__A);
> +}
> +
> +extern __inline unsigned int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_sd_epu32 (__m128d __A)
> +{
> +  return _mm_cvtts_sd_u32 (__A);
> +}
> +
> +extern __inline int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_ss_epi32 (__m128 __A)
> +{
> +  return _mm_cvtts_ss_i32 (__A);
> +}
> +
> +extern __inline unsigned int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_ss_epu32 (__m128 __A)
> +{
> +  return _mm_cvtts_ss_u32 (__A);
> +}
> +
> +#ifdef __OPTIMIZE__
> +extern __inline int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundsd_epi32 (__m128d __A, const int __R)
> +{
> +  return _mm_cvtts_roundsd_i32 (__A, __R);
> +}
> +
> +extern __inline unsigned int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundsd_epu32 (__m128d __A, const int __R)
> +{
> +  return _mm_cvtts_roundsd_u32 (__A, __R);
> +}
> +
> +extern __inline int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundss_epi32 (__m128 __A, const int __R)
> +{
> +  return _mm_cvtts_roundss_i32 (__A, __R);
> +}
> +
> +extern __inline unsigned int
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundss_epu32 (__m128 __A, const int __R)
> +{
> +  return _mm_cvtts_roundss_u32 (__A, __R);
> +}
> +#else
> +#define _mm_cvtts_roundsd_epi32(A, R) _mm_cvtts_roundsd_i32 ((A), (R))
> +#define _mm_cvtts_roundsd_epu32(A, R) _mm_cvtts_roundsd_u32 ((A), (R))
> +#define _mm_cvtts_roundss_epi32(A, R) _mm_cvtts_roundss_i32 ((A), (R))
> +#define _mm_cvtts_roundss_epu32(A, R) _mm_cvtts_roundss_u32 ((A), (R))
> +#endif
> +
> +#ifdef __x86_64__
> +extern __inline long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_sd_epi64 (__m128d __A)
> +{
> +  return _mm_cvtts_sd_i64 (__A);
> +}
> +
> +extern __inline unsigned long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_sd_epu64 (__m128d __A)
> +{
> +  return _mm_cvtts_sd_u64 (__A);
> +}
> +
> +extern __inline long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_ss_epi64 (__m128 __A)
> +{
> +  return _mm_cvtts_ss_i64 (__A);
> +}
> +
> +extern __inline unsigned long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_ss_epu64 (__m128 __A)
> +{
> +  return _mm_cvtts_ss_u64 (__A);
> +}
> +
> +#ifdef __OPTIMIZE__
> +extern __inline long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundsd_epi64 (__m128d __A, const int __R)
> +{
> +  return _mm_cvtts_roundsd_i64 (__A, __R);
> +}
> +
> +extern __inline unsigned long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundsd_epu64 (__m128d __A, const int __R)
> +{
> +  return _mm_cvtts_roundsd_u64 (__A, __R);
> +}
> +
> +extern __inline long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundss_epi64 (__m128 __A, const int __R)
> +{
> +  return _mm_cvtts_roundss_i64 (__A, __R);
> +}
> +
> +extern __inline unsigned long long
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_cvtts_roundss_epu64 (__m128 __A, const int __R)
> +{
> +  return _mm_cvtts_roundss_u64 (__A, __R);
> +}
> +#else
> +#define _mm_cvtts_roundsd_epi64(A, R) _mm_cvtts_roundsd_i64 ((A), (R))
> +#define _mm_cvtts_roundsd_epu64(A, R) _mm_cvtts_roundsd_u64 ((A), (R))
> +#define _mm_cvtts_roundss_epi64(A, R) _mm_cvtts_roundss_i64 ((A), (R))
> +#define _mm_cvtts_roundss_epu64(A, R) _mm_cvtts_roundss_u64 ((A), (R))
> +#endif
> +#endif /* __x86_64__ */
> +
>  #ifdef __DISABLE_AVX10_2__
>  #undef __DISABLE_AVX10_2__
>  #pragma GCC pop_options
> diff --git a/gcc/testsuite/gcc.target/i386/pr126581-1.c b/gcc/testsuite/gcc.target/i386/pr126581-1.c
> new file mode 100644
> index 00000000000..dd254c2faf1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr126581-1.c
> @@ -0,0 +1,65 @@
> +/* PR target/126581  */
> +/* { dg-do compile { target { *-*-linux* && lp64 } } } */
> +/* { dg-options "-O2 -march=x86-64-v4 -mavx10.2 -Wno-deprecated-declarations" } */
> +/* { dg-final { scan-assembler-times "vcvttss2usis\[ \t]*%xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttss2usis\[ \t]*\{sae\}, %xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttss2sis\[ \t]*%xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttss2sis\[ \t]*\{sae\}, %xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttsd2usis\[ \t]*%xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttsd2usis\[ \t]*\{sae\}, %xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttsd2sis\[ \t]*%xmm0, %eax" 1 } } */
> +/* { dg-final { scan-assembler-times "vcvttsd2sis\[ \t]*\{sae\}, %xmm0, %eax" 1 } } */
> +
> +#include <x86intrin.h>
> +
> +unsigned long long
> +func1 (__m128 x)
> +{
> +  return _mm_cvtts_ss_epu32 (x);
> +}
> +
> +unsigned long long
> +func2 (__m128 x)
> +{
> +  return _mm_cvtts_roundss_epu32
> +    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
> +}
> +
> +unsigned long long
> +func3 (__m128 x)
> +{
> +  return (unsigned int) _mm_cvtts_ss_epi32 (x);
> +}
> +
> +unsigned long long
> +func4 (__m128 x)
> +{
> +  return (unsigned int) _mm_cvtts_roundss_epi32
> +    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
> +}
> +
> +unsigned long long
> +func5 (__m128d x)
> +{
> +  return _mm_cvtts_sd_epu32 (x);
> +}
> +
> +unsigned long long
> +func6 (__m128d x)
> +{
> +  return _mm_cvtts_roundsd_epu32
> +    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
> +}
> +
> +unsigned long long
> +func7 (__m128d x)
> +{
> +  return (unsigned int) _mm_cvtts_sd_epi32 (x);
> +}
> +
> +unsigned long long
> +func8 (__m128d x)
> +{
> +  return (unsigned int) _mm_cvtts_roundsd_epi32
> +    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
> +}
> --
> 2.31.1
>