[gcc r16-9488] i386: Keep _ep[i|u]{32, 64} names of scalar SAT CVT intrinsics [PR126581]

Hu via Gcc-cvs <[email protected]> Mon, 3 Aug 2026 09:06:17 +0000 (GMT)
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:a9d97c80729499306268afbb145135c9d4d28e22

commit r16-9488-ga9d97c80729499306268afbb145135c9d4d28e22
Author: Hu, Lin1 <[email protected]>
Date:   Mon Aug 3 10:15:44 2026 +0800

    i386: Keep _ep[i|u]{32,64} names of scalar SAT CVT intrinsics [PR126581]
    
    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.

Diff:
---
 gcc/config/i386/avx10_2satcvtintrin.h      | 131 +++++++++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr126581-1.c |  65 ++++++++++++++
 2 files changed, 196 insertions(+)

diff --git a/gcc/config/i386/avx10_2satcvtintrin.h b/gcc/config/i386/avx10_2satcvtintrin.h
index f202ec862c95..3c323c9a52e0 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 000000000000..dd254c2faf1f
--- /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);
+}