From d876f5cd0272d7d7d6842703d59a130bdaf72cca Mon Sep 17 00:00:00 2001 From: Dominik Vogt Date: Fri, 27 Jan 2017 08:07:26 +0000 Subject: [PATCH] S/390: Fix matching setmem_long_and*. 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 * 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 * gcc.target/s390/md/setmem_long-1.c: Remove xfail, skip with -O0. From-SVN: r244963 --- gcc/ChangeLog | 5 +++++ gcc/config/s390/s390.md | 14 ++++---------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/s390/md/setmem_long-1.c | 10 ++++++++-- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c625d7bdb76..e288fd5dae7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-01-27 Dominik Vogt + + * config/s390/s390.md ("*setmem_long_and") + ("*setmem_long_and_31z"): Use zero_extend instead of and. + 2017-01-26 Martin Sebor * gimple-ssa-sprintf.c (format_floating): Simplify the computation diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index ee7ca7398d4..31351756a50 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -3402,15 +3402,12 @@ (define_insn "*setmem_long_and" [(clobber (match_operand: 0 "register_operand" "=d")) (set (mem:BLK (subreg:P (match_operand: 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) )] UNSPEC_REPLICATE_BYTE)) (use (match_operand: 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")]) @@ -3433,14 +3430,11 @@ (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")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 71ef013f098..85425e47d60 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-01-27 Dominik Vogt + + * gcc.target/s390/md/setmem_long-1.c: Remove xfail, skip with -O0. + 2017-01-27 Adam Butcher PR c++/64382 diff --git a/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c b/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c index 5fc54e2108f..dec7197cfa9 100644 --- a/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c +++ b/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c @@ -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]; -- 2.30.2