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
