aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/c4x/c4x.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/c4x/c4x.h')
-rw-r--r--gcc/config/c4x/c4x.h57
1 files changed, 47 insertions, 10 deletions
diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h
index 49b979e..ce1493d 100644
--- a/gcc/config/c4x/c4x.h
+++ b/gcc/config/c4x/c4x.h
@@ -1705,18 +1705,55 @@ CUMULATIVE_ARGS;
#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \
{ \
- rtx new; \
- new = c4x_legitimize_reload_address (X, MODE, insn); \
- if (new != NULL_RTX) \
- { \
- (X) = new; \
- /* We do not have to call push_reload because we do not require \
- any more reloads. */ \
- goto WIN; \
- } \
+ if (MODE != HImode \
+ && MODE != HFmode \
+ && GET_MODE (X) != HImode \
+ && GET_MODE (X) != HFmode \
+ && (GET_CODE (X) == CONST \
+ || GET_CODE (X) == SYMBOL_REF \
+ || GET_CODE (X) == LABEL_REF)) \
+ { \
+ if (! TARGET_SMALL) \
+ { \
+ int i; \
+ X = gen_rtx_LO_SUM (GET_MODE (X), \
+ gen_rtx_HIGH (GET_MODE (X), X), X); \
+ i = push_reload (XEXP (X, 0), NULL_RTX, \
+ &XEXP (X, 0), NULL_PTR, \
+ DP_REG, GET_MODE (X), VOIDmode, 0, 0, \
+ OPNUM, TYPE); \
+ /* The only valid reg is DP. This is a fixed reg and will \
+ normally not be used so force it. */ \
+ rld[i].reg_rtx = gen_rtx_REG (Pmode, DP_REGNO); \
+ rld[i].nocombine = 1; \
+ } \
+ goto WIN; \
+ } \
+ else if (MODE != HImode \
+ && MODE != HFmode \
+ && GET_MODE (X) != HImode \
+ && GET_MODE (X) != HFmode \
+ && GET_CODE (X) == LO_SUM \
+ && GET_CODE (XEXP (X,0)) == HIGH \
+ && (GET_CODE (XEXP (XEXP (X,0),0)) == CONST \
+ || GET_CODE (XEXP (XEXP (X,0),0)) == SYMBOL_REF \
+ || GET_CODE (XEXP (XEXP (X,0),0)) == LABEL_REF)) \
+ { \
+ if (! TARGET_SMALL) \
+ { \
+ int i = push_reload (XEXP (X, 0), NULL_RTX, \
+ &XEXP (X, 0), NULL_PTR, \
+ DP_REG, GET_MODE (X), VOIDmode, 0, 0, \
+ OPNUM, TYPE); \
+ /* The only valid reg is DP. This is a fixed reg and will \
+ normally not be used so force it. */ \
+ rld[i].reg_rtx = gen_rtx_REG (Pmode, DP_REGNO); \
+ rld[i].nocombine = 1; \
+ } \
+ goto WIN; \
+ } \
}
-
/* No mode-dependent addresses on the C4x are autoincrements. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \