Since ZERO_EXTEND TImode store isn't an SSE to integer register move,
treat it as store.

gcc/

PR target/127020
* config/i386/i386-features.cc
(timode_scalar_chain::compute_convert_gain): Treat ZERO_EXTEND
TImode store as store.

gcc/testsuite/

PR target/127020
* gcc.target/i386/sse4_1-stv-15.c: New file.

-- 
H.J.
From a60b618bed188d5f6a1c00fafa98e145d75e177d Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Tue, 25 Aug 2026 04:13:54 +0800
Subject: [PATCH] x86-64: Treat ZERO_EXTEND TImode store as store

Since ZERO_EXTEND TImode store isn't an SSE to integer register move,
treat it as store.

gcc/

	PR target/127020
	* config/i386/i386-features.cc
	(timode_scalar_chain::compute_convert_gain): Treat ZERO_EXTEND
	TImode store as store.

gcc/testsuite/

	PR target/127020
	* gcc.target/i386/sse4_1-stv-15.c: New file.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386-features.cc              | 12 +++++++++---
 gcc/testsuite/gcc.target/i386/sse4_1-stv-15.c | 14 ++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/sse4_1-stv-15.c

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 824ebfeec9d..74d9f7a6459 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -1922,9 +1922,15 @@ timode_scalar_chain::compute_convert_gain ()
 
 	case ZERO_EXTEND:
 	  if (GET_MODE (XEXP (src, 0)) == DImode)
-	    /* xor (2 bytes) vs. vmovq (5 bytes).  */
-	    igain = speed_p ? COSTS_N_INSNS (1) - ix86_cost->sse_to_integer
-			    : -COSTS_N_BYTES (3);
+	    {
+	      if (MEM_P (dst))
+		/* 2 x movq vs movdqa.  */
+		igain = speed_p ? COSTS_N_INSNS (1) : -COSTS_N_BYTES (3);
+	      else
+		/* xor (2 bytes) vs. vmovq (5 bytes).  */
+		igain = speed_p ? COSTS_N_INSNS (1) - ix86_cost->sse_to_integer
+				: -COSTS_N_BYTES (3);
+	    }
 	  break;
 
 	default:
diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-stv-15.c b/gcc/testsuite/gcc.target/i386/sse4_1-stv-15.c
new file mode 100644
index 00000000000..143335f42be
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/sse4_1-stv-15.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -msse4.1 -mtune=cascadelake -mstv -mno-stackrealign" } */
+
+extern __int128 m0,m1,m2,m3;
+void foo(unsigned long x)
+{
+    __int128 m = x;
+    m0 = m;
+    m1 = m;
+    m2 = m;
+    m3 = m;
+}
+
+/* { dg-final { scan-assembler-times "(movaps|vmovdqa)" 4 } } */
-- 
2.55.0

Reply via email to