diff options
author | Rask Ingemann Lambertsen <rask@sygehus.dk> | 2007-08-14 16:39:24 +0200 |
---|---|---|
committer | Rask Ingemann Lambertsen <rask@gcc.gnu.org> | 2007-08-14 14:39:24 +0000 |
commit | d39d658dbe7c5682da000db60d4ea6209ce6ab66 (patch) | |
tree | 22db592c1799b6343afa09bfa8ece2e1faa8d6d9 /gcc/config/i386/i386.h | |
parent | 9a251aa11803ceed2c52286f2b649b4d53a05dba (diff) | |
download | gcc-d39d658dbe7c5682da000db60d4ea6209ce6ab66.tar.gz |
re PR target/30315 (optimize unsigned-add overflow test on x86 to use cpu flags from addl)
PR target/30315
* config/i386/i386.h (CANONICALIZE_COMPARISON): New.
* config/i386/i386.md (plusminus)(addsub)(SWI): New.
(*<addsub><mode>3_cc_overflow): New.
(*add<mode>3_cconly_overflow): New.
(*sub<mode>3_cconly_overflow): New.
(*<addsub>si3_zext_cc_overflow): New.
* config/i386/predicates.md (fcmov_comparison_operator): Accept
CCCmode for LTU, GTU, LEU and GEU.
(ix86_comparison_operator): Likewise.
(ix86_carry_flag_operator): Carry flag is set if LTU or GTU in CCCmode.
* gcc/config/i386/i386.c (put_condition_code): Support CCCmode.
(ix86_cc_mode): Use CCCmode when testing for overflow of PLUS
or MINUS expressions.
testsuite/
PR target/30315
* gcc.target/i386/pr30315.c: New.
From-SVN: r127481
Diffstat (limited to 'gcc/config/i386/i386.h')
-rw-r--r-- | gcc/config/i386/i386.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index f205c81e2d2..4a41a6c76f8 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2065,6 +2065,16 @@ do { \ #define SELECT_CC_MODE(OP, X, Y) ix86_cc_mode ((OP), (X), (Y)) +/* Canonicalize overflow checks to save on the insn patterns. We change + "a + b < b" into "a + b < a" and "a + b >= b" into "a + b >= a". */ +#define CANONICALIZE_COMPARISON(code, op0, op1) \ +{ \ + if ((code == LTU || code == GEU) \ + && GET_CODE (op0) == PLUS \ + && rtx_equal_p (op1, XEXP (op0, 1))) \ + op1 = XEXP (op0, 0); \ +} + /* Return nonzero if MODE implies a floating point inequality can be reversed. */ |