2019-09-12  Uroš Bizjak  <ubiz...@gmail.com>

    PR tree-optimization/89386
    * config/i386/sse.md (smulhrs<mode>3): New expander.
    (smulhrsv4hi3): Ditto.

testsuite/ChangeLog:

2019-09-12  Uroš Bizjak  <ubiz...@gmail.com>

    PR tree-optimization/89386
    * gcc.target/i386/pr89386.c: New test.
    * gcc.target/i386/pr89386-1.c: Ditto.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.
Index: gcc/config/i386/sse.md
===================================================================
--- gcc/config/i386/sse.md      (revision 275688)
+++ gcc/config/i386/sse.md      (working copy)
@@ -16475,6 +16475,26 @@
   ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);
 })
 
+(define_expand "smulhrs<mode>3"
+  [(set (match_operand:VI2_AVX2 0 "register_operand")
+       (truncate:VI2_AVX2
+         (lshiftrt:<ssedoublemode>
+           (plus:<ssedoublemode>
+             (lshiftrt:<ssedoublemode>
+               (mult:<ssedoublemode>
+                 (sign_extend:<ssedoublemode>
+                   (match_operand:VI2_AVX2 1 "nonimmediate_operand"))
+                 (sign_extend:<ssedoublemode>
+                   (match_operand:VI2_AVX2 2 "nonimmediate_operand")))
+               (const_int 14))
+             (match_dup 3))
+           (const_int 1))))]
+  "TARGET_SSSE3"
+{
+  operands[3] = CONST1_RTX(<MODE>mode);
+  ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);
+})
+
 (define_insn "*<ssse3_avx2>_pmulhrsw<mode>3<mask_name>"
   [(set (match_operand:VI2_AVX2 0 "register_operand" "=x,x,v")
        (truncate:VI2_AVX2
@@ -16502,6 +16522,26 @@
    (set_attr "prefix" "orig,maybe_evex,evex")
    (set_attr "mode" "<sseinsnmode>")])
 
+(define_expand "smulhrsv4hi3"
+  [(set (match_operand:V4HI 0 "register_operand")
+       (truncate:V4HI
+         (lshiftrt:V4SI
+           (plus:V4SI
+             (lshiftrt:V4SI
+               (mult:V4SI
+                 (sign_extend:V4SI
+                   (match_operand:V4HI 1 "register_operand"))
+                 (sign_extend:V4SI
+                   (match_operand:V4HI 2 "register_operand")))
+               (const_int 14))
+             (match_dup 3))
+           (const_int 1))))]
+  "TARGET_MMX_WITH_SSE && TARGET_SSSE3"
+{
+  operands[3] = CONST1_RTX(V4HImode);
+  ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);
+})
+
 (define_expand "ssse3_pmulhrswv4hi3"
   [(set (match_operand:V4HI 0 "register_operand")
        (truncate:V4HI
Index: gcc/testsuite/gcc.target/i386/pr89386-1.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr89386-1.c   (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr89386-1.c   (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mssse3 -O2 -ftree-vectorize" } */
+
+#define N 4
+
+short a[N], b[N], c[N];
+
+int foo (void)
+{
+  int i;
+
+  for (i = 0; i < N; i++)
+    a[i] = ((((int) b[i] * (int) c[i]) >> 14) + 1) >> 1;
+}
+
+/* { dg-final { scan-assembler "pmulhrsw" } } */
Index: gcc/testsuite/gcc.target/i386/pr89386.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr89386.c     (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr89386.c     (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mssse3 -O2 -ftree-vectorize" } */
+
+#define N 1024
+
+short a[N], b[N], c[N];
+
+int foo (void)
+{
+  int i;
+
+  for (i = 0; i < N; i++)
+    a[i] = ((((int) b[i] * (int) c[i]) >> 14) + 1) >> 1;
+}
+
+/* { dg-final { scan-assembler "pmulhrsw" } } */

Reply via email to