From 2b8568fe565d23e8cb9f02334d81c21428eb7cd3 Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Mon, 11 Jan 2016 14:44:22 +0000 Subject: [PATCH] [AArch64] PR rtl-optimization/68796: Add patterns for QImode and HImode comparison with zero PR rtl-optimization/68796 * config/aarch64/aarch64.md (*and_compare0): New pattern. * config/aarch64/aarch64.c (aarch64_select_cc_mode): Handle HImode and QImode comparisons against zero with CC_NZmode. * config/aarch64/iterators.md (short_mask): New mode_attr. * gcc.target/aarch64/tst_5.c: New test. * gcc.target/aarch64/tst_6.c: Likewise. From-SVN: r232228 --- gcc/ChangeLog | 8 ++++++++ gcc/config/aarch64/aarch64.c | 7 +++++++ gcc/config/aarch64/aarch64.md | 10 ++++++++++ gcc/config/aarch64/iterators.md | 2 ++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.target/aarch64/tst_5.c | 21 +++++++++++++++++++++ gcc/testsuite/gcc.target/aarch64/tst_6.c | 10 ++++++++++ 7 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/tst_5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/tst_6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ffe643e6084d..74875108f047 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-01-11 Kyrylo Tkachov + + PR rtl-optimization/68796 + * config/aarch64/aarch64.md (*and_compare0): New pattern. + * config/aarch64/aarch64.c (aarch64_select_cc_mode): Handle HImode + and QImode comparisons against zero with CC_NZmode. + * config/aarch64/iterators.md (short_mask): New mode_attr. + 2016-01-11 H.J. Lu * config/i386/sse.md (_load_mask): Remove diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 9142ac0885f7..6853b0abebd2 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -4142,6 +4142,13 @@ aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y) } } + /* Equality comparisons of short modes against zero can be performed + using the TST instruction with the appropriate bitmask. */ + if (y == const0_rtx && REG_P (x) + && (code == EQ || code == NE) + && (GET_MODE (x) == HImode || GET_MODE (x) == QImode)) + return CC_NZmode; + if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode) && y == const0_rtx && (code == EQ || code == NE || code == LT || code == GE) diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index d40c02a7d517..f6c8eb1d9fa4 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3672,6 +3672,16 @@ } ) +(define_insn "*and_compare0" + [(set (reg:CC_NZ CC_REGNUM) + (compare:CC_NZ + (match_operand:SHORT 0 "register_operand" "r") + (const_int 0)))] + "" + "tst\\t%0, " + [(set_attr "type" "alus_imm")] +) + (define_insn "*and3nr_compare0" [(set (reg:CC_NZ CC_REGNUM) (compare:CC_NZ diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 549d47a7a5d8..49598a2cd935 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -345,6 +345,8 @@ (define_mode_attr w1 [(SF "w") (DF "x")]) (define_mode_attr w2 [(SF "x") (DF "w")]) +(define_mode_attr short_mask [(HI "65535") (QI "255")]) + ;; For constraints used in scalar immediate vector moves (define_mode_attr hq [(HI "h") (QI "q")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8157e439c963..6366b495bceb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-01-11 Kyrylo Tkachov + + PR rtl-optimization/68796 + * gcc.target/aarch64/tst_5.c: New test. + * gcc.target/aarch64/tst_6.c: Likewise. + 2016-01-11 Kyrylo Tkachov PR rtl-optimization/68841 diff --git a/gcc/testsuite/gcc.target/aarch64/tst_5.c b/gcc/testsuite/gcc.target/aarch64/tst_5.c new file mode 100644 index 000000000000..0de40a6c47a7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/tst_5.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int +f255 (int x) +{ + if (x & 255) + return 1; + return x; +} + +int +f65535 (int x) +{ + if (x & 65535) + return 1; + return x; +} + +/* { dg-final { scan-assembler "tst\t(x|w)\[0-9\]+,\[ \t\]*255" } } */ +/* { dg-final { scan-assembler "tst\t(x|w)\[0-9\]+,\[ \t\]*65535" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/tst_6.c b/gcc/testsuite/gcc.target/aarch64/tst_6.c new file mode 100644 index 000000000000..f15ec114c391 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/tst_6.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int +foo (long x) +{ + return ((short) x != 0) ? x : 1; +} + +/* { dg-final { scan-assembler "tst\t(x|w)\[0-9\]+,\[ \t\]*65535" } } */ -- 2.47.2