[PATCH 16/29] [arm] early split most DImode comparison operations.

Richard Earnshaw Richard.Earnshaw@arm.com
Fri Oct 18 19:55:00 GMT 2019


This patch does most of the work for early splitting the DImode
comparisons.  We now handle EQ, NE, LT, GE, LTU and GEU during early
expansion, in addition to EQ and NE, for which the expansion has now
been reworked to use a standard conditional-compare pattern already in
the back-end.

To handle this we introduce two new condition flag modes that are used
when comparing the upper words of decomposed DImode values: one for
signed, and one for unsigned comparisons.  CC_Bmode (B for Borrow) is
essentially the inverse of CC_Cmode and is used when the carry flag is
set by a subtraction of unsigned values.

	* config/arm/arm-modes.def (CC_NV, CC_B): New CC modes.
	* config/arm/arm.c (arm_select_cc_mode): Recognize constructs that
	need these modes.
	(arm_gen_dicompare_reg): New code to early expand the sub-operations
	of EQ, NE, LT, GE, LTU and GEU.
	* config/arm/iterators.md (CC_EXTEND): New code attribute.
	* config/arm/predicates.md (arm_adcimm_operand): New predicate..
	* config/arm/arm.md (cmpsi3_carryin_<CC_EXTEND>out): New pattern.
	(cmpsi3_imm_carryin_<CC_EXTEND>out): Likewise.
	(cmpsi3_0_carryin_<CC_EXTEND>out): Likewise.
---
 gcc/config/arm/arm-modes.def |   6 +
 gcc/config/arm/arm.c         | 220 ++++++++++++++++++++++++++++++++++-
 gcc/config/arm/arm.md        |  45 +++++++
 gcc/config/arm/iterators.md  |   4 +
 gcc/config/arm/predicates.md |   6 +
 5 files changed, 278 insertions(+), 3 deletions(-)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0016-arm-early-split-most-DImode-comparison-operations.patch
Type: text/x-patch
Size: 11992 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20191018/8e9adfd3/attachment.bin>


More information about the Gcc-patches mailing list