register that didn't get a hard register. In that case we can just
call emit_move_insn.
- We can also be asked to reload a PLUS that adds either two registers or
- a register and a constant or MEM. This can occur during frame pointer
- elimination. That case if handled by trying to emit a single insn
+ We can also be asked to reload a PLUS that adds either two registers, or
+ a register and a constant or MEM, or a MEM and a constant. This can
+ occur during frame pointer elimination and while reloading addresses.
+ This case is handled by trying to emit a single insn
to perform the add. If it is not valid, we use a two insn sequence.
Finally, we could be called to handle an 'o' constraint by putting
??? At some point, this whole thing needs to be rethought. */
if (GET_CODE (in) == PLUS
- && GET_CODE (XEXP (in, 0)) == REG
- && (GET_CODE (XEXP (in, 1)) == REG
- || CONSTANT_P (XEXP (in, 1))
- || GET_CODE (XEXP (in, 1)) == MEM))
+ && ((GET_CODE (XEXP (in, 0)) == REG
+ && (GET_CODE (XEXP (in, 1)) == REG
+ || CONSTANT_P (XEXP (in, 1))
+ || GET_CODE (XEXP (in, 1)) == MEM))
+ || (GET_CODE (XEXP (in, 0)) == MEM
+ && CONSTANT_P (XEXP (in, 1)))))
{
/* We need to compute the sum of what is either a register and a
- constant, a register and memory, or a hard register and a pseudo
- register and put it into the reload register. The best possible way
- of doing this is if the machine has a three-operand ADD insn that
- accepts the required operands.
+ constant, a register and memory, a hard register and a pseudo
+ register, or memory and a constant and put it into the reload
+ register. The best possible way of doing this is if the machine
+ has a three-operand ADD insn that accepts the required operands.
The simplest approach is to try to generate such an insn and see if it
is recognized and matches its constraints. If so, it can be used.