OSDN Git Service

* haifa-sched.c: Convert to target hooks. Macros replaced
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.h
index a520b57..bc3f788 100644 (file)
@@ -30,10 +30,16 @@ Boston, MA 02111-1307, USA.  */
 #define OBJECT_XCOFF 1
 #define OBJECT_ELF 2
 #define OBJECT_PEF 3
+#define OBJECT_MACHO 4
 
 #define TARGET_ELF (TARGET_OBJECT_FORMAT == OBJECT_ELF)
-#define TARGET_AIX (TARGET_OBJECT_FORMAT == OBJECT_XCOFF)
+#define TARGET_XCOFF (TARGET_OBJECT_FORMAT == OBJECT_XCOFF)
 #define TARGET_MACOS (TARGET_OBJECT_FORMAT == OBJECT_PEF)
+#define TARGET_MACHO (TARGET_OBJECT_FORMAT == OBJECT_MACHO)
+
+#ifndef TARGET_AIX
+#define TARGET_AIX 0
+#endif
 
 /* Print subsidiary information on the compiler version in use.  */
 #define TARGET_VERSION ;
@@ -79,8 +85,6 @@ Boston, MA 02111-1307, USA.  */
 %{mcpu=823: -D_ARCH_PPC} \
 %{mcpu=860: -D_ARCH_PPC}"
 
-#define CPP_DEFAULT_SPEC "-D_ARCH_PWR"
-
 /* Common ASM definitions used by ASM_SPEC among the various targets
    for handling -mcpu=xxx switches.  */
 #define ASM_CPU_SPEC \
@@ -117,6 +121,8 @@ Boston, MA 02111-1307, USA.  */
 %{mcpu=823: -mppc} \
 %{mcpu=860: -mppc}"
 
+#define CPP_DEFAULT_SPEC ""
+
 #define ASM_DEFAULT_SPEC ""
 
 /* This macro defines names of additional specifications to put in the specs
@@ -572,13 +578,6 @@ extern int rs6000_debug_arg;               /* debug argument handling */
 /* Handle #pragma pack.  */
 #define HANDLE_PRAGMA_PACK 1
 
-/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints.  */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
-  (TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
-             ? get_inner_array_type (FIELD) \
-             : TREE_TYPE (FIELD)) == DFmode \
-   ? MIN ((COMPUTED), 32) : (COMPUTED))
-
 /* Alignment of field after `int : 0' in a structure.  */
 #define EMPTY_FIELD_BOUNDARY 32
 
@@ -588,17 +587,6 @@ extern int rs6000_debug_arg;               /* debug argument handling */
 /* A bitfield declared as `int' forces `int' alignment for the struct.  */
 #define PCC_BITFIELD_TYPE_MATTERS 1
 
-/* AIX increases natural record alignment to doubleword if the first
-   field is an FP double while the FP fields remain word aligned.  */
-#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)  \
-  ((TREE_CODE (STRUCT) == RECORD_TYPE                  \
-    || TREE_CODE (STRUCT) == UNION_TYPE                        \
-    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)          \
-   && TYPE_FIELDS (STRUCT) != 0                                \
-   && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode       \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), BIGGEST_ALIGNMENT) \
-   : MAX ((COMPUTED), (SPECIFIED)))
-
 /* Make strings word-aligned so strcpy from constants will be faster.  */
 #define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
   (TREE_CODE (EXP) == STRING_CST       \
@@ -794,7 +782,7 @@ extern int rs6000_debug_arg;                /* debug argument handling */
    registers is expensive.  */
 
 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2)               \
-  ((CLASS1) == FLOAT_REGS && (CLASS2) == FLOAT_REGS ? 2                \
+   ((CLASS1) == FLOAT_REGS && (CLASS2) == FLOAT_REGS ? 2               \
    : (CLASS1) == FLOAT_REGS && (CLASS2) != FLOAT_REGS ? 10     \
    : (CLASS1) != FLOAT_REGS && (CLASS2) == FLOAT_REGS ? 10     \
    : (((CLASS1) == SPECIAL_REGS || (CLASS1) == MQ_REGS         \
@@ -824,24 +812,6 @@ extern int rs6000_debug_arg;               /* debug argument handling */
 
 #define BRANCH_COST 3
 
-/* A C statement (sans semicolon) to update the integer variable COST
-   based on the relationship between INSN that is dependent on
-   DEP_INSN through the dependence LINK.  The default is to make no
-   adjustment to COST.  On the RS/6000, ignore the cost of anti- and
-   output-dependencies.  In fact, output dependencies on the CR do have
-   a cost, but it is probably not worthwhile to track it.  */
-
-#define ADJUST_COST(INSN, LINK, DEP_INSN, COST)                                \
-  (COST) = rs6000_adjust_cost (INSN,LINK,DEP_INSN,COST)
-
-/* A C statement (sans semicolon) to update the integer scheduling priority
-   INSN_PRIORITY (INSN).  Reduce the priority to execute the INSN earlier,
-   increase the priority to execute INSN later.  Do not define this macro if
-   you do not need to adjust the scheduling priorities of insns.  */
-
-#define ADJUST_PRIORITY(INSN)                                          \
-  INSN_PRIORITY (INSN) = rs6000_adjust_priority (INSN, INSN_PRIORITY (INSN))
-
 /* Define this macro to change register usage conditional on target flags.
    Set MQ register fixed (already call_used) if not POWER architecture
    (RIOS1, RIOS2, RSC, and PPC601) so that it will not be allocated.
@@ -861,6 +831,10 @@ extern int rs6000_debug_arg;               /* debug argument handling */
       && flag_pic == 1)                                                        \
     fixed_regs[PIC_OFFSET_TABLE_REGNUM]                                        \
       = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;                   \
+  if (DEFAULT_ABI == ABI_DARWIN && flag_pic)                           \
+    global_regs[PIC_OFFSET_TABLE_REGNUM]                               \
+      = fixed_regs[PIC_OFFSET_TABLE_REGNUM]                            \
+        = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;                 \
 }
 
 /* Specify the registers used for certain standard purposes.
@@ -1044,7 +1018,7 @@ enum reg_class
    `K' is a constant with only the low-order 16 bits non-zero
    `L' is a signed 16-bit constant shifted left 16 bits
    `M' is a constant that is greater than 31
-   `N' is a constant that is an exact power of two
+   `N' is a positive constant that is an exact power of two
    `O' is the constant zero
    `P' is a constant whose negation is a signed 16-bit constant */
 
@@ -1055,7 +1029,7 @@ enum reg_class
    : (C) == 'L' ? (((VALUE) & 0xffff) == 0                             \
                   && ((VALUE) >> 31 == -1 || (VALUE) >> 31 == 0))      \
    : (C) == 'M' ? (VALUE) > 31                                         \
-   : (C) == 'N' ? exact_log2 (VALUE) >= 0                              \
+   : (C) == 'N' ? (VALUE) > 0 && exact_log2 (VALUE) >= 0               \
    : (C) == 'O' ? (VALUE) == 0                                         \
    : (C) == 'P' ? (unsigned HOST_WIDE_INT) ((- (VALUE)) + 0x8000) < 0x10000 \
    : 0)
@@ -1159,7 +1133,8 @@ enum rs6000_abi {
   ABI_AIX,                     /* IBM's AIX */
   ABI_AIX_NODESC,              /* AIX calling sequence minus function descriptors */
   ABI_V4,                      /* System V.4/eabi */
-  ABI_SOLARIS                  /* Solaris */
+  ABI_SOLARIS,                 /* Solaris */
+  ABI_DARWIN                   /* Apple's Darwin (OS X kernel) */
 };
 
 extern enum rs6000_abi rs6000_current_abi;     /* available for use by subtarget */
@@ -1210,13 +1185,14 @@ typedef struct rs6000_stack {
 
 /* Size of the outgoing register save area */
 #define RS6000_REG_SAVE ((DEFAULT_ABI == ABI_AIX                       \
-                         || DEFAULT_ABI == ABI_AIX_NODESC)             \
+                         || DEFAULT_ABI == ABI_AIX_NODESC              \
+                         || DEFAULT_ABI == ABI_DARWIN)                 \
                         ? (TARGET_64BIT ? 64 : 32)                     \
                         : 0)
 
 /* Size of the fixed area on the stack */
 #define RS6000_SAVE_AREA \
-  (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_AIX_NODESC) ? 24 : 8)        \
+  (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_AIX_NODESC || DEFAULT_ABI == ABI_DARWIN) ? 24 : 8)   \
    << (TARGET_64BIT ? 1 : 0))
 
 /* MEM representing address to save the TOC register */
@@ -1351,7 +1327,8 @@ typedef struct rs6000_stack {
 #define        FP_ARG_AIX_MAX_REG 45
 #define        FP_ARG_V4_MAX_REG  40
 #define        FP_ARG_MAX_REG ((DEFAULT_ABI == ABI_AIX                         \
-                        || DEFAULT_ABI == ABI_AIX_NODESC)              \
+                        || DEFAULT_ABI == ABI_AIX_NODESC               \
+                        || DEFAULT_ABI == ABI_DARWIN)                  \
                        ? FP_ARG_AIX_MAX_REG : FP_ARG_V4_MAX_REG)
 #define FP_ARG_NUM_REG (FP_ARG_MAX_REG - FP_ARG_MIN_REG + 1)
 
@@ -1375,7 +1352,7 @@ typedef struct rs6000_stack {
 /* 1 if N is a possible register number for function argument passing.
    On RS/6000, these are r3-r10 and fp1-fp13.  */
 #define FUNCTION_ARG_REGNO_P(N)                                                \
-  (((unsigned)((N) - GP_ARG_MIN_REG) < (unsigned)(GP_ARG_NUM_REG))     \
+  ((unsigned)(((N) - GP_ARG_MIN_REG) < (unsigned)(GP_ARG_NUM_REG))     \
    || ((unsigned)((N) - FP_ARG_MIN_REG) < (unsigned)(FP_ARG_NUM_REG)))
 
 \f
@@ -1385,8 +1362,6 @@ typedef struct machine_function
 {
   /* Whether a System V.4 varargs area was created.  */
   int sysv_varargs_p;
-  /* Set if a return address rtx for loading from LR was created.  */
-  struct rtx_def *ra_rtx;
   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
   int ra_needs_full_frame;
 } machine_function;
@@ -1423,9 +1398,8 @@ typedef struct rs6000_args
 /* Define intermediate macro to compute the size (in registers) of an argument
    for the RS/6000.  */
 
-#define RS6000_ARG_SIZE(MODE, TYPE, NAMED)                             \
-(! (NAMED) ? 0                                                         \
- : (MODE) != BLKmode                                                   \
+#define RS6000_ARG_SIZE(MODE, TYPE)                                    \
+((MODE) != BLKmode                                                     \
  ? (GET_MODE_SIZE (MODE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD      \
  : ((unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE)                  \
     + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
@@ -1541,15 +1515,9 @@ typedef struct rs6000_args
 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
   rs6000_va_arg (valist, type)
 
-/* This macro generates the assembly code for function entry.
-   FILE is a stdio stream to output the code to.
-   SIZE is an int: how many units of temporary storage to allocate.
-   Refer to the array `regs_ever_live' to determine which registers
-   to save; `regs_ever_live[I]' is nonzero if register number I
-   is ever used in the function.  This macro is responsible for
-   knowing which registers should not be saved even if used.  */
-
-#define FUNCTION_PROLOGUE(FILE, SIZE) output_prolog (FILE, SIZE)
+/* Define this macro to be a nonzero value if the location where a function
+   argument is passed depends on whether or not it is a named argument.  */
+#define STRICT_ARGUMENT_NAMING 1
 
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  */
@@ -1573,20 +1541,9 @@ typedef struct rs6000_args
 #define        EPILOGUE_USES(REGNO)                                    \
   ((reload_completed && (REGNO) == LINK_REGISTER_REGNUM)       \
    || (current_function_calls_eh_return                                \
-       && TARGET_TOC                                           \
+       && TARGET_AIX                                           \
        && (REGNO) == TOC_REGISTER))
 
-/* This macro generates the assembly code for function exit,
-   on machines that need it.  If FUNCTION_EPILOGUE is not defined
-   then individual return instructions are generated for each
-   return statement.  Args are same as for FUNCTION_PROLOGUE.
-
-   The function epilogue should not depend on the current stack pointer!
-   It should use the frame pointer only.  This is mandatory because
-   of alloca; we also take advantage of it to omit stack adjustments
-   before returning.  */
-
-#define FUNCTION_EPILOGUE(FILE, SIZE) output_epilog (FILE, SIZE)
 \f
 /* TRAMPOLINE_TEMPLATE deleted */
 
@@ -1601,35 +1558,6 @@ typedef struct rs6000_args
 #define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, CXT)               \
   rs6000_initialize_trampoline (ADDR, FNADDR, CXT)
 \f
-/* If defined, a C expression whose value is nonzero if IDENTIFIER
-   with arguments ARGS is a valid machine specific attribute for DECL.
-   The attributes in ATTRIBUTES have previously been assigned to DECL.  */
-
-#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, NAME, ARGS) \
-  (rs6000_valid_decl_attribute_p (DECL, ATTRIBUTES, NAME, ARGS))
-
-/* If defined, a C expression whose value is nonzero if IDENTIFIER
-   with arguments ARGS is a valid machine specific attribute for TYPE.
-   The attributes in ATTRIBUTES have previously been assigned to TYPE.  */
-
-#define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, NAME, ARGS) \
-  (rs6000_valid_type_attribute_p (TYPE, ATTRIBUTES, NAME, ARGS))
-
-/* If defined, a C expression whose value is zero if the attributes on
-   TYPE1 and TYPE2 are incompatible, one if they are compatible, and
-   two if they are nearly compatible (which causes a warning to be
-   generated).  */
-
-#define COMP_TYPE_ATTRIBUTES(TYPE1, TYPE2) \
-  (rs6000_comp_type_attributes (TYPE1, TYPE2))
-
-/* If defined, a C statement that assigns default attributes to newly
-   defined TYPE.  */
-
-#define SET_DEFAULT_TYPE_ATTRIBUTES(TYPE) \
-  (rs6000_set_default_type_attributes (TYPE))
-
-\f
 /* Definitions for __builtin_return_address and __builtin_frame_address.
    __builtin_return_address (0) should give link register (65), enable
    this. */
@@ -1645,6 +1573,7 @@ typedef struct rs6000_args
    abi's store the return address.  */
 #define RETURN_ADDRESS_OFFSET                                          \
  ((DEFAULT_ABI == ABI_AIX                                              \
+   || DEFAULT_ABI == ABI_DARWIN                                                \
    || DEFAULT_ABI == ABI_AIX_NODESC)   ? (TARGET_32BIT ? 8 : 16) :     \
   (DEFAULT_ABI == ABI_V4                                               \
    || DEFAULT_ABI == ABI_SOLARIS)      ? (TARGET_32BIT ? 4 : 8) :      \
@@ -1776,26 +1705,28 @@ typedef struct rs6000_args
    After reload, it makes no difference, since pseudo regs have
    been eliminated by then.  */
 
-#ifndef REG_OK_STRICT
+#ifdef REG_OK_STRICT
+# define REG_OK_STRICT_FLAG 1
+#else
+# define REG_OK_STRICT_FLAG 0
+#endif
 
 /* Nonzero if X is a hard reg that can be used as an index
-   or if it is a pseudo reg.  */
-#define REG_OK_FOR_INDEX_P(X)                  \
-  (REGNO (X) <= 31 || REGNO (X) == 67 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
+   or if it is a pseudo reg in the non-strict case.  */
+#define INT_REG_OK_FOR_INDEX_P(X, STRICT)                      \
+  ((! (STRICT)                                                 \
+    && (REGNO (X) <= 31                                                \
+       || REGNO (X) == ARG_POINTER_REGNUM                      \
+       || REGNO (X) >= FIRST_PSEUDO_REGISTER))                 \
+   || ((STRICT) && REGNO_OK_FOR_INDEX_P (REGNO (X))))
 
 /* Nonzero if X is a hard reg that can be used as a base reg
-   or if it is a pseudo reg.  */
-#define REG_OK_FOR_BASE_P(X)                                    \
-  (REGNO (X) > 0 && REG_OK_FOR_INDEX_P (X))
+   or if it is a pseudo reg in the non-strict case.  */
+#define INT_REG_OK_FOR_BASE_P(X, STRICT)                       \
+  (REGNO (X) > 0 && INT_REG_OK_FOR_INDEX_P (X, (STRICT)))
 
-#else
-
-/* Nonzero if X is a hard reg that can be used as an index.  */
-#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
-/* Nonzero if X is a hard reg that can be used as a base reg.  */
-#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
-
-#endif
+#define REG_OK_FOR_INDEX_P(X) INT_REG_OK_FOR_INDEX_P (X, REG_OK_STRICT_FLAG)
+#define REG_OK_FOR_BASE_P(X)  INT_REG_OK_FOR_BASE_P (X, REG_OK_STRICT_FLAG)
 \f
 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
    that is a valid memory address for an instruction.
@@ -1832,68 +1763,51 @@ typedef struct rs6000_args
    && (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST)            \
    && small_data_operand (X, MODE))
 
-#define LEGITIMATE_ADDRESS_INTEGER_P(X,OFFSET)                         \
+#define LEGITIMATE_ADDRESS_INTEGER_P(X, OFFSET)                                \
  (GET_CODE (X) == CONST_INT                                            \
   && (unsigned HOST_WIDE_INT) (INTVAL (X) + (OFFSET) + 0x8000) < 0x10000)
 
-#define LEGITIMATE_OFFSET_ADDRESS_P(MODE,X)            \
- (GET_CODE (X) == PLUS                                 \
-  && GET_CODE (XEXP (X, 0)) == REG                     \
-  && REG_OK_FOR_BASE_P (XEXP (X, 0))                   \
-  && LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 0)     \
-  && (((MODE) != DFmode && (MODE) != DImode)           \
-      || (TARGET_32BIT                                 \
-         ? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 4) \
-         : ! (INTVAL (XEXP (X, 1)) & 3)))              \
-  && ((MODE) != TImode                                 \
-      || (TARGET_32BIT                                 \
-         ? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 12) \
-         : (LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 8) \
+#define LEGITIMATE_OFFSET_ADDRESS_P(MODE, X, STRICT)           \
+ (GET_CODE (X) == PLUS                                         \
+  && GET_CODE (XEXP (X, 0)) == REG                             \
+  && INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT))             \
+  && LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 0)             \
+  && (((MODE) != DFmode && (MODE) != DImode)                   \
+      || (TARGET_32BIT                                         \
+         ? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 4)       \
+         : ! (INTVAL (XEXP (X, 1)) & 3)))                      \
+  && ((MODE) != TImode                                         \
+      || (TARGET_32BIT                                         \
+         ? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 12)      \
+         : (LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 8)      \
             && ! (INTVAL (XEXP (X, 1)) & 3)))))
 
-#define LEGITIMATE_INDEXED_ADDRESS_P(X)                \
- (GET_CODE (X) == PLUS                         \
-  && GET_CODE (XEXP (X, 0)) == REG             \
-  && GET_CODE (XEXP (X, 1)) == REG             \
-  && ((REG_OK_FOR_BASE_P (XEXP (X, 0))         \
-       && REG_OK_FOR_INDEX_P (XEXP (X, 1)))    \
-      || (REG_OK_FOR_BASE_P (XEXP (X, 1))      \
-         && REG_OK_FOR_INDEX_P (XEXP (X, 0)))))
-
-#define LEGITIMATE_INDIRECT_ADDRESS_P(X)       \
-  (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))
-
-#define LEGITIMATE_LO_SUM_ADDRESS_P(MODE, X)           \
-  (TARGET_ELF                                          \
-   && ! flag_pic && ! TARGET_TOC                       \
-   && (MODE) != DImode                                 \
-   && (MODE) != TImode                                 \
-   && (TARGET_HARD_FLOAT || (MODE) != DFmode)          \
-   && GET_CODE (X) == LO_SUM                           \
-   && GET_CODE (XEXP (X, 0)) == REG                    \
-   && REG_OK_FOR_BASE_P (XEXP (X, 0))                  \
+#define LEGITIMATE_INDEXED_ADDRESS_P(X, STRICT)                        \
+ (GET_CODE (X) == PLUS                                         \
+  && GET_CODE (XEXP (X, 0)) == REG                             \
+  && GET_CODE (XEXP (X, 1)) == REG                             \
+  && ((INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT))           \
+       && INT_REG_OK_FOR_INDEX_P (XEXP (X, 1), (STRICT)))      \
+      || (INT_REG_OK_FOR_BASE_P (XEXP (X, 1), (STRICT))                \
+         && INT_REG_OK_FOR_INDEX_P (XEXP (X, 0), (STRICT)))))
+
+#define LEGITIMATE_INDIRECT_ADDRESS_P(X, STRICT)               \
+  (GET_CODE (X) == REG && INT_REG_OK_FOR_BASE_P (X, (STRICT)))
+
+#define LEGITIMATE_LO_SUM_ADDRESS_P(MODE, X, STRICT)           \
+  (TARGET_ELF                                                  \
+   && ! flag_pic && ! TARGET_TOC                               \
+   && (MODE) != DImode                                         \
+   && (MODE) != TImode                                         \
+   && (TARGET_HARD_FLOAT || (MODE) != DFmode)                  \
+   && GET_CODE (X) == LO_SUM                                   \
+   && GET_CODE (XEXP (X, 0)) == REG                            \
+   && INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT))            \
    && CONSTANT_P (XEXP (X, 1)))
 
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                \
-{ if (LEGITIMATE_INDIRECT_ADDRESS_P (X))               \
-    goto ADDR;                                         \
-  if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == PRE_DEC) \
-      && TARGET_UPDATE                                 \
-      && LEGITIMATE_INDIRECT_ADDRESS_P (XEXP (X, 0)))  \
-    goto ADDR;                                         \
-  if (LEGITIMATE_SMALL_DATA_P (MODE, X))               \
-    goto ADDR;                                         \
-  if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (X))          \
-    goto ADDR;                                         \
-  if (LEGITIMATE_OFFSET_ADDRESS_P (MODE, X))           \
-    goto ADDR;                                         \
-  if ((MODE) != TImode                                 \
-      && (TARGET_HARD_FLOAT || TARGET_POWERPC64 || (MODE) != DFmode) \
-      && (TARGET_POWERPC64 || (MODE) != DImode)                \
-      && LEGITIMATE_INDEXED_ADDRESS_P (X))             \
-    goto ADDR;                                         \
-  if (LEGITIMATE_LO_SUM_ADDRESS_P (MODE, X))           \
-    goto ADDR;                                         \
+#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                        \
+{ if (rs6000_legitimate_address (MODE, X, REG_OK_STRICT_FLAG)) \
+    goto ADDR;                                                 \
 }
 \f
 /* Try machine-dependent ways of modifying an illegitimate address
@@ -1945,7 +1859,7 @@ do {                                                                           \
       && GET_CODE (XEXP (XEXP (X, 0), 1)) == CONST_INT                      \
       && GET_CODE (XEXP (X, 1)) == CONST_INT)                               \
     {                                                                       \
-      push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL_PTR,           \
+      push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,               \
                    BASE_REG_CLASS, GET_MODE (X), VOIDmode, 0, 0,            \
                    OPNUM, TYPE);                                            \
       goto WIN;                                                                     \
@@ -1973,7 +1887,7 @@ do {                                                                           \
                                       GEN_INT (high)),                      \
                         GEN_INT (low));                                             \
                                                                             \
-      push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL_PTR,           \
+      push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,               \
                    BASE_REG_CLASS, GET_MODE (X), VOIDmode, 0, 0,            \
                    OPNUM, TYPE);                                            \
       goto WIN;                                                                     \
@@ -2320,12 +2234,6 @@ extern int rs6000_compare_fp_p;
 
 #define TARGET_MEM_FUNCTIONS
 
-/* Define the name of the section to use for the exception tables.
-   TODO: test and see if we can use read_only_data_section, if so,
-   remove this.  */
-
-#define EXCEPTION_SECTION data_section
-
 /* Flag to say the TOC is initialized */
 extern int toc_initialized;
 
@@ -2342,10 +2250,6 @@ extern int toc_initialized;
     }                                                                    \
 }
 
-/* This is how we tell the assembler that two symbols have the same value.  */
-
-#define SET_ASM_OP "\t.set\t"
-
 /* This implementes the `alias' attribute.  */
 
 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE,decl,target)    \
@@ -2553,13 +2457,13 @@ do {                                                                    \
   if (TARGET_32BIT)                                                    \
     {                                                                  \
       assemble_integer (operand_subword ((VALUE), 0, 0, DImode),       \
-                        UNITS_PER_WORD, 1);                            \
+                        UNITS_PER_WORD, BITS_PER_WORD, 1);             \
       assemble_integer (operand_subword ((VALUE), 1, 0, DImode),       \
-                        UNITS_PER_WORD, 1);                            \
+                        UNITS_PER_WORD, BITS_PER_WORD, 1);             \
     }                                                                  \
   else                                                                 \
     {                                                                  \
-      fputs ("\t.llong ", FILE);                                       \
+      fprintf (FILE, "%s", DOUBLE_INT_ASM_OP);                         \
       output_addr_const (FILE, (VALUE));                               \
       putc ('\n', FILE);                                               \
     }                                                                  \
@@ -2588,7 +2492,7 @@ do {                                                                      \
   fprintf (FILE, "\t.byte 0x%x\n", (VALUE))
 
 /* This is used by the definition of ASM_OUTPUT_ADDR_ELT in defaults.h.  */
-#define ASM_LONG (TARGET_32BIT ? ".long" : ".quad")
+#define ASM_LONG (TARGET_32BIT ? ".long" : DOUBLE_INT_ASM_OP)
 
 /* This is how to output an element of a case-vector that is relative.  */
 
@@ -2611,19 +2515,6 @@ do {                                                                     \
   if ((LOG) != 0)                      \
     fprintf (FILE, "\t.align %d\n", (LOG))
 
-/* This says how to output an assembler line
-   to define a local common symbol.
-   Alignment cannot be specified, but we can try to maintain
-   alignment after preceding TOC section if it was aligned
-   for 64-bit mode.  */
-
-#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)    \
-  do { fputs (".lcomm ", (FILE));                      \
-       RS6000_OUTPUT_BASENAME ((FILE), (NAME));                \
-       fprintf ((FILE), ",%d,%s\n", (TARGET_32BIT ? (SIZE) : (ROUNDED)), \
-               xcoff_bss_section_name);                \
-     } while (0)
-
 /* Store in OUTPUT a string (made with alloca) containing
    an assembler-name for a local static variable named NAME.
    LABELNO is an integer which is different for each call.  */
@@ -2632,12 +2523,6 @@ do {                                                                     \
 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),   \
   sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
 
-/* Define the parentheses used to group arithmetic operations
-   in assembler code.  */
-
-#define ASM_OPEN_PAREN "("
-#define ASM_CLOSE_PAREN ")"
-
 /* Pick up the return address upon entry to a procedure. Used for
    dwarf2 unwind information.  This also enables the table driven
    mechanism.  */
@@ -2649,15 +2534,6 @@ do {                                                                     \
 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 3 : INVALID_REGNUM)
 #define EH_RETURN_STACKADJ_RTX  gen_rtx_REG (Pmode, 10)
 
-/* Define results of standard character escape sequences.  */
-#define TARGET_BELL 007
-#define TARGET_BS 010
-#define TARGET_TAB 011
-#define TARGET_NEWLINE 012
-#define TARGET_VT 013
-#define TARGET_FF 014
-#define TARGET_CR 015
-
 /* Print operand X (an rtx) in assembler syntax to file FILE.
    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
@@ -2679,6 +2555,7 @@ do {                                                                      \
   {"short_cint_operand", {CONST_INT}},                                    \
   {"u_short_cint_operand", {CONST_INT}},                                  \
   {"non_short_cint_operand", {CONST_INT}},                                \
+  {"exact_log2_cint_operand", {CONST_INT}},                               \
   {"gpc_reg_operand", {SUBREG, REG}},                                     \
   {"cc_reg_operand", {SUBREG, REG}},                                      \
   {"cc_reg_not_cr0_operand", {SUBREG, REG}},                              \
@@ -2687,10 +2564,13 @@ do {                                                                    \
   {"reg_or_u_short_operand", {SUBREG, REG, CONST_INT}},                           \
   {"reg_or_cint_operand", {SUBREG, REG, CONST_INT}},                      \
   {"reg_or_arith_cint_operand", {SUBREG, REG, CONST_INT}},                \
+  {"reg_or_add_cint64_operand", {SUBREG, REG, CONST_INT}},                \
+  {"reg_or_sub_cint64_operand", {SUBREG, REG, CONST_INT}},                \
   {"reg_or_logical_cint_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
   {"got_operand", {SYMBOL_REF, CONST, LABEL_REF}},                        \
   {"got_no_const_operand", {SYMBOL_REF, LABEL_REF}},                      \
   {"easy_fp_constant", {CONST_DOUBLE}},                                           \
+  {"zero_fp_constant", {CONST_DOUBLE}},                                           \
   {"reg_or_mem_operand", {SUBREG, MEM, REG}},                             \
   {"lwa_operand", {SUBREG, MEM, REG}},                                    \
   {"volatile_mem_operand", {MEM}},                                        \
@@ -2726,17 +2606,14 @@ do {                                                                    \
   {"trap_comparison_operator", {EQ, NE, LE, LT, GE,                       \
                                GT, LEU, LTU, GEU, GTU}},                  \
   {"boolean_operator", {AND, IOR, XOR}},                                  \
-  {"boolean_or_operator", {IOR, XOR}},
+  {"boolean_or_operator", {IOR, XOR}},                                    \
+  {"min_max_operator", {SMIN, SMAX, UMIN, UMAX}},
 
 /* uncomment for disabling the corresponding default options */
 /* #define  MACHINE_no_sched_interblock */
 /* #define  MACHINE_no_sched_speculative */
 /* #define  MACHINE_no_sched_speculative_load */
 
-/* indicate that issue rate is defined for this machine
-   (no need to use the default) */
-#define ISSUE_RATE get_issue_rate ()
-
 /* General flags.  */
 extern int flag_pic;
 extern int optimize;