Commit eb8e00ea by Bob Wilson Committed by Bob Wilson

xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Treat constant-pool addresses as "mode-dependent".

        * config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Treat
        constant-pool addresses as "mode-dependent".
        (GO_IF_LEGITIMATE_ADDRESS): Rename macro arguments.

From-SVN: r50984
parent 71c6877d
2002-03-18 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Treat
constant-pool addresses as "mode-dependent".
(GO_IF_LEGITIMATE_ADDRESS): Rename macro arguments.
2002-03-18 Jakub Jelinek <jakub@redhat.com> 2002-03-18 Jakub Jelinek <jakub@redhat.com>
PR target/5740 PR target/5740
......
...@@ -1145,21 +1145,21 @@ typedef struct xtensa_args { ...@@ -1145,21 +1145,21 @@ typedef struct xtensa_args {
#define MAX_REGS_PER_ADDRESS 1 #define MAX_REGS_PER_ADDRESS 1
/* Identify valid Xtensa addresses. */ /* Identify valid Xtensa addresses. */
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ #define GO_IF_LEGITIMATE_ADDRESS(MODE, ADDR, LABEL) \
do { \ do { \
rtx xinsn = (X); \ rtx xinsn = (ADDR); \
\ \
/* allow constant pool addresses */ \ /* allow constant pool addresses */ \
if ((MODE) != BLKmode && GET_MODE_SIZE (MODE) >= UNITS_PER_WORD \ if ((MODE) != BLKmode && GET_MODE_SIZE (MODE) >= UNITS_PER_WORD \
&& constantpool_address_p (xinsn)) \ && constantpool_address_p (xinsn)) \
goto ADDR; \ goto LABEL; \
\ \
while (GET_CODE (xinsn) == SUBREG) \ while (GET_CODE (xinsn) == SUBREG) \
xinsn = SUBREG_REG (xinsn); \ xinsn = SUBREG_REG (xinsn); \
\ \
/* allow base registers */ \ /* allow base registers */ \
if (GET_CODE (xinsn) == REG && REG_OK_FOR_BASE_P (xinsn)) \ if (GET_CODE (xinsn) == REG && REG_OK_FOR_BASE_P (xinsn)) \
goto ADDR; \ goto LABEL; \
\ \
/* check for "register + offset" addressing */ \ /* check for "register + offset" addressing */ \
if (GET_CODE (xinsn) == PLUS) \ if (GET_CODE (xinsn) == PLUS) \
...@@ -1190,7 +1190,7 @@ typedef struct xtensa_args { ...@@ -1190,7 +1190,7 @@ typedef struct xtensa_args {
&& code1 == CONST_INT \ && code1 == CONST_INT \
&& xtensa_mem_offset (INTVAL (xplus1), (MODE))) \ && xtensa_mem_offset (INTVAL (xplus1), (MODE))) \
{ \ { \
goto ADDR; \ goto LABEL; \
} \ } \
} \ } \
} while (0) } while (0)
...@@ -1249,7 +1249,19 @@ typedef struct xtensa_args { ...@@ -1249,7 +1249,19 @@ typedef struct xtensa_args {
} while (0) } while (0)
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) {} /* 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)
/* If we are referencing a function that is static, make the SYMBOL_REF /* If we are referencing a function that is static, make the SYMBOL_REF
special so that we can generate direct calls to it even with -fpic. */ special so that we can generate direct calls to it even with -fpic. */
......
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