diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2016-01-11 14:44:22 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2016-01-11 14:44:22 +0000 |
commit | 2b8568fe565d23e8cb9f02334d81c21428eb7cd3 (patch) | |
tree | 5f838f445f94024a719619366722b2aa255063b9 /gcc | |
parent | 0d58938ed798882063737dedfe897a9b484295ad (diff) | |
download | gcc-2b8568fe565d23e8cb9f02334d81c21428eb7cd3.zip gcc-2b8568fe565d23e8cb9f02334d81c21428eb7cd3.tar.gz gcc-2b8568fe565d23e8cb9f02334d81c21428eb7cd3.tar.bz2 |
[AArch64] PR rtl-optimization/68796: Add patterns for QImode and HImode comparison with zero
PR rtl-optimization/68796
* config/aarch64/aarch64.md (*and<mode>_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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 7 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 10 | ||||
-rw-r--r-- | gcc/config/aarch64/iterators.md | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/tst_5.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/tst_6.c | 10 |
7 files changed, 64 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ffe643e..7487510 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-01-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR rtl-optimization/68796 + * config/aarch64/aarch64.md (*and<mode>_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 <hongjiu.lu@intel.com> * config/i386/sse.md (<avx512>_load<mode>_mask): Remove diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 9142ac0..6853b0a 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 d40c02a..f6c8eb1 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3672,6 +3672,16 @@ } ) +(define_insn "*and<mode>_compare0" + [(set (reg:CC_NZ CC_REGNUM) + (compare:CC_NZ + (match_operand:SHORT 0 "register_operand" "r") + (const_int 0)))] + "" + "tst\\t%<w>0, <short_mask>" + [(set_attr "type" "alus_imm")] +) + (define_insn "*and<mode>3nr_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 549d47a..49598a2 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 8157e43..6366b49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2016-01-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + PR rtl-optimization/68796 + * gcc.target/aarch64/tst_5.c: New test. + * gcc.target/aarch64/tst_6.c: Likewise. + +2016-01-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + PR rtl-optimization/68841 * gcc.dg/pr68841.c: New test. * gcc.c-torture/execute/pr68841.c: New test. 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 0000000..0de40a6 --- /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 0000000..f15ec11 --- /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" } } */ |