Commit 0a56ad62 by Jim Wilson

(legitimate_address_p): Accept either REG or SUBREG where

a register is valid in an address.

From-SVN: r3425
parent 2e4f4529
...@@ -1552,15 +1552,33 @@ i960_print_operand_addr (file, addr) ...@@ -1552,15 +1552,33 @@ i960_print_operand_addr (file, addr)
convert common non-canonical forms to canonical form so that they will convert common non-canonical forms to canonical form so that they will
be recognized. */ be recognized. */
/* These two macros allow us to accept either a REG or a SUBREG anyplace
where a register is valid. */
#define RTX_OK_FOR_BASE_P(X, STRICT) \
((GET_CODE (X) == REG \
&& (STRICT ? REG_OK_FOR_BASE_P_STRICT (X) : REG_OK_FOR_BASE_P (X))) \
|| (GET_CODE (X) == SUBREG \
&& GET_CODE (SUBREG_REG (X)) == REG \
&& (STRICT ? REG_OK_FOR_BASE_P_STRICT (SUBREG_REG (X)) \
: REG_OK_FOR_BASE_P (SUBREG_REG (X)))))
#define RTX_OK_FOR_INDEX_P(X, STRICT) \
((GET_CODE (X) == REG \
&& (STRICT ? REG_OK_FOR_INDEX_P_STRICT (X) : REG_OK_FOR_INDEX_P (X)))\
|| (GET_CODE (X) == SUBREG \
&& GET_CODE (SUBREG_REG (X)) == REG \
&& (STRICT ? REG_OK_FOR_INDEX_P_STRICT (SUBREG_REG (X)) \
: REG_OK_FOR_INDEX_P (SUBREG_REG (X)))))
int int
legitimate_address_p (mode, addr, strict) legitimate_address_p (mode, addr, strict)
enum machine_mode mode; enum machine_mode mode;
register rtx addr; register rtx addr;
int strict; int strict;
{ {
if (GET_CODE (addr) == REG) if (RTX_OK_FOR_BASE_P (addr, strict))
return (strict ? REG_OK_FOR_BASE_P_STRICT (addr) return 1;
: REG_OK_FOR_BASE_P (addr));
else if (CONSTANT_P (addr)) else if (CONSTANT_P (addr))
return 1; return 1;
else if (GET_CODE (addr) == PLUS) else if (GET_CODE (addr) == PLUS)
...@@ -1573,15 +1591,10 @@ legitimate_address_p (mode, addr, strict) ...@@ -1573,15 +1591,10 @@ legitimate_address_p (mode, addr, strict)
op0 = XEXP (addr, 0); op0 = XEXP (addr, 0);
op1 = XEXP (addr, 1); op1 = XEXP (addr, 1);
if (GET_CODE (op0) == REG) if (RTX_OK_FOR_BASE_P (op0, strict))
{ {
if (! (strict ? REG_OK_FOR_BASE_P_STRICT (op0) if (RTX_OK_FOR_INDEX_P (op1, strict))
: REG_OK_FOR_BASE_P (op0))) return 1;
return 0;
if (GET_CODE (op1) == REG)
return (strict ? REG_OK_FOR_INDEX_P_STRICT (op1)
: REG_OK_FOR_INDEX_P (op1));
else if (CONSTANT_P (op1)) else if (CONSTANT_P (op1))
return 1; return 1;
else else
...@@ -1591,29 +1604,21 @@ legitimate_address_p (mode, addr, strict) ...@@ -1591,29 +1604,21 @@ legitimate_address_p (mode, addr, strict)
{ {
if (GET_CODE (XEXP (op0, 0)) == MULT) if (GET_CODE (XEXP (op0, 0)) == MULT)
{ {
if (! (GET_CODE (XEXP (XEXP (op0, 0), 0)) == REG if (! (RTX_OK_FOR_INDEX_P (XEXP (XEXP (op0, 0), 0), strict)
&& (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (XEXP (op0, 0), 0))
: REG_OK_FOR_INDEX_P (XEXP (XEXP (op0, 0), 0)))
&& SCALE_TERM_P (XEXP (XEXP (op0, 0), 1)))) && SCALE_TERM_P (XEXP (XEXP (op0, 0), 1))))
return 0; return 0;
if (GET_CODE (XEXP (op0, 1)) == REG) if (RTX_OK_FOR_BASE_P (XEXP (op0, 1), strict)
return ((strict ? REG_OK_FOR_BASE_P_STRICT (XEXP (op0, 1)) && CONSTANT_P (op1))
: REG_OK_FOR_BASE_P (XEXP (op0, 1))) return 1;
&& CONSTANT_P (op1));
else else
return 0; return 0;
} }
else if (GET_CODE (XEXP (op0, 0)) == REG) else if (RTX_OK_FOR_BASE_P (XEXP (op0, 0), strict))
{ {
if (! (strict ? REG_OK_FOR_BASE_P_STRICT (XEXP (op0, 0)) if (RTX_OK_FOR_INDEX_P (XEXP (op0, 1), strict)
: REG_OK_FOR_BASE_P (XEXP (op0, 0)))) && CONSTANT_P (op1))
return 0; return 1;
if (GET_CODE (XEXP (op0, 1)) == REG)
return ((strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (op0, 1))
: REG_OK_FOR_INDEX_P (XEXP (op0, 1)))
&& CONSTANT_P (op1));
else else
return 0; return 0;
} }
...@@ -1622,15 +1627,12 @@ legitimate_address_p (mode, addr, strict) ...@@ -1622,15 +1627,12 @@ legitimate_address_p (mode, addr, strict)
} }
else if (GET_CODE (op0) == MULT) else if (GET_CODE (op0) == MULT)
{ {
if (! (GET_CODE (XEXP (op0, 0)) == REG if (! (RTX_OK_FOR_INDEX_P (XEXP (op0, 0), strict)
&& (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (op0, 0))
: REG_OK_FOR_INDEX_P (XEXP (op0, 0)))
&& SCALE_TERM_P (XEXP (op0, 1)))) && SCALE_TERM_P (XEXP (op0, 1))))
return 0; return 0;
if (GET_CODE (op1) == REG) if (RTX_OK_FOR_BASE_P (op1, strict))
return (strict ? REG_OK_FOR_BASE_P_STRICT (op1) return 1;
: REG_OK_FOR_BASE_P (op1));
else if (CONSTANT_P (op1)) else if (CONSTANT_P (op1))
return 1; return 1;
else else
...@@ -1644,9 +1646,7 @@ legitimate_address_p (mode, addr, strict) ...@@ -1644,9 +1646,7 @@ legitimate_address_p (mode, addr, strict)
if (! TARGET_COMPLEX_ADDR && ! reload_completed) if (! TARGET_COMPLEX_ADDR && ! reload_completed)
return 0; return 0;
return (GET_CODE (XEXP (addr, 0)) == REG return (RTX_OK_FOR_INDEX_P (XEXP (addr, 0), strict)
&& (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (addr, 0))
: REG_OK_FOR_INDEX_P (XEXP (addr, 0)))
&& SCALE_TERM_P (XEXP (addr, 1))); && SCALE_TERM_P (XEXP (addr, 1)));
} }
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment