From: H.J. Lu Date: Wed, 15 Jul 2026 23:30:31 +0000 (+0800) Subject: x86-64: Add *fix_truncsi_sse_2_zext X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=368ef32ae78804c7c4fc8f021db337e0e63576b2;p=thirdparty%2Fgcc.git x86-64: Add *fix_truncsi_sse_2_zext We expand unsigned long long func (float x) { return (unsigned int) x; } to (insn 6 5 7 (set (reg:DI 103) (fix:DI (reg/v:SF 100 [ x ]))) "x.c":4:10 -1 (nil)) (insn 7 6 8 (set (reg:SI 102 [ _1 ]) (subreg:SI (reg:DI 103) 0)) "x.c":4:10 -1 (nil)) (insn 8 7 9 (set (reg:DI 101 [ _3 ]) (zero_extend:DI (reg:SI 102 [ _1 ]))) "x.c":4:10 -1 (nil)) Add *fix_truncsi_sse_2_zext so that combine can generate: (insn 8 6 13 2 (set (reg:DI 101 [ _3 ]) (zero_extend:DI (subreg:SI (fix:DI (reg:SF 104 [ x ])) 0))) "x.c":4:10 235 {*fix_truncsfsi_sse_2_zext} (expr_list:REG_DEAD (reg:SF 104 [ x ]) (nil))) This fixes FAIL: gcc.target/i386/zext-sse-1.c check-function-bodies func1 FAIL: gcc.target/i386/zext-sse-1.c check-function-bodies func2 PR target/126231 * config/i386/i386.md (*fix_truncsi_sse_2_zext): New. Signed-off-by: H.J. Lu --- diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index f6bfde1f4ed..3aa8c926094 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -6084,6 +6084,23 @@ (set_attr "amdfam10_decode" "double,double") (set_attr "bdver1_decode" "double,double")]) +(define_insn "*fix_truncsi_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) + && (!TARGET_FISTTP || TARGET_SSE_MATH)" + "%vcvtt2si{l}\t{%1, %k0|%k0, %1}" + [(set_attr "type" "sseicvt") + (set_attr "prefix" "maybe_vex") + (set_attr "prefix_rex" "*") + (set_attr "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")