Commit 274b2532 by Kyrylo Tkachov Committed by Kyrylo Tkachov

aarch64.c (aarch64_select_cc_mode): Return CC_SWP for comparison with negated operand.

[gcc/]
2013-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

	* config/aarch64/aarch64.c (aarch64_select_cc_mode): Return CC_SWP for
	comparison with negated operand.
	* config/aarch64/aarch64.md (compare_neg<mode>): Match canonical RTL form.

[gcc/testsuite/]	
2013-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

	* gcc.target/aarch64/cmn-neg.c: New test.

From-SVN: r202400
parent 467a3558
2013-09-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_select_cc_mode): Return CC_SWP for
comparison with negated operand.
* config/aarch64/aarch64.md (compare_neg<mode>): Match canonical RTL form.
2013-09-09 Richard Biener <rguenther@suse.de> 2013-09-09 Richard Biener <rguenther@suse.de>
PR middle-end/58326 PR middle-end/58326
......
...@@ -3313,14 +3313,15 @@ aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y) ...@@ -3313,14 +3313,15 @@ aarch64_select_cc_mode (RTX_CODE code, rtx x, rtx y)
|| GET_CODE (x) == NEG)) || GET_CODE (x) == NEG))
return CC_NZmode; return CC_NZmode;
/* A compare with a shifted operand. Because of canonicalization, /* A compare with a shifted or negated operand. Because of canonicalization,
the comparison will have to be swapped when we emit the assembly the comparison will have to be swapped when we emit the assembly
code. */ code. */
if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode) if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode)
&& (GET_CODE (y) == REG || GET_CODE (y) == SUBREG) && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG)
&& (GET_CODE (x) == ASHIFT || GET_CODE (x) == ASHIFTRT && (GET_CODE (x) == ASHIFT || GET_CODE (x) == ASHIFTRT
|| GET_CODE (x) == LSHIFTRT || GET_CODE (x) == LSHIFTRT
|| GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)) || GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND
|| GET_CODE (x) == NEG))
return CC_SWPmode; return CC_SWPmode;
/* A compare of a mode narrower than SI mode against zero can be done /* A compare of a mode narrower than SI mode against zero can be done
......
...@@ -1480,12 +1480,12 @@ ...@@ -1480,12 +1480,12 @@
) )
(define_insn "*compare_neg<mode>" (define_insn "*compare_neg<mode>"
[(set (reg:CC CC_REGNUM) [(set (reg:CC_SWP CC_REGNUM)
(compare:CC (compare:CC_SWP
(match_operand:GPI 0 "register_operand" "r") (neg:GPI (match_operand:GPI 0 "register_operand" "r"))
(neg:GPI (match_operand:GPI 1 "register_operand" "r"))))] (match_operand:GPI 1 "register_operand" "r")))]
"" ""
"cmn\\t%<w>0, %<w>1" "cmn\\t%<w>1, %<w>0"
[(set_attr "v8type" "alus") [(set_attr "v8type" "alus")
(set_attr "type" "alus_reg") (set_attr "type" "alus_reg")
(set_attr "mode" "<MODE>")] (set_attr "mode" "<MODE>")]
......
2013-09-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/cmn-neg.c: New test.
2013-09-09 Richard Biener <rguenther@suse.de> 2013-09-09 Richard Biener <rguenther@suse.de>
PR middle-end/58326 PR middle-end/58326
......
/* { dg-do run } */
/* { dg-options "-O2 --save-temps" } */
extern void abort (void);
void __attribute__ ((noinline))
foo_s32 (int a, int b)
{
if (a < -b)
abort ();
}
/* { dg-final { scan-assembler "cmn\tw\[0-9\]" } } */
void __attribute__ ((noinline))
foo_s64 (long long a, long long b)
{
if (a < -b)
abort ();
}
/* { dg-final { scan-assembler "cmn\tx\[0-9\]" } } */
int
main (void)
{
int a = 30;
int b = 42;
foo_s32 (a, b);
foo_s64 (a, b);
return 0;
}
/* { dg-final { cleanup-saved-temps } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment