diff options
author | Anatoly Sokolov <aesok@post.ru> | 2011-01-20 20:37:13 +0300 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2011-01-20 20:37:13 +0300 |
commit | a1a797686428f8fab7aa88035683f2d58e00493e (patch) | |
tree | 9a884cc8f66b70d97eb44b3d4d619730594218e9 | |
parent | 427f6cec9c82ea688d821fd2e8d05197d8a1792f (diff) | |
download | gcc-a1a797686428f8fab7aa88035683f2d58e00493e.zip gcc-a1a797686428f8fab7aa88035683f2d58e00493e.tar.gz gcc-a1a797686428f8fab7aa88035683f2d58e00493e.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.c | 36 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.h | 14 |
4 files changed, 37 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dcc3530..ccb76d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +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> PR debug/46583 diff --git a/gcc/config/xtensa/xtensa-protos.h b/gcc/config/xtensa/xtensa-protos.h index 356e0f1..5db4e4e 100644 --- a/gcc/config/xtensa/xtensa-protos.h +++ b/gcc/config/xtensa/xtensa-protos.h @@ -36,7 +36,6 @@ extern bool xtensa_mem_offset (unsigned, enum machine_mode); extern int xt_true_regnum (rtx); extern int xtensa_valid_move (enum machine_mode, rtx *); extern int smalloffset_mem_p (rtx); -extern int constantpool_address_p (rtx); extern int constantpool_mem_p (rtx); extern void xtensa_extend_reg (rtx, rtx); extern void xtensa_expand_conditional_branch (rtx *, enum machine_mode); diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index 7e244e2..85dac15 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -126,6 +126,7 @@ static rtx fixup_subreg_mem (rtx); static struct machine_function * xtensa_init_machine_status (void); static rtx xtensa_legitimize_tls_address (rtx); 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 void printx (FILE *, signed int); static void xtensa_function_epilogue (FILE *, HOST_WIDE_INT); @@ -161,6 +162,8 @@ static void xtensa_asm_trampoline_template (FILE *); static void xtensa_trampoline_init (rtx, tree, 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] = REG_ALLOC_ORDER; @@ -201,6 +204,8 @@ static const struct default_options xtensa_option_optimization_table[] = #undef TARGET_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 #define TARGET_RTX_COSTS xtensa_rtx_costs @@ -494,10 +499,10 @@ smalloffset_mem_p (rtx op) } -int -constantpool_address_p (rtx addr) +static bool +constantpool_address_p (const_rtx addr) { - rtx sym = addr; + const_rtx sym = addr; if (GET_CODE (addr) == CONST) { @@ -506,21 +511,21 @@ constantpool_address_p (rtx addr) /* Only handle (PLUS (SYM, OFFSET)) form. */ addr = XEXP (addr, 0); if (GET_CODE (addr) != PLUS) - return FALSE; + return false; /* Make sure the address is word aligned. */ offset = XEXP (addr, 1); - if ((GET_CODE (offset) != CONST_INT) + if ((!CONST_INT_P (offset)) || ((INTVAL (offset) & 3) != 0)) - return FALSE; + return false; sym = XEXP (addr, 0); } if ((GET_CODE (sym) == SYMBOL_REF) && CONSTANT_POOL_ADDRESS_P (sym)) - return TRUE; - return FALSE; + return true; + return false; } @@ -1937,6 +1942,21 @@ xtensa_legitimize_address (rtx 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. */ diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index e465e8f..3d498e1 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -695,20 +695,6 @@ typedef struct xtensa_args && GET_CODE (X) != LABEL_REF \ && 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 for the index in the tablejump instruction. */ #define CASE_VECTOR_MODE (SImode) |