if (XEXP (operands[1], 0) == stack_pointer_rtx)
{
emit_move_insn (operands[0], XEXP (operands[1], 0));
- emit_move_insn (operands[2], XEXP (operands[1], 1));
+ if (GET_CODE (XEXP (operands[1], 1)) == SUBREG
+ && (GET_MODE_SIZE (GET_MODE (XEXP (operands[1], 1)))
+ > GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (operands[1], 1))))))
+ emit_move_insn (operands[2],
+ gen_rtx (ZERO_EXTEND, GET_MODE (XEXP (operands[1], 1)),
+ SUBREG_REG (XEXP (operands[1], 1))));
+ else
+ emit_move_insn (operands[2], XEXP (operands[1], 1));
}
else
{
emit_move_insn (operands[0], XEXP (operands[1], 1));
- emit_move_insn (operands[2], XEXP (operands[1], 0));
+ if (GET_CODE (XEXP (operands[1], 0)) == SUBREG
+ && (GET_MODE_SIZE (GET_MODE (XEXP (operands[1], 0)))
+ > GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (operands[1], 0))))))
+ emit_move_insn (operands[2],
+ gen_rtx (ZERO_EXTEND, GET_MODE (XEXP (operands[1], 0)),
+ SUBREG_REG (XEXP (operands[1], 0))));
+ else
+ emit_move_insn (operands[2], XEXP (operands[1], 0));
}
emit_insn (gen_addsi3 (operands[0], operands[0], operands[2]));
DONE;