Commit a1a79768 by Anatoly Sokolov Committed by Anatoly Sokolov

xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Remove.

	* config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Remove.
	* config/xtensa/xtensa-protos.h (constantpool_address_p): Remove.
	* config/xtensa/xtensa.c (TARGET_MODE_DEPENDENT_ADDRESS_P): Define.
	(xtensa_mode_dependent_address_p): New function.
	(constantpool_address_p): Make static. Change return type to bool.
	Change argument type to const_rtx. Use CONST_INT_P predicate.

From-SVN: r169060
parent 427f6cec
2011-01-20 Anatoly Sokolov <aesok@post.ru>
* config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Remove.
* config/xtensa/xtensa-protos.h (constantpool_address_p): Remove.
* config/xtensa/xtensa.c (TARGET_MODE_DEPENDENT_ADDRESS_P): Define.
(xtensa_mode_dependent_address_p): New function.
(constantpool_address_p): Make static. Change return type to bool.
Change argument type to const_rtx. Use CONST_INT_P predicate.
2011-01-20 Alexandre Oliva <aoliva@redhat.com> 2011-01-20 Alexandre Oliva <aoliva@redhat.com>
PR debug/46583 PR debug/46583
......
...@@ -36,7 +36,6 @@ extern bool xtensa_mem_offset (unsigned, enum machine_mode); ...@@ -36,7 +36,6 @@ extern bool xtensa_mem_offset (unsigned, enum machine_mode);
extern int xt_true_regnum (rtx); extern int xt_true_regnum (rtx);
extern int xtensa_valid_move (enum machine_mode, rtx *); extern int xtensa_valid_move (enum machine_mode, rtx *);
extern int smalloffset_mem_p (rtx); extern int smalloffset_mem_p (rtx);
extern int constantpool_address_p (rtx);
extern int constantpool_mem_p (rtx); extern int constantpool_mem_p (rtx);
extern void xtensa_extend_reg (rtx, rtx); extern void xtensa_extend_reg (rtx, rtx);
extern void xtensa_expand_conditional_branch (rtx *, enum machine_mode); extern void xtensa_expand_conditional_branch (rtx *, enum machine_mode);
......
...@@ -126,6 +126,7 @@ static rtx fixup_subreg_mem (rtx); ...@@ -126,6 +126,7 @@ static rtx fixup_subreg_mem (rtx);
static struct machine_function * xtensa_init_machine_status (void); static struct machine_function * xtensa_init_machine_status (void);
static rtx xtensa_legitimize_tls_address (rtx); static rtx xtensa_legitimize_tls_address (rtx);
static rtx xtensa_legitimize_address (rtx, rtx, enum machine_mode); static rtx xtensa_legitimize_address (rtx, rtx, enum machine_mode);
static bool xtensa_mode_dependent_address_p (const_rtx);
static bool xtensa_return_in_msb (const_tree); static bool xtensa_return_in_msb (const_tree);
static void printx (FILE *, signed int); static void printx (FILE *, signed int);
static void xtensa_function_epilogue (FILE *, HOST_WIDE_INT); static void xtensa_function_epilogue (FILE *, HOST_WIDE_INT);
...@@ -161,6 +162,8 @@ static void xtensa_asm_trampoline_template (FILE *); ...@@ -161,6 +162,8 @@ static void xtensa_asm_trampoline_template (FILE *);
static void xtensa_trampoline_init (rtx, tree, rtx); static void xtensa_trampoline_init (rtx, tree, rtx);
static bool xtensa_output_addr_const_extra (FILE *, rtx); static bool xtensa_output_addr_const_extra (FILE *, rtx);
static bool constantpool_address_p (const_rtx addr);
static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] = static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] =
REG_ALLOC_ORDER; REG_ALLOC_ORDER;
...@@ -201,6 +204,8 @@ static const struct default_options xtensa_option_optimization_table[] = ...@@ -201,6 +204,8 @@ static const struct default_options xtensa_option_optimization_table[] =
#undef TARGET_LEGITIMIZE_ADDRESS #undef TARGET_LEGITIMIZE_ADDRESS
#define TARGET_LEGITIMIZE_ADDRESS xtensa_legitimize_address #define TARGET_LEGITIMIZE_ADDRESS xtensa_legitimize_address
#undef TARGET_MODE_DEPENDENT_ADDRESS_P
#define TARGET_MODE_DEPENDENT_ADDRESS_P xtensa_mode_dependent_address_p
#undef TARGET_RTX_COSTS #undef TARGET_RTX_COSTS
#define TARGET_RTX_COSTS xtensa_rtx_costs #define TARGET_RTX_COSTS xtensa_rtx_costs
...@@ -494,10 +499,10 @@ smalloffset_mem_p (rtx op) ...@@ -494,10 +499,10 @@ smalloffset_mem_p (rtx op)
} }
int static bool
constantpool_address_p (rtx addr) constantpool_address_p (const_rtx addr)
{ {
rtx sym = addr; const_rtx sym = addr;
if (GET_CODE (addr) == CONST) if (GET_CODE (addr) == CONST)
{ {
...@@ -506,21 +511,21 @@ constantpool_address_p (rtx addr) ...@@ -506,21 +511,21 @@ constantpool_address_p (rtx addr)
/* Only handle (PLUS (SYM, OFFSET)) form. */ /* Only handle (PLUS (SYM, OFFSET)) form. */
addr = XEXP (addr, 0); addr = XEXP (addr, 0);
if (GET_CODE (addr) != PLUS) if (GET_CODE (addr) != PLUS)
return FALSE; return false;
/* Make sure the address is word aligned. */ /* Make sure the address is word aligned. */
offset = XEXP (addr, 1); offset = XEXP (addr, 1);
if ((GET_CODE (offset) != CONST_INT) if ((!CONST_INT_P (offset))
|| ((INTVAL (offset) & 3) != 0)) || ((INTVAL (offset) & 3) != 0))
return FALSE; return false;
sym = XEXP (addr, 0); sym = XEXP (addr, 0);
} }
if ((GET_CODE (sym) == SYMBOL_REF) if ((GET_CODE (sym) == SYMBOL_REF)
&& CONSTANT_POOL_ADDRESS_P (sym)) && CONSTANT_POOL_ADDRESS_P (sym))
return TRUE; return true;
return FALSE; return false;
} }
...@@ -1937,6 +1942,21 @@ xtensa_legitimize_address (rtx x, ...@@ -1937,6 +1942,21 @@ xtensa_legitimize_address (rtx x,
return x; return x;
} }
/* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.
Treat constant-pool references as "mode dependent" since they can
only be accessed with SImode loads. This works around a bug in the
combiner where a constant pool reference is temporarily converted
to an HImode load, which is then assumed to zero-extend based on
our definition of LOAD_EXTEND_OP. This is wrong because the high
bits of a 16-bit value in the constant pool are now sign-extended
by default. */
static bool
xtensa_mode_dependent_address_p (const_rtx addr)
{
return constantpool_address_p (addr);
}
/* Helper for xtensa_tls_referenced_p. */ /* Helper for xtensa_tls_referenced_p. */
......
...@@ -695,20 +695,6 @@ typedef struct xtensa_args ...@@ -695,20 +695,6 @@ typedef struct xtensa_args
&& GET_CODE (X) != LABEL_REF \ && GET_CODE (X) != LABEL_REF \
&& GET_CODE (X) != CONST) && GET_CODE (X) != CONST)
/* Treat constant-pool references as "mode dependent" since they can
only be accessed with SImode loads. This works around a bug in the
combiner where a constant pool reference is temporarily converted
to an HImode load, which is then assumed to zero-extend based on
our definition of LOAD_EXTEND_OP. This is wrong because the high
bits of a 16-bit value in the constant pool are now sign-extended
by default. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
do { \
if (constantpool_address_p (ADDR)) \
goto LABEL; \
} while (0)
/* Specify the machine mode that this machine uses /* Specify the machine mode that this machine uses
for the index in the tablejump instruction. */ for the index in the tablejump instruction. */
#define CASE_VECTOR_MODE (SImode) #define CASE_VECTOR_MODE (SImode)
......
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