diff options
author | Yvan Roux <yvan.roux@linaro.org> | 2017-07-04 10:41:08 +0200 |
---|---|---|
committer | Yvan Roux <yvan.roux@linaro.org> | 2017-07-05 07:01:30 +0000 |
commit | 3ff0e82c04276a36836b703af60106568f3e8675 (patch) | |
tree | a48dcc154dd77352ec7b64a1cc0965e7168b385e /gcc | |
parent | e8f14d2a2414f0b30a7fde8f25a512e9d57dd279 (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.md | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/subs_compare_1.c | 15 |
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\]+" } } */ |