OSDN Git Service

* config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Treat
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Mar 2002 18:20:19 +0000 (18:20 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Mar 2002 18:20:19 +0000 (18:20 +0000)
        constant-pool addresses as "mode-dependent".
        (GO_IF_LEGITIMATE_ADDRESS): Rename macro arguments.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50984 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/xtensa/xtensa.h

index e7ff6b2..615d43e 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR target/5740
index 9606bb3..4cd8616 100644 (file)
@@ -1145,21 +1145,21 @@ typedef struct xtensa_args {
 #define MAX_REGS_PER_ADDRESS 1
 
 /* Identify valid Xtensa addresses.  */
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                                \
+#define GO_IF_LEGITIMATE_ADDRESS(MODE, ADDR, LABEL)                    \
   do {                                                                 \
-    rtx xinsn = (X);                                                   \
+    rtx xinsn = (ADDR);                                                        \
                                                                        \
     /* allow constant pool addresses */                                        \
     if ((MODE) != BLKmode && GET_MODE_SIZE (MODE) >= UNITS_PER_WORD    \
        && constantpool_address_p (xinsn))                              \
-      goto ADDR;                                                       \
+      goto LABEL;                                                      \
                                                                        \
     while (GET_CODE (xinsn) == SUBREG)                                 \
       xinsn = SUBREG_REG (xinsn);                                      \
                                                                        \
     /* allow base registers */                                         \
     if (GET_CODE (xinsn) == REG && REG_OK_FOR_BASE_P (xinsn))          \
-      goto ADDR;                                                       \
+      goto LABEL;                                                      \
                                                                        \
     /* check for "register + offset" addressing */                     \
     if (GET_CODE (xinsn) == PLUS)                                      \
@@ -1190,7 +1190,7 @@ typedef struct xtensa_args {
            && code1 == CONST_INT                                       \
            && xtensa_mem_offset (INTVAL (xplus1), (MODE)))             \
          {                                                             \
-           goto ADDR;                                                  \
+           goto LABEL;                                                 \
          }                                                             \
       }                                                                        \
   } while (0)
@@ -1249,7 +1249,19 @@ typedef struct xtensa_args {
   } 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
    special so that we can generate direct calls to it even with -fpic.  */