In 64-bit mode, implement V2SF <-> V2SI conversions with SEE. Only SSE register source operand is allowed.
gcc/ PR target/89028 * config/i386/sse.md (floatv2siv2sf2): New. (fix_truncv2sfv2si2): Likewise. gcc/testsuite/ PR target/89028 * gcc.target/i386/pr89028-8.c: New test. * gcc.target/i386/pr89028-9.c: Likewise. --- gcc/config/i386/sse.md | 31 +++++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr89028-8.c | 12 +++++++++ gcc/testsuite/gcc.target/i386/pr89028-9.c | 12 +++++++++ 3 files changed, 55 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr89028-8.c create mode 100644 gcc/testsuite/gcc.target/i386/pr89028-9.c diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 018b1dca984..74c614a9f31 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4897,6 +4897,17 @@ (set_attr "prefix" "maybe_vex") (set_attr "mode" "<sseinsnmode>")]) +(define_insn "floatv2siv2sf2" + [(set (match_operand:V2SF 0 "register_operand" "=x,Yv") + (float:V2SF + (match_operand:V2SI 1 "register_operand" "x,Yv")))] + "TARGET_MMX_WITH_SSE" + "%vcvtdq2ps\t{%1, %0|%0, %1}" + [(set_attr "isa" "noavx,avx") + (set_attr "type" "ssecvt") + (set_attr "prefix" "maybe_vex") + (set_attr "mode" "V4SF")]) + (define_insn "ufloat<sseintvecmodelower><mode>2<mask_name><round_name>" [(set (match_operand:VF1_AVX512VL 0 "register_operand" "=v") (unsigned_float:VF1_AVX512VL @@ -5056,6 +5067,26 @@ (set_attr "prefix" "<mask_prefix2>") (set_attr "mode" "TI")]) +(define_insn "fix_truncv2sfv2si2" + [(set (match_operand:V2SI 0 "register_operand" "=Yv") + (fix:V2SI (match_operand:V2SF 1 "register_operand" "Yv")))] + "TARGET_MMX_WITH_SSE" + "%vcvttps2dq\t{%1, %0|%0, %1}" + [(set_attr "type" "ssecvt") + (set (attr "prefix_rep") + (if_then_else + (match_test "TARGET_AVX") + (const_string "*") + (const_string "1"))) + (set (attr "prefix_data16") + (if_then_else + (match_test "TARGET_AVX") + (const_string "*") + (const_string "0"))) + (set_attr "prefix_data16" "0") + (set_attr "prefix" "maybe_evex") + (set_attr "mode" "TI")]) + (define_expand "fixuns_trunc<mode><sseintvecmodelower>2" [(match_operand:<sseintvecmode> 0 "register_operand") (match_operand:VF1 1 "register_operand")] diff --git a/gcc/testsuite/gcc.target/i386/pr89028-8.c b/gcc/testsuite/gcc.target/i386/pr89028-8.c new file mode 100644 index 00000000000..35cdf1ed332 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89028-8.c @@ -0,0 +1,12 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-O2 -msse2 -mno-mmx" } */ +/* { dg-final { scan-assembler-times "cvttps2dq" 1 } } */ + +typedef int __v2si __attribute__ ((__vector_size__ (8))); +typedef float __v2sf __attribute__ ((__vector_size__ (8))); + +__v2si +foo1 ( __v2sf x) +{ + return __builtin_convertvector (x, __v2si); +} diff --git a/gcc/testsuite/gcc.target/i386/pr89028-9.c b/gcc/testsuite/gcc.target/i386/pr89028-9.c new file mode 100644 index 00000000000..17242c0402d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89028-9.c @@ -0,0 +1,12 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-O2 -msse2 -mno-mmx" } */ +/* { dg-final { scan-assembler-times "cvtdq2ps" 1 } } */ + +typedef int __v2si __attribute__ ((__vector_size__ (8))); +typedef float __v2sf __attribute__ ((__vector_size__ (8))); + +__v2sf +foo1 ( __v2si x) +{ + return __builtin_convertvector (x, __v2sf); +} -- 2.20.1