aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYvan Roux <yvan.roux@linaro.org>2017-07-04 10:41:08 +0200
committerYvan Roux <yvan.roux@linaro.org>2017-07-05 07:01:30 +0000
commit3ff0e82c04276a36836b703af60106568f3e8675 (patch)
treea48dcc154dd77352ec7b64a1cc0965e7168b385e /gcc
parente8f14d2a2414f0b30a7fde8f25a512e9d57dd279 (diff)
gcc/
Backport from trunk r248869. 2017-06-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * config/aarch64/aarch64.c (define_peephole2 above *sub_<shift>_<mode>): New peephole. gcc/testsuite/ Backport from trunk r248869. 2017-06-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/aarch64/subs_compare_1.c: New test. Change-Id: Ia337ef4b86f37b2c9b22fa412b5298f9961d502d
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/aarch64.md18
-rw-r--r--gcc/testsuite/gcc.target/aarch64/subs_compare_1.c15
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 93972d134b1..475c6d7e85d 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -2234,6 +2234,24 @@
[(set_attr "type" "alus_sreg")]
)
+(define_peephole2
+ [(set (match_operand:GPI 0 "register_operand")
+ (minus:GPI (match_operand:GPI 1 "aarch64_reg_or_zero")
+ (match_operand:GPI 2 "aarch64_reg_or_zero")))
+ (set (reg:CC CC_REGNUM)
+ (compare:CC
+ (match_dup 1)
+ (match_dup 2)))]
+ "!reg_overlap_mentioned_p (operands[0], operands[1])
+ && !reg_overlap_mentioned_p (operands[0], operands[2])"
+ [(const_int 0)]
+ {
+ emit_insn (gen_sub<mode>3_compare1 (operands[0], operands[1],
+ operands[2]));
+ DONE;
+ }
+)
+
(define_insn "*sub_<shift>_<mode>"
[(set (match_operand:GPI 0 "register_operand" "=r")
(minus:GPI (match_operand:GPI 3 "register_operand" "r")
diff --git a/gcc/testsuite/gcc.target/aarch64/subs_compare_1.c b/gcc/testsuite/gcc.target/aarch64/subs_compare_1.c
new file mode 100644
index 00000000000..95c8f696fee
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/subs_compare_1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+foo (int a, int b)
+{
+ int x = a - b;
+ if (a <= b)
+ return x;
+ else
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "subs\\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 1 } } */
+/* { dg-final { scan-assembler-not "cmp\\tw\[0-9\]+, w\[0-9\]+" } } */