RE: [PATCH] i386: Keep _ep[i|u]{32,64} names of scalar SAT CVT intrinsics [PR126581]
"Liu, Hongtao" <[email protected]> Mon, 3 Aug 2026 07:38:19 +0000
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <DS4PPF240F42FB79B3D3C34BB9A97BB3A13E5D52@DS4PPF240F42FB7.namprd11.prod.outlook.com> |
> -----Original Message----- > From: H.J. Lu <[email protected]> > Sent: Monday, August 3, 2026 3:26 PM > To: Hu, Lin1 <[email protected]> > Cc: [email protected]; Liu, Hongtao <[email protected]>; > [email protected]; [email protected] > Subject: Re: [PATCH] i386: Keep _ep[i|u]{32,64} names of scalar SAT CVT > intrinsics [PR126581] > > On Mon, Aug 3, 2026 at 3:16 PM Hu, Lin1 <[email protected]> wrote: > > > > 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. > > > > 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. > > This doesn't help programmers migrate to the new names. > The same source which compiles fine for GCC 16 may fail for GCC 17. I prefer to document this change in changs.html for clarification but not support alias of them forever, those names are typo, not supported by LLVM/ICX. We believe users are unlikely to use these misspelled intrinsics either, as they are not portable across different x86 compilers (e.g., LLVM, ICX). > Please also document this change in changes.html for gcc 17 (in fact I wonder if we cannot simply support those aliases forever?) > > > --- > > 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 > > > > > -- > H.J.