Extend predicate of operands[1] from register_operand to vector_operand for andnot...
authorHaochen Jiang <haochen.jiang@intel.com>
Thu, 30 Dec 2021 07:47:58 +0000 (15:47 +0800)
committerliuhongt <hongtao.liu@intel.com>
Tue, 11 Jan 2022 02:10:14 +0000 (10:10 +0800)
This can do optimization like

-       pcmpeqd %xmm0, %xmm0
-       pxor    g(%rip), %xmm0
-       pand    %xmm1, %xmm0
+       movdqa  g(%rip), %xmm0
+       pandn   %xmm1, %xmm0

gcc/ChangeLog:

PR target/53652
* config/i386/sse.md (*andnot<mode>3): Extend predicate of
operands[1] from register_operand to vector_operand.

gcc/testsuite/ChangeLog:

PR target/53652
* gcc.target/i386/pr53652-1.c: New test.

gcc/config/i386/sse.md
gcc/testsuite/gcc.target/i386/pr53652-1.c [new file with mode: 0644]

index d8f3035..0864748 100644 (file)
 (define_insn "*andnot<mode>3"
   [(set (match_operand:VI 0 "register_operand" "=x,x,v")
        (and:VI
-         (not:VI (match_operand:VI 1 "register_operand" "0,x,v"))
+         (not:VI (match_operand:VI 1 "vector_operand" "0,x,v"))
          (match_operand:VI 2 "bcst_vector_operand" "xBm,xm,vmBr")))]
   "TARGET_SSE"
 {
diff --git a/gcc/testsuite/gcc.target/i386/pr53652-1.c b/gcc/testsuite/gcc.target/i386/pr53652-1.c
new file mode 100644 (file)
index 0000000..bd07ee2
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2" } */
+/* { dg-final { scan-assembler-times "pandn\[ \\t\]" 2 } } */
+/* { dg-final { scan-assembler-not "vpternlogq\[ \\t\]" } } */
+
+typedef unsigned long long vec __attribute__((vector_size (16)));
+vec g;
+vec f1 (vec a, vec b)
+{
+  return ~a&b;
+}
+vec f2 (vec a, vec b)
+{
+  return ~g&b;
+}
+