> 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);
}