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
