aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-01-11 14:44:22 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2016-01-11 14:44:22 +0000
commit2b8568fe565d23e8cb9f02334d81c21428eb7cd3 (patch)
tree5f838f445f94024a719619366722b2aa255063b9 /gcc
parent0d58938ed798882063737dedfe897a9b484295ad (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/config/aarch64/aarch64.c7
-rw-r--r--gcc/config/aarch64/aarch64.md10
-rw-r--r--gcc/config/aarch64/iterators.md2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/aarch64/tst_5.c21
-rw-r--r--gcc/testsuite/gcc.target/aarch64/tst_6.c10
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" } } */