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 e8e25759c57..fe63239f53f 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" "=Yx,Yy")
+ (float:V2SF
+ (match_operand:V2SI 1 "register_operand" "Yx,Yy")))]
+ "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" "=Yy")
+ (fix:V2SI (match_operand:V2SF 1 "register_operand" "Yy")))]
+ "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