This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH] Improve andq $0xffffffff, %reg handling (PR target/53110)
On Mon, Apr 30, 2012 at 02:54:05PM +0200, Uros Bizjak wrote:
> > My recent changes to zero_extend expanders should handle this
> > automatically, and will undo generation of zero_extend pattern. Please
> > see zero_extend<mode>si2_and expander, and how it handles
> > TARGET_ZERO_EXTEND_WITH_AND targets.
> Attached patch implements this idea. In addition, it fixes the
> splitter to not change output mode of zero_extension from HImode and
> QImode from DImode to SImode. Although they generate the same
> instruction, I think we should better keep original mode here.
Thanks. I was trying this morning slightly different patch for the same,
but strangely it failed bootstrap, and didn't get around to analysing
why a mem store had (zero_extend (subreg (reg))) on a RHS.
> + operands = gen_lowpart (mode, operands);
> + if (GET_MODE (operands) == DImode)
> + insn = (mode == SImode)
> + ? gen_zero_extendsidi2
> + : (mode == HImode)
> + ? gen_zero_extendhidi2
> + : gen_zero_extendqidi2;
> + else if (GET_MODE (operands) == SImode)
> + insn = (mode == HImode)
> + ? gen_zero_extendhisi2
> + : gen_zero_extendqisi2;
> + else if (GET_MODE (operands) == HImode)
> + insn = gen_zero_extendqihi2;
> - ix86_expand_binary_operator (AND, <MODE>mode, operands);
> + gcc_unreachable ();
> + emit_insn (insn (operands, operands));
IMHO you should use <MODE>mode instead of GET_MODE (operands)
in all of the above, then the compiler can actually optimize
it at compile time.