Ping? Is this the right thing to do? I'd like to get this (and a few other m32c bugs) resolved before the next release.
> This seems to work, with a suitable extendhipsi2 pattern for m32c: > > Index: expr.c > =================================================================== > --- expr.c (revision 140759) > +++ expr.c (working copy) > @@ -8455,12 +8459,34 @@ expand_expr_real_1 (tree exp, rtx target > if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) > op0 = force_operand (op0, target); > return REDUCE_BIT_FIELD (op0); > } > } > > + if (code == POINTER_PLUS_EXPR > + || TYPE_PRECISION (TREE_OPERAND (exp, 1)) < TYPE_PRECISION > (TREE_OPERAND (exp, 0))) > + { > + rtx reg; > + enum machine_mode imode, omode; > + > + expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1), > + subtarget, &op0, &op1, 0); > + > + if (op0 == const0_rtx) > + return op1; > + if (op1 == const0_rtx) > + return op0; > + > + imode = GET_MODE (op1); > + omode = GET_MODE (op0); > + reg = gen_reg_rtx (omode); > + emit_move_insn (reg, gen_rtx_fmt_e (SIGN_EXTEND, omode, op1)); > + op1 = reg; > + goto binop2; > + } > + > /* No sense saving up arithmetic to be done > if it's all in the wrong mode to form part of an address. > And force_operand won't know whether to sign-extend or > zero-extend. */ > if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) > || mode != ptr_mode) >