DJ Delorie <[EMAIL PROTECTED]> writes:

> > I don't know whether any other chip has this particular limitation,
> > but it's not hard to handle.  ashlsi3 and friends should be a
> > define_expand which turn an overly large CONST_INT into two shifts,
> > load the shift count into a register, whichever is likely to be
> > better.  The MIPS16 does this, for example (search for any_shift:GPR
> > in mips.md).  Then the real insn should use an operand predicate which
> > only accepts CONST_INTs which are in range.
> 
> I can handle the large constant shifts with multiple shift opcodes.
> The problem is, it can't handle large shifts counts in registers
> either.  A 32 bit value can be shifted at most 16 bits in a single
> opcode, period.

Oh, I see.  Bummer.

> At the moment, the only solution I can see is to code constant shifts
> with multiple opcodes, and whenever I need a variable shift code a
> subroutine call instead which checks for out of range shifts.  I was
> hoping there was an alternative, but I haven't seen anything that
> makes me think gcc will react nicely to failed shift expanders.

Or, you could presumably code it inline if you wanted to, using a
conditional branch.  I don't know whether that would be any better.

Or maybe in some cases you could do
    shift r1,r2
    lshiftrt r2,4
    shirt r1,r2

Ian

Reply via email to