aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2019-08-01 20:07:19 +0200
committerUros Bizjak <uros@gcc.gnu.org>2019-08-01 20:07:19 +0200
commit45230a4019ed9f03ea63b3c25c8e4a9b9897dc98 (patch)
tree846cd19642d4e5d006fdbede5ef27ecfdbf9e693 /gcc
parentce529ffca708a635f434a99bf082dec2a1ba0446 (diff)
downloadgcc-45230a4019ed9f03ea63b3c25c8e4a9b9897dc98.zip
gcc-45230a4019ed9f03ea63b3c25c8e4a9b9897dc98.tar.gz
gcc-45230a4019ed9f03ea63b3c25c8e4a9b9897dc98.tar.bz2
re PR tree-optimization/85693 (Generation of SAD (Sum of Absolute Difference) instruction)
PR target/85693 * config/i386/mmx.md (usadv8qi): New expander. testsuite/ChangeLog: PR target/85693 * gcc.target/i386/pr85693-1.c: New test. From-SVN: r273981
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/mmx.md15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr85693-1.c21
-rw-r--r--gcc/testsuite/gcc.target/i386/pr85693.c2
5 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dc06ef4..8efcffa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-01 Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/85693
+ * config/i386/mmx.md (usadv8qi): New expander.
+
2019-08-01 Matthew Beliveau <mbelivea@redhat.com>
PR c++/90590
diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index 67bcf5b..3bbf5e0 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -1970,6 +1970,21 @@
DONE;
})
+(define_expand "usadv8qi"
+ [(match_operand:V2SI 0 "register_operand")
+ (match_operand:V8QI 1 "register_operand")
+ (match_operand:V8QI 2 "vector_operand")
+ (match_operand:V2SI 3 "vector_operand")]
+ "TARGET_MMX_WITH_SSE"
+{
+ rtx t1 = gen_reg_rtx (V1DImode);
+ rtx t2 = gen_reg_rtx (V2SImode);
+ emit_insn (gen_mmx_psadbw (t1, operands[1], operands[2]));
+ convert_move (t2, t1, 0);
+ emit_insn (gen_addv2si3 (operands[0], t2, operands[3]));
+ DONE;
+})
+
(define_insn_and_split "mmx_pmovmskb"
[(set (match_operand:SI 0 "register_operand" "=r,r")
(unspec:SI [(match_operand:V8QI 1 "register_operand" "y,x")]
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6b363ac..0b4334a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-01 Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/85693
+ * gcc.target/i386/pr85693-1.c: New test.
+
2019-08-01 Matthew Beliveau <mbelivea@redhat.com>
PR c++/90590
diff --git a/gcc/testsuite/gcc.target/i386/pr85693-1.c b/gcc/testsuite/gcc.target/i386/pr85693-1.c
new file mode 100644
index 0000000..b2bf58d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr85693-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-msse2 -O2 -ftree-vectorize" } */
+
+#define N 8
+
+int abs (int);
+
+unsigned char pix1[N], pix2[N];
+
+int foo (void)
+{
+ int i_sum = 0;
+ int i;
+
+ for (i = 0; i < N; i++)
+ i_sum += abs (pix1[i] - pix2[i]);
+
+ return i_sum;
+}
+
+/* { dg-final { scan-assembler "psadbw" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr85693.c b/gcc/testsuite/gcc.target/i386/pr85693.c
index 214a739..9843ea5 100644
--- a/gcc/testsuite/gcc.target/i386/pr85693.c
+++ b/gcc/testsuite/gcc.target/i386/pr85693.c
@@ -1,4 +1,4 @@
-/* { dg-do compile }
+/* { dg-do compile } */
/* { dg-options "-msse2 -O2 -ftree-vectorize" } */
#define N 1024