This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH,ARM][3/n] Split various patterns
- From: Ramana Radhakrishnan <ramana dot gcc at googlemail dot com>
- To: Greta Yorsh <greta dot yorsh at arm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>, Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>, nickc at redhat dot com, paul at codesourcery dot com
- Date: Tue, 26 Mar 2013 13:33:33 +0000
- Subject: Re: [PATCH,ARM][3/n] Split various patterns
- References: <51227561 dot 45d5440a dot 4d62 dot 54fbSMTPIN_ADDED_BROKEN at mx dot google dot com>
- Reply-to: ramrad01 at arm dot com
On Mon, Feb 18, 2013 at 6:38 PM, Greta Yorsh <greta.yorsh@arm.com> wrote:
> Convert define_insn into define_insn_and_split for various patterns that
> output multiple assembly instructions.
>
> It appears that preparation statements in define_insn_and_split sometimes
> are called with which_alternative set to -1 even after reload. Therefore,
> preparation statements use conditions on the operands instead of
> which_alternative.
>
> gcc/
>
> 2013-02-14 Greta Yorsh <Greta.Yorsh@arm.com>
>
> * config/arm/arm.md (andsi_iorsi3_notsi): Convert define_insn into
> define_insn_and_split.
> (arm_negdi2,arm_abssi2,arm_neg_abssi2): Likewise.
> (arm_cmpdi_insn,arm_cmpdi_unsigned): Likewise.
>-(define_insn "*arm_neg_abssi2"
>+(define_insn_and_split "*arm_neg_abssi2"
> [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
> (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
> (clobber (reg:CC CC_REGNUM))]
> "TARGET_ARM"
>- "@
>- cmp\\t%0, #0\;rsbgt\\t%0, %0, #0
>- eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"
>+ "#"
> + {
> + /* if (which_alternative == 0) */
> + if (REGNO(operands[0]) == REGNO(operands[1]))
> + {
> + /* Emit the pattern:
> + cmp\\t%0, #0\;rsblt\\t%0, %0, #0
> + [(set (reg:CC CC_REGNUM)
> + (compare:CC (match_dup 0) (const_int 0)))
> + (cond_exec (lt:CC (reg:CC CC_REGNUM) (const_int 0))
> + (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1))))]
> + */
> + emit_insn (gen_rtx_SET (VOIDmode,
> + gen_rtx_REG (CCmode, CC_REGNUM),
> + gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
> + emit_insn (gen_rtx_COND_EXEC (VOIDmode,
> + (gen_rtx_LT (SImode,
> + gen_rtx_REG (CCmode, CC_REGNUM),
> + const0_rtx)),
> + (gen_rtx_SET (VOIDmode,
> + operands[0],
> + (gen_rtx_MINUS (SImode,
> + const0_rtx,
> + operands[1]))))));
> + DONE;
> + }
> + else
> + {
> + /* Emit the pattern:
> + alt1: eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31
> + [(set (match_dup 0)
> + (xor:SI (match_dup 1)
> + (ashiftrt:SI (match_dup 1) (const_int 31))))
> + (set (match_dup 0)
> + (minus:SI (match_dup 0)
> + (ashiftrt:SI (match_dup 1) (const_int 31))))]
> + */
> + emit_insn (gen_rtx_SET (VOIDmode,
> + operands[0],
> + gen_rtx_XOR (SImode,
> + gen_rtx_ASHIFTRT (SImode,
> + operands[1],
> + GEN_INT (31)),
> + operands[1])));
> + emit_insn (gen_rtx_SET (VOIDmode,
> + operands[0],
> + gen_rtx_MINUS (SImode,
> + operands[0],
> + gen_rtx_ASHIFTRT (SImode,
> + operands[1],
> + GEN_INT (31)))));
> + DONE;
> + }
> + }
Sink the DONE to the common part.
Ok with that change.
regards
Ramana