Commit e95cfa3b by Paul Woegerer

crx.c: Implemented crx_decompose_address (like in the i386 port) so that...

	* config/crx/crx.c: Implemented crx_decompose_address (like in the
	  i386 port) so that crx_legitimate_address_p, crx_address_cost
	  and crx_print_operand_address are using the same code for adress
	  handling. Using symbolic displacements now gets rejected since
	  the CRX register relative adressing mode can't handle unsigned
	  32-bit values as displacements.
	* config/crx/crx.h: Simplified definitions for REG_OK_FOR_BASE_P,
	  removed redundant parenthesis and obsolete macros.
	* config/crx/crx.opt: Added a new switch for debugging of address
	  handling.
	* config/crx/crx-protos.h: Added new declarations for above.

From-SVN: r103269
parent 1581a9a1
...@@ -42,6 +42,18 @@ extern rtx crx_function_arg (struct cumulative_args *, enum machine_mode, tree, ...@@ -42,6 +42,18 @@ extern rtx crx_function_arg (struct cumulative_args *, enum machine_mode, tree,
#ifdef RTX_CODE #ifdef RTX_CODE
/* Addressing Modes. */ /* Addressing Modes. */
struct crx_address
{
rtx base, index, disp, side_effect;
int scale;
};
enum crx_addrtype
{
CRX_INVALID, CRX_REG_REL, CRX_POST_INC, CRX_SCALED_INDX, CRX_ABSOLUTE
};
extern enum crx_addrtype crx_decompose_address (rtx addr, struct crx_address *out);
extern int crx_legitimate_address_p (enum machine_mode, rtx, int); extern int crx_legitimate_address_p (enum machine_mode, rtx, int);
extern int crx_const_double_ok (rtx op); extern int crx_const_double_ok (rtx op);
......
...@@ -223,7 +223,6 @@ enum reg_class ...@@ -223,7 +223,6 @@ enum reg_class
|| (reg_renumber && (unsigned)reg_renumber[REGNO] < 16)) || (reg_renumber && (unsigned)reg_renumber[REGNO] < 16))
#define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P(REGNO) #define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P(REGNO)
#define REGNO_OK_FOR_INDEXED_BASE_P(REGNO) REGNO_OK_FOR_BASE_P(REGNO)
#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
...@@ -329,7 +328,7 @@ struct cumulative_args ...@@ -329,7 +328,7 @@ struct cumulative_args
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
crx_function_arg_advance(&(CUM), (MODE), (TYPE), (NAMED)) crx_function_arg_advance(&(CUM), (MODE), (TYPE), (NAMED))
#define FUNCTION_ARG_REGNO_P(REGNO) crx_function_arg_regno_p((REGNO)) #define FUNCTION_ARG_REGNO_P(REGNO) crx_function_arg_regno_p(REGNO)
/*****************************************************************************/ /*****************************************************************************/
/* RETURNING FUNCTION VALUE */ /* RETURNING FUNCTION VALUE */
...@@ -384,22 +383,12 @@ struct cumulative_args ...@@ -384,22 +383,12 @@ struct cumulative_args
#define HAVE_POST_MODIFY_DISP 1 #define HAVE_POST_MODIFY_DISP 1
#define HAVE_POST_MODIFY_REG 0 #define HAVE_POST_MODIFY_REG 0
#define STRICT_REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
#define STRICT_REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P(REGNO(X))
#define STRICT_REG_OK_FOR_INDEXED_BASE_P(X) REGNO_OK_FOR_INDEXED_BASE_P(REGNO(X))
#define NONSTRICT_REG_OK_FOR_BASE_P(X) 1
#define NONSTRICT_REG_OK_FOR_INDEX_P(X) 1
#define NONSTRICT_REG_OK_FOR_INDEXED_BASE_P(X) 1
#ifdef REG_OK_STRICT #ifdef REG_OK_STRICT
#define REG_OK_FOR_BASE_P(X) STRICT_REG_OK_FOR_BASE_P(X) #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
#define REG_OK_FOR_INDEX_P(X) STRICT_REG_OK_FOR_INDEX_P(X) #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
#define REG_OK_FOR_INDEXED_BASE_P(X) STRICT_REG_OK_FOR_INDEXED_BASE_P(X)
#else #else
#define REG_OK_FOR_BASE_P(X) NONSTRICT_REG_OK_FOR_BASE_P(X) #define REG_OK_FOR_BASE_P(X) 1
#define REG_OK_FOR_INDEX_P(X) NONSTRICT_REG_OK_FOR_INDEX_P(X) #define REG_OK_FOR_INDEX_P(X) 1
#define REG_OK_FOR_INDEXED_BASE_P(X) NONSTRICT_REG_OK_FOR_INDEXED_BASE_P(X)
#endif /* REG_OK_STRICT */ #endif /* REG_OK_STRICT */
#ifdef REG_OK_STRICT #ifdef REG_OK_STRICT
...@@ -414,9 +403,7 @@ struct cumulative_args ...@@ -414,9 +403,7 @@ struct cumulative_args
if (crx_legitimate_address_p (MODE, X, 0)) \ if (crx_legitimate_address_p (MODE, X, 0)) \
goto LABEL; \ goto LABEL; \
} }
#endif #endif /* REG_OK_STRICT */
#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) {}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \ #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
{ \ { \
......
...@@ -26,3 +26,6 @@ Support multiply accumulate instructions ...@@ -26,3 +26,6 @@ Support multiply accumulate instructions
mno-push-args mno-push-args
Target Report RejectNegative Mask(NO_PUSH_ARGS) Target Report RejectNegative Mask(NO_PUSH_ARGS)
Do not use push to store function arguments Do not use push to store function arguments
mdebug-addr
Target RejectNegative Var(TARGET_DEBUG_ADDR) Undocumented
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