> One thing to do is to call simplify_gen_subreg.

As I noted, that may return NULL, which is fatal in the case I'm
referencing.

> But I don't think that will help.  I think this code is simply
> incorrect.  It seems to assume that op_mode is at least as large as
> GET_MODE (xop0), probably because that will be the case on the m68k.

Do we want to just fail that function if we detect the
smaller-than-mode case?  Otherwise, I've been using the below function
to constuct endian-aware subregs, it seems to work.

Of course, none of this answers my original question: what's the
"right" way to form a subreg these days?


static rtx
gen_low_word_subreg (enum machine_mode omode, rtx op, enum machine_mode imode)
{
  int lbyte;

  lbyte = GET_MODE_SIZE (imode) - GET_MODE_SIZE (omode);

  if (! BYTES_BIG_ENDIAN || lbyte < 0)
    return gen_rtx_SUBREG (omode, op, 0);

  return gen_rtx_SUBREG (omode, op, lbyte);
}

Reply via email to