OSDN Git Service

gcc/
authorshinwell <shinwell@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Dec 2006 16:37:42 +0000 (16:37 +0000)
committershinwell <shinwell@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Dec 2006 16:37:42 +0000 (16:37 +0000)
* recog.c (mode_dependent_address_p): Identify pre-increment,
pre-decrement, post-increment and post-decrement addressing as always
being mode-dependent.
* config/m32c/m32c.c (m32c_mode_dependent_address): Delete.
* config/m32c/m32c.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/m32c/m32c-protos.h (m32c_mode_dependent_address): Delete.
* config/m32r/m32r.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
PRE_INC and POST_INC checks.
* config/i386/i386.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/sh/sh.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/pdp11/pdp11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/avr/avr.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/c4x/c4x.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
PRE_INC, POST_DEC and POST_INC cases.
* config/stormy16/stormy16.c (xstormy16_mode_dependent_address_p):
Delete POST_INC and PRE_DEC cases.
* config/m68hc11/m68hc11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
no-op.
* config/cris/cris.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/mn10300/mn10300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
no-op.
* config/ia64/ia64.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/m68k/m68k.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/rs6000/rs6000.c (rs6000_mode_dependent_address): Delete
PRE_INC and PRE_DEC cases.
* config/arc/arc.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/mcore/mcore.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/arm/arm.h (ARM_GO_IF_MODE_DEPENDENT_ADDRESS): Delete.
(GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/pa/pa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/vax/vax.c (vax_mode_dependent_address_p): Delete
auto-increment cases.
* config/h8300/h8300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete
auto-increment cases.
* config/bfin/bfin.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.

gcc/testsuite/
* gcc.c-torture/execute/mode-dependent-address.c: New test.

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

27 files changed:
gcc/ChangeLog
gcc/config/arc/arc.h
gcc/config/avr/avr.h
gcc/config/bfin/bfin.h
gcc/config/c4x/c4x.h
gcc/config/cris/cris.h
gcc/config/crx/crx.h
gcc/config/h8300/h8300.h
gcc/config/i386/i386.h
gcc/config/ia64/ia64.h
gcc/config/m32c/m32c-protos.h
gcc/config/m32c/m32c.c
gcc/config/m32c/m32c.h
gcc/config/m32r/m32r.h
gcc/config/m68hc11/m68hc11.h
gcc/config/m68k/m68k.h
gcc/config/mcore/mcore.h
gcc/config/mn10300/mn10300.h
gcc/config/pa/pa.h
gcc/config/pdp11/pdp11.h
gcc/config/rs6000/rs6000.c
gcc/config/sh/sh.h
gcc/config/stormy16/stormy16.c
gcc/config/vax/vax.c
gcc/recog.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/mode-dependent-address.c [new file with mode: 0644]

index dbd4e8a..ca6a05f 100644 (file)
@@ -1,3 +1,41 @@
+2006-12-08  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * recog.c (mode_dependent_address_p): Identify pre-increment,
+       pre-decrement, post-increment and post-decrement addressing as always
+       being mode-dependent.
+       * config/m32c/m32c.c (m32c_mode_dependent_address): Delete.
+       * config/m32c/m32c.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/m32c/m32c-protos.h (m32c_mode_dependent_address): Delete.
+       * config/m32r/m32r.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
+       PRE_INC and POST_INC checks.
+       * config/i386/i386.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/sh/sh.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/pdp11/pdp11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/avr/avr.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/c4x/c4x.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
+       PRE_INC, POST_DEC and POST_INC cases.
+       * config/stormy16/stormy16.c (xstormy16_mode_dependent_address_p):
+       Delete POST_INC and PRE_DEC cases.
+       * config/m68hc11/m68hc11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
+       no-op.
+       * config/cris/cris.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/mn10300/mn10300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
+       no-op.
+       * config/ia64/ia64.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/m68k/m68k.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/rs6000/rs6000.c (rs6000_mode_dependent_address): Delete
+       PRE_INC and PRE_DEC cases.
+       * config/arc/arc.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/mcore/mcore.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/arm/arm.h (ARM_GO_IF_MODE_DEPENDENT_ADDRESS): Delete.
+       (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/pa/pa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+       * config/vax/vax.c (vax_mode_dependent_address_p): Delete
+       auto-increment cases.
+       * config/h8300/h8300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete
+       auto-increment cases.
+       * config/bfin/bfin.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
+
 2006-12-08  Andrew MacLeod  <amacleod@redhat.com>
 
        * Makefile.in: Add new file tree-ssa-ter.c.
index c7253b1..9b9f2d6 100644 (file)
@@ -799,12 +799,7 @@ do { \
 
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
-{ if (GET_CODE (ADDR) == PRE_DEC)      \
-    goto LABEL;                                \
-  if (GET_CODE (ADDR) == PRE_INC)      \
-    goto LABEL;                                \
-}
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
 \f
 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
    return the mode to be used for the comparison.  */
index 48a5933..724a213 100644 (file)
@@ -423,9 +423,7 @@ do {                                                                            \
     }                                                                      \
 } while(0)
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)                       \
-      if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC)   \
-        goto LABEL
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 #define LEGITIMATE_CONSTANT_P(X) 1
 
index bbf3ade..9b9b78a 100644 (file)
@@ -827,13 +827,7 @@ do {                                              \
 
      You may assume that ADDR is a valid address for the machine.
 */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  \
-do {                                              \
- if (GET_CODE (ADDR) == POST_INC                  \
-     || GET_CODE (ADDR) == POST_DEC               \
-     || GET_CODE (ADDR) == PRE_DEC)               \
-   goto LABEL;                                   \
-} while (0)
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 #define NOTICE_UPDATE_CC(EXPR, INSN) 0
 
index 22904e1..6df7ac8 100644 (file)
@@ -1156,13 +1156,8 @@ CUMULATIVE_ARGS;
 }
 
 /* No mode-dependent addresses on the C4x are autoincrements.  */
-
 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)      \
-  if (GET_CODE (ADDR) == PRE_DEC       \
-      || GET_CODE (ADDR) == POST_DEC   \
-      || GET_CODE (ADDR) == PRE_INC    \
-      || GET_CODE (ADDR) == POST_INC   \
-      || GET_CODE (ADDR) == POST_MODIFY        \
+  if (GET_CODE (ADDR) == POST_MODIFY   \
       || GET_CODE (ADDR) == PRE_MODIFY)        \
     goto LABEL
 
index 10a17dc..88bc3e1 100644 (file)
@@ -1065,14 +1065,9 @@ struct cum_args {int regs;};
   while (0)
 
 /* In CRIS, only the postincrement address mode depends thus,
-   since the increment depends on the size of the operand.  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)      \
-  do                                                   \
-    {                                                  \
-      if (GET_CODE (ADDR) == POST_INC)                 \
-       goto LABEL;                                     \
-    }                                                  \
-  while (0)
+   since the increment depends on the size of the operand.  This is now
+   treated generically within recog.c.  */
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
 
 #define LEGITIMATE_CONSTANT_P(X) 1
 
index 9277a28..d482bb3 100644 (file)
@@ -405,11 +405,7 @@ struct cumulative_args
 }
 #endif /* REG_OK_STRICT */
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)                      \
-{                                                                      \
-  if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == POST_DEC)      \
-    goto LABEL;                                                                \
-}
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
 
 #define LEGITIMATE_CONSTANT_P(X)  1
 
index cf64b09..7c9a241 100644 (file)
@@ -939,11 +939,6 @@ struct cum_arg
    (the amount of decrement or increment being the length of the operand).  */
 
 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
-  if (GET_CODE (ADDR) == POST_INC \
-      || GET_CODE (ADDR) == POST_DEC \
-      || GET_CODE (ADDR) == PRE_INC \
-      || GET_CODE (ADDR) == PRE_DEC) \
-    goto LABEL; \
   if (GET_CODE (ADDR) == PLUS \
       && h8300_get_index (XEXP (ADDR, 0), VOIDmode, 0) != XEXP (ADDR, 0)) \
     goto LABEL;
index 78b963b..dc15a2b 100644 (file)
@@ -1767,13 +1767,9 @@ do {                                                                     \
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.
    On the 80386, only postdecrement and postincrement address depend thus
-   (the amount of decrement or increment being the length of the operand).  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)      \
-do {                                                   \
- if (GET_CODE (ADDR) == POST_INC                       \
-     || GET_CODE (ADDR) == POST_DEC)                   \
-   goto LABEL;                                         \
-} while (0)
+   (the amount of decrement or increment being the length of the operand).
+   These are now caught in recog.c.  */
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
 \f
 /* Max number of args passed in registers.  If this is more than 3, we will
    have problems with ebx (register #4), since it is a caller save register and
index 327a313..c6d2c0d 100644 (file)
@@ -1406,9 +1406,7 @@ do {                                                                      \
    on the machine mode of the memory reference it is used for or if the address
    is valid for some modes but not others.  */
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)                      \
-  if (GET_CODE (ADDR) == POST_DEC || GET_CODE (ADDR) == POST_INC)      \
-    goto LABEL;
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
 
 /* A C expression that is nonzero if X is a legitimate constant for an
    immediate operand on the target machine.  */
index 06bd007..4b3ead3 100644 (file)
@@ -84,7 +84,6 @@ int  m32c_legitimize_reload_address (rtx *, MM, int, int, int);
 rtx  m32c_libcall_value (MM);
 int  m32c_limit_reload_class (MM, int);
 int  m32c_memory_move_cost (MM, int, int);
-int  m32c_mode_dependent_address (rtx);
 int  m32c_modes_tieable_p (MM, MM);
 bool m32c_mov_ok (rtx *, MM);
 char * m32c_output_compare (rtx, rtx *);
index dcfbe6e..de5f22a 100644 (file)
@@ -2018,15 +2018,6 @@ m32c_legitimize_reload_address (rtx * x,
   return 0;
 }
 
-/* Used in GO_IF_MODE_DEPENDENT_ADDRESS.  */
-int
-m32c_mode_dependent_address (rtx addr)
-{
-  if (GET_CODE (addr) == POST_INC || GET_CODE (addr) == PRE_DEC)
-    return 1;
-  return 0;
-}
-
 /* Implements LEGITIMATE_CONSTANT_P.  We split large constants anyway,
    so we can allow anything.  */
 int
index 1b1d357..1055464 100644 (file)
@@ -568,9 +568,7 @@ typedef struct m32c_cumulative_args
        if (m32c_legitimize_reload_address(&(X),MODE,OPNUM,TYPE,IND_LEVELS)) \
          goto win;
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
-       if (m32c_mode_dependent_address (ADDR)) \
-         goto LABEL;
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 #define LEGITIMATE_CONSTANT_P(X) m32c_legitimate_constant_p (X)
 
index beef7c9..b4c9ae6 100644 (file)
@@ -1267,10 +1267,7 @@ L2:     .word STATIC
 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)              \
   do                                                           \
     {                                                          \
-      if (   GET_CODE (ADDR) == PRE_DEC                                \
-         || GET_CODE (ADDR) == PRE_INC                         \
-         || GET_CODE (ADDR) == POST_INC                        \
-         || GET_CODE (ADDR) == LO_SUM)                         \
+      if (GET_CODE (ADDR) == LO_SUM)                           \
        goto LABEL;                                             \
     }                                                          \
   while (0)
index 008887b..a1dc509 100644 (file)
@@ -1239,12 +1239,7 @@ extern unsigned char m68hc11_reg_valid_for_index[FIRST_PSEUDO_REGISTER];
 
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  \
-{                                                                      \
-  if (GET_CODE (ADDR) == PRE_DEC || GET_CODE (ADDR) == POST_DEC                \
-      || GET_CODE (ADDR) == PRE_INC || GET_CODE (ADDR) == POST_INC)    \
-    goto LABEL;                                                                \
-}
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 /* Nonzero if the constant value X is a legitimate general operand.
    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
index e4d9257..0a04beb 100644 (file)
@@ -845,9 +845,9 @@ __transfer_from_trampoline ()                                       \
          goto WIN; }}}
 
 /* On the 68000, only predecrement and postincrement address depend thus
-   (the amount of decrement or increment being the length of the operand).  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)       \
- if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC) goto LABEL
+   (the amount of decrement or increment being the length of the operand).
+   These are now treated generically in recog.c.  */
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 \f
 #define CASE_VECTOR_MODE HImode
 #define CASE_VECTOR_PC_RELATIVE 1
index fd1ba70..5e2d8ca 100644 (file)
@@ -786,12 +786,7 @@ extern const enum reg_class reg_class_from_letter[];
                                                                   
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.  */
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  \
-{                                                                      \
-  if (   GET_CODE (ADDR) == PRE_DEC || GET_CODE (ADDR) == POST_DEC     \
-      || GET_CODE (ADDR) == PRE_INC || GET_CODE (ADDR) == POST_INC)    \
-    goto LABEL;                                                                \
-}
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 /* Specify the machine mode that this machine uses
    for the index in the tablejump instruction.  */
index ef153e7..6c51152 100644 (file)
@@ -779,9 +779,7 @@ while (0)
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.  */
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)        \
-  if (GET_CODE (ADDR) == POST_INC) \
-    goto LABEL
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 /* Nonzero if the constant value X is a legitimate general operand.
    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
index 1f57650..f463faf 100644 (file)
@@ -1560,12 +1560,7 @@ do {                                                                     \
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.  */
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)       \
-  if (GET_CODE (ADDR) == PRE_DEC       \
-      || GET_CODE (ADDR) == POST_DEC   \
-      || GET_CODE (ADDR) == PRE_INC    \
-      || GET_CODE (ADDR) == POST_INC)  \
-    goto LABEL
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 \f
 #define TARGET_ASM_SELECT_SECTION  pa_select_section
 
index 09de325..2850fc2 100644 (file)
@@ -760,12 +760,10 @@ extern int may_call_alloca;
 \f
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.
-   On the pdp this is for predec/postinc */
+   On the pdp this is for predec/postinc, and this is now treated
+   generically in recog.c.  */
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)       \
- { if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC)      \
-     goto LABEL;                                                       \
- }
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 
 \f
 /* Specify the machine mode that this machine uses
index 08b3d01..a773483 100644 (file)
@@ -3766,9 +3766,7 @@ rs6000_mode_dependent_address (rtx addr)
     case LO_SUM:
       return true;
 
-    case PRE_INC:
-    case PRE_DEC:
-      return TARGET_UPDATE;
+    /* Auto-increment cases are now treated generically in recog.c.  */
 
     default:
       break;
index 5f8412f..ae9d8f9 100644 (file)
@@ -2802,13 +2802,11 @@ struct sh_args {
    ??? Strictly speaking, we should also include all indexed addressing,
    because the index scale factor is the length of the operand.
    However, the impact of GO_IF_MODE_DEPENDENT_ADDRESS would be to
-   high if we did that.  So we rely on reload to fix things up.  */
+   high if we did that.  So we rely on reload to fix things up.
 
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)                       \
-{                                                                      \
-  if (GET_CODE(ADDR) == PRE_DEC || GET_CODE(ADDR) == POST_INC)         \
-    goto LABEL;                                                                \
-}
+   Auto-increment addressing is now treated in recog.c.  */
+
+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
 \f
 /* Specify the machine mode that this machine uses
    for the index in the tablejump instruction.  */
index 00b6e64..5f8be43 100644 (file)
@@ -707,9 +707,7 @@ xstormy16_mode_dependent_address_p (rtx x)
   if (GET_CODE (x) == PLUS)
     x = XEXP (x, 0);
 
-  if (GET_CODE (x) == POST_INC
-      || GET_CODE (x) == PRE_DEC)
-    return 1;
+  /* Auto-increment addresses are now treated generically in recog.c.  */
 
   return 0;
 }
index f005a2a..5ce9ad3 100644 (file)
@@ -1306,8 +1306,8 @@ vax_mode_dependent_address_p (rtx x)
 {
   rtx xfoo0, xfoo1;
 
-  if (GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_DEC)
-    return 1;
+  /* Auto-increment cases are now dealt with generically in recog.c.  */
+
   if (GET_CODE (x) != PLUS)
     return 0;
 
index 18ad72f..a7dc869 100644 (file)
@@ -1983,8 +1983,17 @@ offsettable_address_p (int strictp, enum machine_mode mode, rtx y)
    because the amount of the increment depends on the mode.  */
 
 int
-mode_dependent_address_p (rtx addr ATTRIBUTE_UNUSED /* Maybe used in GO_IF_MODE_DEPENDENT_ADDRESS.  */)
-{
+mode_dependent_address_p (rtx addr)
+{
+  /* Auto-increment addressing with anything other than post_modify
+     or pre_modify always introduces a mode dependency.  Catch such
+     cases now instead of deferring to the target.  */
+  if (GET_CODE (addr) == PRE_INC
+      || GET_CODE (addr) == POST_INC
+      || GET_CODE (addr) == PRE_DEC
+      || GET_CODE (addr) == POST_DEC)
+    return 1;
+
   GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
   return 0;
   /* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS.  */
index fbeef25..c86dcd2 100644 (file)
@@ -1,3 +1,7 @@
+2006-12-08  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * gcc.c-torture/execute/mode-dependent-address.c: New test.
+
 2006-12-08  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/27546
diff --git a/gcc/testsuite/gcc.c-torture/execute/mode-dependent-address.c b/gcc/testsuite/gcc.c-torture/execute/mode-dependent-address.c
new file mode 100644 (file)
index 0000000..5bf840c
--- /dev/null
@@ -0,0 +1,49 @@
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+void f883b (int8_t * result,
+    int16_t * __restrict arg1,
+    uint32_t * __restrict arg2,
+    uint64_t * __restrict arg3,
+    uint8_t * __restrict arg4)
+{
+    int idx;
+    for (idx=0;idx<96;idx += 1) {
+       result[idx] = (((((((((((-27 + 2+1)>>1) || arg4[idx]) < arg1[idx])
+                               ? (((-27 + 2+1)>>1) || arg4[idx])
+                               : arg1[idx])
+                              >> (arg2[idx] & 31)) ^ 1) - -32)>>7) | -5) & arg3[idx]);
+    }
+}
+
+int8_t result[96];
+int16_t arg1[96];
+uint32_t arg2[96];
+uint64_t arg3[96];
+uint8_t arg4[96];
+
+int main (void) 
+{
+  int i;
+  int correct[] = {0x0,0x1,0x2,0x3,0x0,0x1,0x2,0x3,0x8,0x9,0xa,0xb,0x8,0x9,
+                   0xa,0xb,0x10,0x11,0x12,0x13,0x10,0x11,0x12,0x13,
+                   0x18,0x19,0x1a,0x1b,0x18,0x19,0x1a,0x1b,0x20,0x21,0x22,
+                   0x23,0x20,0x21,0x22,0x23,0x28,0x29,0x2a,
+                   0x2b,0x28,0x29,0x2a,0x2b,0x30,0x31,0x32,0x33,
+                   0x30,0x31,0x32,0x33,0x38,0x39,0x3a,0x3b,0x38,0x39,0x3a,
+                   0x3b,0x40,0x41,0x42,0x43,0x40,0x41,0x42,0x43,0x48,0x49,
+                   0x4a,0x4b,0x48,0x49,0x4a,0x4b,0x50,0x51,
+                   0x52,0x53,0x50,0x51,0x52,0x53,0x58,0x59,0x5a,0x5b,
+                   0x58,0x59,0x5a,0x5b};
+
+  for (i=0; i < 96; i++)
+    arg3[i] = arg2[i] = arg1[i] = arg4[i] = i;
+
+  f883b(result, arg1, arg2, arg3, arg4);
+
+  for (i=0; i < 96; i++)
+    if (result[i] != correct[i]) abort();
+
+  return 0;
+}