1. Add round_zext and round_saeonly_zext to subst.md.
2. Use them to add missing SSE and AVX zero-extend patterns.
3. Add tests to check for newly added SSE and AVX zero-extend patterns.

gcc/

PR target/126231
* config/i386/i386.md (*fix_trunc<mode>si_sse_zext): New.
(*fix_trunc<mode>si_sse_2_zext): Likewise.
* config/i386/sse.md
(*avx512fp16_vcvtsh2<sseintconvertsignprefix>si<round_zext_name>):
Likewise.
(avx512fp16_vcvtsh2<sseintconvertsignprefix>si_2_zext): Likewise.
(*unspec_avx512fp16_fix<vcvtt_uns_suffix>_truncsi2<round_saeonly_zext_name>):
Likewise.
(*sse_cvtss2si<round_zext_name>): Likewise.
(*sse_cvtss2si_2_zext): Likewise.
(*unspec_sse_cvttss2si<round_saeonly_zext_name>): Likewise.
(*sse_cvttss2si<round_saeonly_zext_name>): Likewise.
(*avx512f_vcvtss2usi<round_zext_name>): Likewise.
(*unspec_avx512f_vcvttss2usi<round_saeonly_zext_name>): Likewise.
(*avx512f_vcvttss2usi<round_saeonly_zext_name>): Likewise.
(*avx512f_vcvtsd2usi<round_zext_name>): Likewise.
(*unspec_avx512f_vcvttsd2usi<round_saeonly_zext_name>):
Likewise.
(*avx512f_vcvttsd2usi<round_saeonly_zext_name>): Likewise.
(*sse2_cvtsd2si<round_zext_name>): Likewise.
(*sse2_cvtsd2si_2_zext): Likewise.
(*unspec_sse2_cvttsd2si<round_saeonly_zext_name>): Likewise.
(*sse2_cvttsd2si<round_saeonly_zext_name>): Likewise.
(*avx10_2_vcvttsd2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>):
Likewise.
(*avx10_2_vcvttss2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>):
Likewise.
* config/i386/subst.md (round_zext_name): Likewise.
(round_zext_constraint): Likewise.
(round_zext_constraint2): Likewise.
(round_zext_nimm_predicate): Likewise.
(round_zext_nimm_scalar_predicate): Likewise.
(round_zext_op2): Likewise.
(round_zext): Likewise.
(round_saeonly_zext_name): Likewise.
(round_saeonly_zext_constraint): Likewise.
(round_saeonly_zext_constraint2): Likewise.
(round_saeonly_zext_nimm_scalar_predicate): Likewise.
(round_saeonly_zext_op2): Likewise.
(round_saeonly_zext): Likewise.

gcc/testsuite/

PR target/126231
* gcc.target/i386/zext-avx10-1.c: New test.
* gcc.target/i386/zext-avx512f-1.c: Likewise.
* gcc.target/i386/zext-avx512fp16-1.c: Likewise.
* gcc.target/i386/zext-sse-1.c: Likewise.
* gcc.target/i386/zext-sse-2.c: Likewise.


-- 
H.J.
From 0419f3f7be906f50a294257e101d3b87cce11505 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Mon, 13 Jul 2026 09:12:13 +0800
Subject: [PATCH] x86: Add missing SSE and AVX zero-extend patterns

1. Add round_zext and round_saeonly_zext to subst.md.
2. Use them to add missing SSE and AVX zero-extend patterns.
3. Add tests to check for newly added SSE and AVX zero-extend patterns.

gcc/

	PR target/126231
	* config/i386/i386.md (*fix_trunc<mode>si_sse_zext): New.
	(*fix_trunc<mode>si_sse_2_zext): Likewise.
	* config/i386/sse.md (*avx512fp16_vcvtsh2<sseintconvertsignprefix>si<round_zext_name>):
	Likewise.
	(avx512fp16_vcvtsh2<sseintconvertsignprefix>si_2_zext): Likewise.
	(*unspec_avx512fp16_fix<vcvtt_uns_suffix>_truncsi2<round_saeonly_zext_name>): Likewise.
	(*sse_cvtss2si<round_zext_name>): Likewise.
	(*sse_cvtss2si_2_zext): Likewise.
	(*unspec_sse_cvttss2si<round_saeonly_zext_name>): Likewise.
	(*sse_cvttss2si<round_saeonly_zext_name>): Likewise.
	(*avx512f_vcvtss2usi<round_zext_name>): Likewise.
	(*unspec_avx512f_vcvttss2usi<round_saeonly_zext_name>): Likewise.
	(*avx512f_vcvttss2usi<round_saeonly_zext_name>): Likewise.
	(*avx512f_vcvtsd2usi<round_zext_name>): Likewise.
	(*unspec_avx512f_vcvttsd2usi<round_saeonly_zext_name>):
	Likewise.
	(*avx512f_vcvttsd2usi<round_saeonly_zext_name>): Likewise.
	(*sse2_cvtsd2si<round_zext_name>): Likewise.
	(*sse2_cvtsd2si_2_zext): Likewise.
	(*unspec_sse2_cvttsd2si<round_saeonly_zext_name>): Likewise.
	(*sse2_cvttsd2si<round_saeonly_zext_name>): Likewise.
	(*avx10_2_vcvttsd2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>):
	Likewise.
	(*avx10_2_vcvttss2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>):
	Likewise.
	* config/i386/subst.md (round_zext_name): Likewise.
	(round_zext_constraint): Likewise.
	(round_zext_constraint2): Likewise.
	(round_zext_nimm_predicate): Likewise.
	(round_zext_nimm_scalar_predicate): Likewise.
	(round_zext_op2): Likewise.
	(round_zext): Likewise.
	(round_saeonly_zext_name): Likewise.
	(round_saeonly_zext_constraint): Likewise.
	(round_saeonly_zext_constraint2): Likewise.
	(round_saeonly_zext_nimm_scalar_predicate): Likewise.
	(round_saeonly_zext_op2): Likewise.
	(round_saeonly_zext): Likewise.

gcc/testsuite/

	PR target/126231
	* gcc.target/i386/zext-avx10-1.c: New test.
	* gcc.target/i386/zext-avx512f-1.c: Likewise.
	* gcc.target/i386/zext-avx512fp16-1.c: Likewise.
	* gcc.target/i386/zext-sse-1.c: Likewise.
	* gcc.target/i386/zext-sse-2.c: Likewise.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386.md                       |  33 +++
 gcc/config/i386/sse.md                        | 278 ++++++++++++++++++
 gcc/config/i386/subst.md                      |  39 +++
 gcc/testsuite/gcc.target/i386/zext-avx10-1.c  | 139 +++++++++
 .../gcc.target/i386/zext-avx512f-1.c          | 241 +++++++++++++++
 .../gcc.target/i386/zext-avx512fp16-1.c       | 139 +++++++++
 gcc/testsuite/gcc.target/i386/zext-sse-1.c    | 103 +++++++
 gcc/testsuite/gcc.target/i386/zext-sse-2.c    |  68 +++++
 8 files changed, 1040 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/zext-avx10-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/zext-avx512f-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/zext-avx512fp16-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/zext-sse-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/zext-sse-2.c

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 3244bc6240d..3aa8c926094 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -6068,6 +6068,39 @@ (define_insn "fix_trunc<MODEF:mode><SWI48:mode>_sse"
    (set_attr "amdfam10_decode" "double,double")
    (set_attr "bdver1_decode" "double,double")])
 
+(define_insn "*fix_trunc<mode>si_sse_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (fix:SI (match_operand:MODEF 1 "nonimmediate_operand" "v,m"))))]
+  "TARGET_64BIT
+   && SSE_FLOAT_MODE_P (<MODE>mode)
+   && (!TARGET_FISTTP || TARGET_SSE_MATH)"
+  "%vcvtt<ssemodesuffix>2si{l}\t{%1, %k0|%k0, %1}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "prefix_rex" "*")
+   (set_attr "mode" "<MODE>")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")])
+
+(define_insn "*fix_trunc<mode>si_sse_2_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (subreg:SI
+            (fix:DI (match_operand:MODEF 1 "nonimmediate_operand" "v,m")) 0)))]
+  "TARGET_64BIT
+   && SSE_FLOAT_MODE_P (<MODE>mode)
+   && (!TARGET_FISTTP || TARGET_SSE_MATH)"
+  "%vcvtt<ssemodesuffix>2si{l}\t{%1, %k0|%k0, %1}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "prefix_rex" "*")
+   (set_attr "mode" "<MODE>")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")])
+
 ;; Avoid vector decoded forms of the instruction.
 (define_peephole2
   [(match_scratch:MODEF 2 "x")
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 0f35b20006d..5ca711a23d0 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -8218,6 +8218,20 @@ (define_insn "avx512fp16_vcvtsh2<sseintconvertsignprefix>si<rex64namesuffix><rou
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512fp16_vcvtsh2<sseintconvertsignprefix>si<round_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(vec_select:HF
+              (match_operand:V8HF 1 "register_operand" "v")
+              (parallel [(const_int 0)]))]
+            UNSPEC_US_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_AVX512FP16"
+  "vcvtsh2<sseintconvertsignprefix>si\t{<round_zext_op2>%1, %k0|%k0, %1<round_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "avx512fp16_vcvtsh2<sseintconvertsignprefix>si<rex64namesuffix>_2"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48
@@ -8229,6 +8243,18 @@ (define_insn "avx512fp16_vcvtsh2<sseintconvertsignprefix>si<rex64namesuffix>_2"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512fp16_vcvtsh2<sseintconvertsignprefix>si_2_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:HF 1 "nonimmediate_operand" "vm")]
+            UNSPEC_US_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_AVX512FP16"
+  "vcvtsh2<sseintconvertsignprefix>si\t{%1, %k0|%k0, %1}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_mode_attr sseicvtsuffix
   [(SI "l") (DI "q")])
 (define_insn "avx512fp16_vcvt<floatsuffix>si2sh<rex64namesuffix><round_name>"
@@ -8383,6 +8409,18 @@ (define_insn "unspec_avx512fp16_fix<vcvtt_uns_suffix>_trunc<mode>2<round_saeonly
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*unspec_avx512fp16_fix<vcvtt_uns_suffix>_truncsi2<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:V8HF 1 "register_operand" "v")]
+            UNSPEC_VCVTT_U)))]
+  "TARGET_64BIT && TARGET_AVX512FP16"
+  "vcvttsh2<vcvtt_suffix>si\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "avx512fp16_fix<fixunssuffix>_trunc<mode>2<round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(any_fix:SWI48
@@ -8949,6 +8987,23 @@ (define_insn "sse_cvtss2si<rex64namesuffix><round_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse_cvtss2si<round_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (unspec:SI
+            [(vec_select:SF
+              (match_operand:V4SF 1 "<round_zext_nimm_scalar_predicate>" "v,<round_zext_constraint2>")
+              (parallel [(const_int 0)]))]
+            UNSPEC_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_SSE"
+  "%vcvtss2si{l}\t{<round_zext_op2>%1, %k0|%k0, %k1<round_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "sse_cvtss2si<rex64namesuffix>_2"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48 [(match_operand:SF 1 "nonimmediate_operand" "v,m")]
@@ -8963,6 +9018,22 @@ (define_insn "sse_cvtss2si<rex64namesuffix>_2"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse_cvtss2si_2_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:SF 1 "nonimmediate_operand" "v,m")]
+            UNSPEC_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_SSE"
+  "%vcvtss2si{l}\t{%1, %0|%0, %1}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "unspec_sse_cvttss2si<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48
@@ -8978,6 +9049,22 @@ (define_insn "unspec_sse_cvttss2si<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*unspec_sse_cvttss2si<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:V4SF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "v,<round_saeonly_zext_constraint>")]
+            UNSPEC_VCVTT)))]
+  "TARGET_64BIT && TARGET_SSE"
+  "%vcvttss2si{l}\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "sse_cvttss2si<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(fix:SWI48
@@ -8994,6 +9081,23 @@ (define_insn "sse_cvttss2si<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse_cvttss2si<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (fix:SI
+            (vec_select:SF
+              (match_operand:V4SF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "v,<round_saeonly_zext_constraint>")
+              (parallel [(const_int 0)])))))]
+  "TARGET_64BIT && TARGET_SSE"
+  "%vcvttss2si{l}\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "cvtusi2<ssescalarmodesuffix>32<round_name>"
   [(set (match_operand:VF_128 0 "register_operand" "=v")
 	(vec_merge:VF_128
@@ -9418,6 +9522,20 @@ (define_insn "avx512f_vcvtss2usi<rex64namesuffix><round_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512f_vcvtss2usi<round_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(vec_select:SF
+              (match_operand:V4SF 1 "<round_zext_nimm_predicate>" "<round_zext_constraint>")
+              (parallel [(const_int 0)]))]
+            UNSPEC_UNSIGNED_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvtss2usi\t{<round_zext_op2>%1, %k0|%k0, %k1<round_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "unspec_avx512f_vcvttss2usi<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(unspec:SWI48
@@ -9429,6 +9547,18 @@ (define_insn "unspec_avx512f_vcvttss2usi<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*unspec_avx512f_vcvttss2usi<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:V4SF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")]
+            UNSPEC_VCVTTU)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvttss2usi\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "avx512f_vcvttss2usi<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(unsigned_fix:SWI48
@@ -9441,6 +9571,19 @@ (define_insn "avx512f_vcvttss2usi<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512f_vcvttss2usi<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unsigned_fix:SI
+            (vec_select:SF
+              (match_operand:V4SF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")
+              (parallel [(const_int 0)])))))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvttss2usi\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "avx512f_vcvtsd2usi<rex64namesuffix><round_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(unspec:SWI48
@@ -9454,6 +9597,20 @@ (define_insn "avx512f_vcvtsd2usi<rex64namesuffix><round_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512f_vcvtsd2usi<round_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(vec_select:DF
+              (match_operand:V2DF 1 "<round_zext_nimm_predicate>" "<round_zext_constraint>")
+              (parallel [(const_int 0)]))]
+            UNSPEC_UNSIGNED_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvtsd2usi\t{<round_zext_op2>%1, %k0|%k0, %q1<round_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "unspec_avx512f_vcvttsd2usi<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(unspec:SWI48
@@ -9465,6 +9622,18 @@ (define_insn "unspec_avx512f_vcvttsd2usi<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*unspec_avx512f_vcvttsd2usi<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unspec:SI
+            [(match_operand:V2DF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")]
+            UNSPEC_VCVTTU)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvttsd2usi\t{<round_saeonly_zext_op2>%1, %k0|%k0, %q1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "avx512f_vcvttsd2usi<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
 	(unsigned_fix:SWI48
@@ -9477,6 +9646,19 @@ (define_insn "avx512f_vcvttsd2usi<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx512f_vcvttsd2usi<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+        (zero_extend:DI
+          (unsigned_fix:SI
+            (vec_select:DF
+              (match_operand:V2DF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")
+              (parallel [(const_int 0)])))))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  "vcvttsd2usi\t{<round_saeonly_zext_op2>%1, %k0|%k0, %q1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "SI")])
+
 (define_insn "sse2_cvtsd2si<rex64namesuffix><round_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48
@@ -9494,6 +9676,24 @@ (define_insn "sse2_cvtsd2si<rex64namesuffix><round_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse2_cvtsd2si<round_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (unspec:SI
+            [(vec_select:DF
+             (match_operand:V2DF 1 "<round_zext_nimm_scalar_predicate>" "v,<round_zext_constraint2>")
+             (parallel [(const_int 0)]))]
+            UNSPEC_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_SSE2"
+  "%vcvtsd2si{l}\t{<round_zext_op2>%1, %k0|%k0, %q1<round_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "btver2_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "sse2_cvtsd2si<rex64namesuffix>_2"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48 [(match_operand:DF 1 "nonimmediate_operand" "v,m")]
@@ -9508,6 +9708,21 @@ (define_insn "sse2_cvtsd2si<rex64namesuffix>_2"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse2_cvtsd2si_2_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (unspec:SWI48 [(match_operand:DF 1 "nonimmediate_operand" "v,m")]
+                        UNSPEC_FIX_NOTRUNC)))]
+  "TARGET_64BIT && TARGET_SSE2"
+  "%vcvtsd2si{l}\t{%1, %k0|%k0, %q1}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "unspec_sse2_cvttsd2si<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(unspec:SWI48
@@ -9524,6 +9739,23 @@ (define_insn "unspec_sse2_cvttsd2si<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*unspec_sse2_cvttsd2si<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+           (unspec:SI
+             [(match_operand:V2DF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "v,<round_saeonly_zext_constraint2>")]
+             UNSPEC_VCVTT)))]
+  "TARGET_64BIT && TARGET_SSE2"
+  "%vcvttsd2si{l}\t{<round_saeonly_zext_op2>%1, %k0|%k0, %q1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "btver2_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 (define_insn "sse2_cvttsd2si<rex64namesuffix><round_saeonly_name>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
 	(fix:SWI48
@@ -9541,6 +9773,24 @@ (define_insn "sse2_cvttsd2si<rex64namesuffix><round_saeonly_name>"
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*sse2_cvttsd2si<round_saeonly_zext_name>"
+  [(set (match_operand:DI 0 "register_operand" "=r,r")
+        (zero_extend:DI
+          (fix:SWI48
+            (vec_select:DF
+              (match_operand:V2DF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "v,<round_saeonly_zext_constraint2>")
+              (parallel [(const_int 0)])))))]
+  "TARGET_64BIT && TARGET_SSE2"
+  "%vcvttsd2si{l}\t{<round_saeonly_zext_op2>%1, %k0|%k0, %q1<round_saeonly_zext_op2>}"
+  [(set_attr "type" "sseicvt")
+   (set_attr "athlon_decode" "double,vector")
+   (set_attr "amdfam10_decode" "double,double")
+   (set_attr "bdver1_decode" "double,double")
+   (set_attr "btver2_decode" "double,double")
+   (set_attr "prefix_rep" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "SI")])
+
 ;; For float<si2dfmode><mode>2 insn pattern
 (define_mode_attr si2dfmode
   [(V8DF "V8SI") (V4DF "V4SI")])
@@ -33691,6 +33941,20 @@ (define_insn "avx10_2_vcvttsd2<sat_cvt_sign_prefix>sis<mode><round_saeonly_name>
  (set_attr "prefix" "evex")
  (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx10_2_vcvttsd2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+       (zero_extend:DI
+         (unspec:SI
+           [(vec_select:DF
+              (match_operand:V2DF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")
+              (parallel [(const_int 0)]))]
+           UNSPEC_SAT_CVT_DS_SIGN_ITER)))]
+ "TARGET_64BIT && TARGET_AVX10_2"
+ "vcvttsd2<sat_cvt_sign_prefix>sis\t{<round_saeonly_zext_op2>%1, %k0|%k0, %q1<round_saeonly_zext_op2>}"
+ [(set_attr "type" "ssecvt")
+ (set_attr "prefix" "evex")
+ (set_attr "mode" "SI")])
+
 (define_insn "avx10_2_vcvttss2<sat_cvt_sign_prefix>sis<mode><round_saeonly_name>"
  [(set (match_operand:SWI48 0 "register_operand" "=r")
    (unspec:SWI48
@@ -33704,6 +33968,20 @@ (define_insn "avx10_2_vcvttss2<sat_cvt_sign_prefix>sis<mode><round_saeonly_name>
  (set_attr "prefix" "evex")
  (set_attr "mode" "<MODE>")])
 
+(define_insn "*avx10_2_vcvttss2<sat_cvt_sign_prefix>sissi<round_saeonly_zext_name>"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+       (zero_extend:DI
+         (unspec:SI
+           [(vec_select:SF
+              (match_operand:V4SF 1 "<round_saeonly_zext_nimm_scalar_predicate>" "<round_saeonly_zext_constraint>")
+              (parallel [(const_int 0)]))]
+           UNSPEC_SAT_CVT_DS_SIGN_ITER)))]
+ "TARGET_64BIT && TARGET_AVX10_2"
+ "vcvttss2<sat_cvt_sign_prefix>sis\t{<round_saeonly_zext_op2>%1, %k0|%k0, %k1<round_saeonly_zext_op2>}"
+ [(set_attr "type" "ssecvt")
+ (set_attr "prefix" "evex")
+ (set_attr "mode" "SI")])
+
 (define_insn "avx10_2_minmaxbf16_<mode><mask_name>"
   [(set (match_operand:VBF 0 "register_operand" "=v")
     (unspec:VBF
diff --git a/gcc/config/i386/subst.md b/gcc/config/i386/subst.md
index 454f0989f07..511fd6ad5c2 100644
--- a/gcc/config/i386/subst.md
+++ b/gcc/config/i386/subst.md
@@ -482,3 +482,42 @@ (define_subst "maskz_half"
 	  (match_dup 1)
 	  (match_operand:SUBST_V 2 "const0_operand")
 	  (match_operand:<avx512fmaskhalfmode> 3 "register_operand" "Yk")))])
+
+(define_subst_attr "round_zext_name" "round_zext" "_zext" "_round_zext")
+(define_subst_attr "round_zext_constraint" "round_zext" "vm" "v")
+(define_subst_attr "round_zext_constraint2" "round_zext" "m" "v")
+(define_subst_attr "round_zext_nimm_predicate" "round_zext" "vector_operand" "register_operand")
+(define_subst_attr "round_zext_nimm_scalar_predicate" "round_zext" "nonimmediate_operand" "register_operand")
+(define_subst_attr "round_zext_op2" "round_zext" "" "%R2")
+
+(define_subst "round_zext"
+  [(set (match_operand:DI 0)
+        (zero_extend:DI
+          (match_operand:SI 1)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  [(set (match_dup 0)
+        (zero_extend:DI
+           (unspec:SI
+              [(match_dup 1)
+               (match_operand:SI 2 "const_4_or_8_to_11_operand")]
+              UNSPEC_EMBEDDED_ROUNDING)))
+])
+
+(define_subst_attr "round_saeonly_zext_name" "round_saeonly_zext" "_zext" "_round_zext")
+(define_subst_attr "round_saeonly_zext_constraint" "round_saeonly_zext" "vm" "v")
+(define_subst_attr "round_saeonly_zext_constraint2" "round_saeonly_zext" "m" "v")
+(define_subst_attr "round_saeonly_zext_nimm_scalar_predicate" "round_saeonly_zext" "nonimmediate_operand" "register_operand")
+(define_subst_attr "round_saeonly_zext_op2" "round_saeonly_zext" "" "%r2")
+
+(define_subst "round_saeonly_zext"
+  [(set (match_operand:DI 0)
+        (zero_extend:DI
+          (match_operand:SI 1)))]
+  "TARGET_64BIT && TARGET_AVX512F"
+  [(set (match_dup 0)
+        (zero_extend:DI
+           (unspec:SI
+              [(match_dup 1)
+               (match_operand:SI 2 "const48_operand")]
+              UNSPEC_EMBEDDED_ROUNDING)))
+])
diff --git a/gcc/testsuite/gcc.target/i386/zext-avx10-1.c b/gcc/testsuite/gcc.target/i386/zext-avx10-1.c
new file mode 100644
index 00000000000..66f28125fff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zext-avx10-1.c
@@ -0,0 +1,139 @@
+/* PR target/126231  */
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64-v4 -mavx10.2" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+#include <x86intrin.h>
+
+/*
+**func1:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2usis	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func1 (__m128 x)
+{
+  return _mm_cvtts_ss_epu32 (x);
+}
+
+/*
+**func2:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2usis	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func2 (__m128 x)
+{
+  return _mm_cvtts_roundss_epu32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func3:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2sis	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func3 (__m128 x)
+{
+  return (unsigned int) _mm_cvtts_ss_epi32 (x);
+}
+
+/*
+**func4:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2sis	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func4 (__m128 x)
+{
+  return (unsigned int) _mm_cvtts_roundss_epi32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func5:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2usis	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func5 (__m128d x)
+{
+  return _mm_cvtts_sd_epu32 (x);
+}
+
+/*
+**func6:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2usis	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func6 (__m128d x)
+{
+  return _mm_cvtts_roundsd_epu32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func7:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2sis	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func7 (__m128d x)
+{
+  return (unsigned int) _mm_cvtts_sd_epi32 (x);
+}
+
+/*
+**func8:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2sis	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func8 (__m128d x)
+{
+  return (unsigned int) _mm_cvtts_roundsd_epi32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/zext-avx512f-1.c b/gcc/testsuite/gcc.target/i386/zext-avx512f-1.c
new file mode 100644
index 00000000000..deae5e487e8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zext-avx512f-1.c
@@ -0,0 +1,241 @@
+/* PR target/126231  */
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64-v4" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+#include <x86intrin.h>
+
+/*
+**func1:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func1 (__m128 x)
+{
+  return (unsigned int) _mm_cvttss_i32 (x);
+}
+
+/*
+**func2:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2sil	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func2 (__m128 x)
+{
+  return (unsigned int) _mm_cvtt_roundss_i32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func3:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtss2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func3 (__m128 x)
+{
+  return (unsigned int) _mm_cvtss_u32 (x);
+}
+
+/*
+**func4:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func4 (__m128 x)
+{
+  return (unsigned int) _mm_cvttss_u32 (x);
+}
+
+/*
+**func5:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttss2usi	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func5 (__m128 x)
+{
+  return (unsigned int) _mm_cvtt_roundss_u32 
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func6:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func6 (__m128d x)
+{
+  return (unsigned int) _mm_cvttsd_u32 (x);
+}
+
+/*
+**func7:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsd2usi	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func7 (__m128d x)
+{
+  return (unsigned int) _mm_cvtt_roundsd_u32 
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func8:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsd2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func8 (__m128d x)
+{
+  return (unsigned int) _mm_cvtsd_u32 (x);
+}
+
+/*
+**func9:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsd2usi	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func9 (__m128d x)
+{
+  return (unsigned int) _mm_cvt_roundsd_u32 
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+
+/*
+**func10:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsd2sil	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func10 (__m128d x)
+{
+  return (unsigned int) _mm_cvt_roundsd_si32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func11:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsd2sil	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func11 (__m128d x)
+{
+  return (unsigned int) _mm_cvt_roundsd_i32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func12:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtss2usi	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func12 (__m128 x)
+{
+  return (unsigned int) _mm_cvt_roundss_u32 
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func13:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtss2sil	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func13 (__m128 x)
+{
+  return (unsigned int) _mm_cvt_roundss_si32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func14:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtss2sil	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func14 (__m128 x)
+{
+  return (unsigned int) _mm_cvt_roundss_i32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/zext-avx512fp16-1.c b/gcc/testsuite/gcc.target/i386/zext-avx512fp16-1.c
new file mode 100644
index 00000000000..a4e50c4f6d8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zext-avx512fp16-1.c
@@ -0,0 +1,139 @@
+/* PR target/126231  */
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64-v4 -mavx512fp16" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+#include <x86intrin.h>
+
+/*
+**func1:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsh2si	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func1 (__m128h x)
+{
+  return (unsigned int) _mm_cvtsh_i32 (x);
+}
+
+/*
+**func2:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsh2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func2 (__m128h x)
+{
+  return _mm_cvtsh_u32 (x);
+}
+
+/*
+**func3:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsh2si	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func3 (__m128h x)
+{
+  return (unsigned int) _mm_cvttsh_i32 (x);
+}
+
+/*
+**func4:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsh2usi	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func4 (__m128h x)
+{
+  return _mm_cvttsh_u32 (x);
+}
+
+/*
+**func5:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsh2usi	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func5 (__m128h x)
+{
+  return _mm_cvt_roundsh_u32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func6:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvtsh2si	\{rn-sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func6 (__m128h x)
+{
+  return (unsigned int) _mm_cvt_roundsh_i32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func7:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsh2usi	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func7 (__m128h x)
+{
+  return _mm_cvtt_roundsh_u32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+
+/*
+**func8:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	vcvttsh2si	\{sae\}, %xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func8 (__m128h x)
+{
+  return (unsigned int) _mm_cvtt_roundsh_i32
+    (x, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/zext-sse-1.c b/gcc/testsuite/gcc.target/i386/zext-sse-1.c
new file mode 100644
index 00000000000..0965c89ddf4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zext-sse-1.c
@@ -0,0 +1,103 @@
+/* PR target/126231  */
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+#include <emmintrin.h>
+
+/*
+**func1:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttss2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func1 (float x)
+{
+  return (unsigned int) x;
+}
+
+/*
+**func2:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttsd2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func2 (double x)
+{
+  return (unsigned int) x;
+}
+
+/*
+**func3:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttss2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func3 (__m128 x)
+{
+  return (unsigned int) _mm_cvttss_si32 (x);
+}
+
+/*
+**func4:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvtss2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func4 (__m128 x)
+{
+  return (unsigned int) _mm_cvtss_si32 (x);
+}
+
+/*
+**func5:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttsd2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func5 (__m128d x)
+{
+  return (unsigned int) _mm_cvttsd_si32 (x);
+}
+
+/*
+**func6:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvtsd2sil	%xmm0, %eax
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+unsigned long long
+func6 (__m128d x)
+{
+  return (unsigned int) _mm_cvtsd_si32 (x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/zext-sse-2.c b/gcc/testsuite/gcc.target/i386/zext-sse-2.c
new file mode 100644
index 00000000000..7d917cfd5de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zext-sse-2.c
@@ -0,0 +1,68 @@
+/* PR target/126231  */
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+struct foo
+{
+  int i;
+  int j;
+  int k;
+};
+
+struct bar1
+{
+  double x;
+  double y;
+  double z;
+};
+
+struct bar2
+{
+  float x;
+  float y;
+  float z;
+};
+
+/*
+**func1:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttsd2sil	16\(%rdi\), %ecx
+**	movupd	\(%rdi\), %xmm1
+**	cvttpd2dq	%xmm1, %xmm0
+**	movq	%xmm0, %rax
+**	movq	%rcx, %rdx
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+struct foo
+func1 (struct bar1 *x)
+{ 
+  return (struct foo) { x->x, x->y, x->z };
+}
+
+/*
+**func2:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	cvttss2sil	8\(%rdi\), %eax
+**	movq	\(%rdi\), %xmm0
+**	cvttps2dq	%xmm0, %xmm0
+**	movq	%xmm0, %rsi
+**	movq	%rax, %rdi
+**	movq	%rsi, %rax
+**	movq	%rdi, %rdx
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+struct foo
+func2 (struct bar2 *x)
+{ 
+  return (struct foo) { x->x, x->y, x->z };
+}
-- 
2.55.0

Reply via email to