S/390: Fix matching setmem_long_and*.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Fri, 27 Jan 2017 08:07:26 +0000 (08:07 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 27 Jan 2017 08:07:26 +0000 (08:07 +0000)
The attached patch reactivates the setmem_long_and* patterns on S/390
that have not been generated for a while.

gcc/ChangeLog:

2017-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>

* config/s390/s390.md ("*setmem_long_and")
("*setmem_long_and_31z"): Use zero_extend instead of and.

gcc/testsuite/ChangeLog:

2017-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>

* gcc.target/s390/md/setmem_long-1.c: Remove xfail, skip with -O0.

From-SVN: r244963

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/md/setmem_long-1.c

index c625d7bdb76c82925cb16077ca14fb5b96fcb3ea..e288fd5dae712f292c20bcd96b3cecf3f4aa77a6 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * config/s390/s390.md ("*setmem_long_and")
+       ("*setmem_long_and_31z"): Use zero_extend instead of and.
+
 2017-01-26  Martin Sebor  <msebor@redhat.com>
 
        * gimple-ssa-sprintf.c (format_floating): Simplify the computation
index ee7ca7398d47448ef34148e47c22f9cf980aa46f..31351756a50039cef90ba5629d94314be562594c 100644 (file)
 (define_insn "*setmem_long_and"
   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
-        (unspec:BLK [(and:P
-                     (match_operand:P 2 "setmem_operand" "Y")
-                     (match_operand:P 4 "const_int_operand"             "n"))
+        (unspec:BLK [(zero_extend:P (match_operand:QI 2 "setmem_operand" "Y"))
                    (subreg:P (match_dup 3) <modesize>)]
                    UNSPEC_REPLICATE_BYTE))
    (use (match_operand:<DBL> 1 "register_operand" "d"))
    (clobber (reg:CC CC_REGNUM))]
-  "(TARGET_64BIT || !TARGET_ZARCH) &&
-   (INTVAL (operands[4]) & 255) == 255"
+  "(TARGET_64BIT || !TARGET_ZARCH)"
   "mvcle\t%0,%1,%Y2\;jo\t.-4"
   [(set_attr "length" "8")
    (set_attr "type" "vs")])
 (define_insn "*setmem_long_and_31z"
   [(clobber (match_operand:TI 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
-        (unspec:BLK [(and:SI
-                     (match_operand:SI 2 "setmem_operand" "Y")
-                     (match_operand:SI 4 "const_int_operand" "n"))
+        (unspec:BLK [(zero_extend:SI (match_operand:QI 2 "setmem_operand" "Y"))
                    (subreg:SI (match_dup 3) 12)] UNSPEC_REPLICATE_BYTE))
    (use (match_operand:TI 1 "register_operand" "d"))
    (clobber (reg:CC CC_REGNUM))]
-  "(!TARGET_64BIT && TARGET_ZARCH) &&
-   (INTVAL (operands[4]) & 255) == 255"
+  "(!TARGET_64BIT && TARGET_ZARCH)"
   "mvcle\t%0,%1,%Y2\;jo\t.-4"
   [(set_attr "length" "8")
    (set_attr "type" "vs")])
index 71ef013f098915d6d8f1184c6b54010bdb8cea32..85425e47d60b8912b0d1476a8963a36b6feb5028 100644 (file)
@@ -1,3 +1,7 @@
+2017-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * gcc.target/s390/md/setmem_long-1.c: Remove xfail, skip with -O0.
+
 2017-01-27  Adam Butcher  <adam@jessamine.co.uk>
 
        PR c++/64382
index 5fc54e2108f6fbab22c5c052b7e5637e3288b06d..dec7197cfa9a7457491e9452578b9effec18db23 100644 (file)
@@ -4,6 +4,12 @@
 /* { dg-options "-mmvcle -dP -save-temps" } */
 /* { dg-do run { target { s390_useable_hw } } } */
 
+/* Skip test if -O0 is present on the command line or -O... is missing:
+
+    { dg-skip-if "" { *-*-* } { "-march=z9*" "-O0" } { "" } }
+    { dg-skip-if "" { *-*-* } { "*" } { "-O*" } }
+*/
+
 __attribute__ ((noinline))
 void test(char *p, char c, int len)
 {
@@ -17,8 +23,8 @@ void test2(char *p, int c, int len)
 }
 
 /* Check that the right patterns are used.  */
-/* { dg-final { scan-assembler-times {c"?:10 .*{[*]setmem_long_?3?1?z?}} 1 } } */
-/* { dg-final { scan-assembler-times {c"?:16 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times {c"?:16 .*{[*]setmem_long_?3?1?z?}} 1 } } */
+/* { dg-final { scan-assembler-times {c"?:22 .*{[*]setmem_long_and_?3?1?z?}} 1 } } */
 
 #define LEN 500
 char buf[LEN + 2];