Commit ff2ca1bc by Hans-Peter Nilsson Committed by Hans-Peter Nilsson

re PR target/53156 (gcc.target/cris/peep2-andu2.c)

	PR target/53156
	* config/cris/cris.md (andqu): New peephole2.
	(andu): Tweak head comment.

From-SVN: r186940
parent 2a640b51
2012-04-29 Hans-Peter Nilsson <hp@axis.com>
PR target/53156
* config/cris/cris.md (andqu): New peephole2.
(andu): Tweak head comment.
2012-04-28 Joern Rennecke <joern.rennecke@embecosm.com> 2012-04-28 Joern Rennecke <joern.rennecke@embecosm.com>
Steven Bosscher <steven@gcc.gnu.org> Steven Bosscher <steven@gcc.gnu.org>
Maxim Kuvyrkov <maxim@codesourcery.com> Maxim Kuvyrkov <maxim@codesourcery.com>
......
...@@ -4936,17 +4936,17 @@ ...@@ -4936,17 +4936,17 @@
"operands[7] "operands[7]
= rtx_equal_p (operands[3], operands[0]) ? operands[4] : operands[3];") = rtx_equal_p (operands[3], operands[0]) ? operands[4] : operands[3];")
;; I cannot tell GCC (2.1, 2.7.2) how to correctly reload an instruction ;; There seems to be no other way to make GCC (including 4.8/trunk at
;; that looks like ;; r186932) optimally reload an instruction that looks like
;; and.b some_byte,const,reg_32 ;; and.d reg_or_mem,const_32__65535,other_reg
;; where reg_32 is the destination of the "three-address" code optimally. ;; where other_reg is the destination.
;; It should be: ;; It should be:
;; movu.b some_byte,reg_32 ;; movu.[bw] reg_or_mem,reg_32
;; and.b const,reg_32 ;; and.[bw] trunc_int_for_mode([bw], const_32__65535),reg_32 ;; or andq
;; but it turns into: ;; but it turns into:
;; move.b some_byte,reg_32 ;; move.d reg_or_mem,reg_32
;; and.d const,reg_32 ;; and.d const_32__65535,reg_32
;; Fix it here. ;; Fix it with these two peephole2's.
;; Testcases: gcc.dg/cris-peep2-andu1.c gcc.dg/cris-peep2-andu2.c ;; Testcases: gcc.dg/cris-peep2-andu1.c gcc.dg/cris-peep2-andu2.c
(define_peephole2 ; andu (casesi+45) (define_peephole2 ; andu (casesi+45)
...@@ -4984,6 +4984,36 @@ ...@@ -4984,6 +4984,36 @@
? QImode : amode))); ? QImode : amode)));
}) })
;; Since r186861, gcc.dg/cris-peep2-andu2.c trigs this pattern, with which
;; we fix up e.g.:
;; movu.b 254,$r9.
;; and.d $r10,$r9
;; into:
;; movu.b $r10,$r9
;; andq -2,$r9.
;; Only do this for values fitting the quick immediate operand.
(define_peephole2 ; andqu (casesi+46)
[(set (match_operand:SI 0 "register_operand")
(match_operand:SI 1 "const_int_operand"))
(set (match_dup 0)
(and:SI (match_dup 0) (match_operand:SI 2 "nonimmediate_operand")))]
;; Since the size of the memory access will be made different here,
;; don't do this for a volatile access or a post-incremented address.
"satisfies_constraint_O (operands[1])
&& !side_effects_p (operands[2])
&& !reg_overlap_mentioned_p (operands[0], operands[2])"
[(set (match_dup 0) (match_dup 3))
(set (match_dup 0) (and:SI (match_dup 0) (match_dup 4)))]
{
enum machine_mode zmode = INTVAL (operands[2]) <= 255 ? QImode : HImode;
rtx op1
= (REG_S_P (operands[2])
? gen_rtx_REG (zmode, REGNO (operands[2]))
: adjust_address (operands[2], zmode, 0));
operands[3] = gen_rtx_ZERO_EXTEND (SImode, op1);
operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[1]), QImode));
})
;; Try and avoid GOTPLT reads escaping a call: transform them into ;; Try and avoid GOTPLT reads escaping a call: transform them into
;; PLT. Curiously (but thankfully), peepholes for instructions ;; PLT. Curiously (but thankfully), peepholes for instructions
;; *without side-effects* that just feed a call (or call_value) are ;; *without side-effects* that just feed a call (or call_value) are
......
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