]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/config/cris/cris.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / cris / cris.h
index 776c44e2c812ef6f8c3cf22c36c9abc6e834c44b..028da93a216088b89ca8cb64eecbb390008a62a7 100644 (file)
@@ -1,6 +1,5 @@
 /* Definitions for GCC.  Part of the machine description for CRIS.
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
-   2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1998-2024 Free Software Foundation, Inc.
    Contributed by Axis Communications.  Written by Hans-Peter Nilsson.
 
 This file is part of GCC.
@@ -33,14 +32,14 @@ along with GCC; see the file COPYING3.  If not see
    the section-comment is present.  */
 
 /* Note that other header files (e.g. config/elfos.h, config/linux.h,
-   config/cris/linux.h and config/cris/aout.h) are responsible for lots of
-   settings not repeated below.  This file contains general CRIS
-   definitions and definitions for the cris-*-elf subtarget.  */
+   and config/cris/linux.h) are responsible for lots of settings not
+   repeated below.  This file contains general CRIS definitions
+   and definitions for the cris-*-elf subtarget.  */
 
 /* We don't want to use gcc_assert for everything, as that can be
    compiled out.  */
 #define CRIS_ASSERT(x) \
- do { if (!(x)) internal_error ("CRIS-port assertion failed: " #x); } while (0)
+ do { if (!(x)) internal_error ("CRIS-port assertion failed: %s", #x); } while (0)
 
 /* Replacement for REG_P since it does not match SUBREGs.  Happens for
    testcase Axis-20000320 with gcc-2.9x.  */
@@ -65,15 +64,6 @@ along with GCC; see the file COPYING3.  If not see
    never clash with it for GCC purposes.  */
 #define CRIS_CANONICAL_CC0_REGNUM (16 + 13)
 
-/* When generating PIC, these suffixes are added to the names of non-local
-   functions when being output.  Contrary to other ports, we have offsets
-   relative to the GOT, not the PC.  We might implement PC-relative PLT
-   semantics later for the general case; they are used in some cases right
-   now, such as MI thunks.  */
-#define CRIS_GOTPLT_SUFFIX ":GOTPLT"
-#define CRIS_PLT_GOTOFFSET_SUFFIX ":PLTG"
-#define CRIS_PLT_PCOFFSET_SUFFIX ":PLT"
-
 #define CRIS_FUNCTION_ARG_SIZE(MODE, TYPE)     \
   ((MODE) != BLKmode ? GET_MODE_SIZE (MODE)    \
    : (unsigned) int_size_in_bytes (TYPE))
@@ -81,31 +71,10 @@ along with GCC; see the file COPYING3.  If not see
 /* Which CPU version this is.  The parsed and adjusted cris_cpu_str.  */
 extern int cris_cpu_version;
 
-/* Changing the order used to be necessary to put the fourth __make_dp
-   argument (a DImode parameter) in registers, to fit with the libfunc
-   parameter passing scheme used for intrinsic functions.  FIXME: Check
-   performance and maybe remove definition from TARGET_LIBGCC2_CFLAGS now
-   that it isn't strictly necessary.  We used to do this through
-   TARGET_LIBGCC2_CFLAGS, but that became increasingly difficult as the
-   parenthesis (that needed quoting) travels through several layers of
-   make and shell invocations.  */
-#ifdef IN_LIBGCC2
-#define __make_dp(a,b,c,d) __cris_make_dp(d,a,b,c)
-#endif
-
 
 /* Node: Driver */
 
-/* When using make with defaults.mak for Sun this will handily remove
-   any "-target sun*" switches.  */
-/* We need to override any previous definitions (linux.h) */
-#undef WORD_SWITCH_TAKES_ARG
-#define WORD_SWITCH_TAKES_ARG(STR)             \
- (DEFAULT_WORD_SWITCH_TAKES_ARG (STR)          \
-  || !strcmp (STR, "target"))
-
-/* Also provide canonical vN definitions when user specifies an alias.
-   Note that -melf overrides -maout.  */
+/* Also provide canonical vN definitions when user specifies an alias.  */
 
 #define CPP_SPEC \
  "%{mtune=*:-D__tune_%* %{mtune=v*:-D__CRIS_arch_tune=%*}\
@@ -137,26 +106,17 @@ extern int cris_cpu_version;
 #define CRIS_DEFAULT_ASM_ARCH_OPTION ""
 
 #ifdef TARGET_CPU_DEFAULT
-#if TARGET_CPU_DEFAULT != 32 && TARGET_CPU_DEFAULT != 10
+#if TARGET_CPU_DEFAULT != 10
  #error "Due to '()'; e.g. '#define TARGET_CPU_DEFAULT (10)', stringize TARGET_CPU_DEFAULT isn't useful: update manually."
 #endif
 
-#if TARGET_CPU_DEFAULT == 32
-#undef CRIS_DEFAULT_TUNE
-#define CRIS_DEFAULT_TUNE "32"
-/* To enable use of "generic" cris-axis-elf binutils, always pass the
-   architecture option to GAS.  (We don't do this for non-v32.)  */
-#undef CRIS_DEFAULT_ASM_ARCH_OPTION
-#define CRIS_DEFAULT_ASM_ARCH_OPTION "--march=v32"
-#endif
-
 #undef CRIS_ARCH_CPP_DEFAULT
 #define CRIS_ARCH_CPP_DEFAULT \
  "%{!march=*:\
    %{!metrax*:\
     %{!mcpu=*:\
      %{!mtune=*:-D__tune_v" CRIS_DEFAULT_TUNE "}\
-     -D__arch_v"CRIS_DEFAULT_TUNE\
+     -D__arch_v" CRIS_DEFAULT_TUNE \
    " -D__CRIS_arch_version=" CRIS_DEFAULT_TUNE "}}}"
 #endif
 
@@ -168,13 +128,13 @@ extern int cris_cpu_version;
     " -D__CRIS_arch_tune=" CRIS_DEFAULT_TUNE "}}}}}"\
  CRIS_ARCH_CPP_DEFAULT
 
-/* Remove those Sun-make "target" switches.  */
-/* Override previous definitions (linux.h).  */
+/* Override previous definitions (../linux.h).  */
 #undef CC1_SPEC
 #define CC1_SPEC \
- "%{target*:}\
-  %{metrax4:-march=v3}\
+ "%{metrax4:-march=v3}\
   %{metrax100:-march=v8}\
+  %{march=*:-march=%*}\
+  %{mcpu=*:-mcpu=%*}\
   %(cc1_subtarget)"
 
 /* For the cris-*-elf subtarget.  */
@@ -193,36 +153,31 @@ extern int cris_cpu_version;
 
 #ifdef HAVE_AS_NO_MUL_BUG_ABORT_OPTION
 #define MAYBE_AS_NO_MUL_BUG_ABORT \
- "%{mno-mul-bug-workaround:-no-mul-bug-abort} "
+ "%{mno-mul-bug-workaround:-no-mul-bug-abort} " \
+ "%{mmul-bug-workaround:-mul-bug-abort} " \
+ "%{!mmul-bug-workaround:%{!mno-mul-bug-workaround:" MUL_BUG_ASM_DEFAULT "}} "
 #else
 #define MAYBE_AS_NO_MUL_BUG_ABORT
 #endif
 
-/* Override previous definitions (linux.h).  */
+/* Override previous definitions (../linux.h).  */
 #undef ASM_SPEC
 #define ASM_SPEC \
  MAYBE_AS_NO_MUL_BUG_ABORT \
- "%{v:-v}\
- %(asm_subtarget)\
- %{march=*:%{cpu=*:%eDo not specify both -march=... and -mcpu=...}}\
- %{march=v32:--march=v32} %{mcpu=v32:--march=v32}"
+ "%(asm_subtarget)\
+ %{march=*:%{mcpu=*:%edo not specify both -march=... and -mcpu=...}}\
+ %{march=v0|mcpu=v0|march=v3|mcpu=v3|march=v8|mcpu=v8:--march=v0_v10}\
+ %{march=v10|mcpu=v10:--march=v10}"
 
 /* For the cris-*-elf subtarget.  */
 #define CRIS_ASM_SUBTARGET_SPEC \
- "--em=criself %{!march=*:%{!cpu=*:" CRIS_DEFAULT_ASM_ARCH_OPTION "}}"
+ "--em=criself %{!march=*:%{!mcpu=*:" CRIS_DEFAULT_ASM_ARCH_OPTION "}}"
 
 /* FIXME: We should propagate the -melf option to make the criself
    "emulation" unless a linker script is provided (-T*), but I don't know
    how to do that if either of -Ttext, -Tdata or -Tbss is given but no
    linker script, as is usually the case.  Leave it to the user for the
-   time being.
-
-   Note that -melf overrides -maout except that a.out-compiled libraries
-   are linked in (multilibbing).  The somewhat cryptic -rpath-link pair is
-   to avoid *only* picking up the linux multilib subdir from the "-B./"
-   option during build, while still giving it preference.  We'd need some
-   %s-variant that checked for existence of some specific file.  */
-/* Override previous definitions (svr4.h).  */
+   time being.  */
 #undef LINK_SPEC
 #define LINK_SPEC \
  "%{v:--verbose}\
@@ -280,13 +235,6 @@ extern int cris_cpu_version;
     }                                          \
   while (0)
 
-/* Previously controlled by target_flags.  */
-#define TARGET_ELF 1
-
-/* Previously controlled by target_flags.  Note that this is *not* set
-   for -melinux.  */
-#define TARGET_LINUX 0
-
 /* For the cris-*-elf subtarget.  */
 #define CRIS_SUBTARGET_DEFAULT 0
 
@@ -294,36 +242,67 @@ extern int cris_cpu_version;
 #define CRIS_CPU_ETRAX4 3      /* Just lz added.  */
 #define CRIS_CPU_SVINTO 8      /* Added swap, jsrc & Co., 32-bit accesses.  */
 #define CRIS_CPU_NG 10         /* Added mul[su].  */
-#define CRIS_CPU_V32 32                /* Major changes.  */
 
 #ifndef TARGET_CPU_DEFAULT
 #define TARGET_CPU_DEFAULT CRIS_CPU_BASE
 #endif
 
-/* Default target_flags if no switches specified.  */
+/* Default target_flags if no switches specified.
+   The alignment-by-32 is to make builtin atomic support for v10
+   work for *-elf for types without specified alignment (like plain
+   "int").  See top comment in sync.md.  */
 #ifndef TARGET_DEFAULT
-# if TARGET_CPU_DEFAULT == 32
+# if TARGET_CPU_DEFAULT == 10
 #  define TARGET_DEFAULT \
- (MASK_STACK_ALIGN \
+ (MASK_SIDE_EFFECT_PREFIXES + MASK_STACK_ALIGN \
   + MASK_CONST_ALIGN + MASK_DATA_ALIGN \
+  + MASK_ALIGN_BY_32 \
   + MASK_PROLOGUE_EPILOGUE)
-# else  /* 10 */
-# define TARGET_DEFAULT \
+# else  /* 0 */
+#  define TARGET_DEFAULT \
  (MASK_SIDE_EFFECT_PREFIXES + MASK_STACK_ALIGN \
   + MASK_CONST_ALIGN + MASK_DATA_ALIGN \
-  + MASK_PROLOGUE_EPILOGUE + MASK_MUL_BUG)
+  + MASK_PROLOGUE_EPILOGUE)
 # endif
 #endif
 
+/* Don't depend on the assembler default setting for the errata machinery;
+   always pass the option to turn it on or off explicitly.  But, we have to
+   decide on which is the *GCC* default, and for that we should only need to
+   consider what's in TARGET_DEFAULT; no other changes should be necessary.  */
+
+#if (TARGET_DEFAULT & MASK_MUL_BUG)
+#define MUL_BUG_ASM_DEFAULT "-mul-bug-abort"
+#else
+#define MUL_BUG_ASM_DEFAULT "-no-mul-bug-abort"
+#endif
+
 /* Local, providing a default for cris_cpu_version.  */
 #define CRIS_DEFAULT_CPU_VERSION TARGET_CPU_DEFAULT
 
 #define TARGET_HAS_MUL_INSNS (cris_cpu_version >= CRIS_CPU_NG)
 #define TARGET_HAS_LZ (cris_cpu_version >= CRIS_CPU_ETRAX4)
+#define TARGET_HAS_BREAK (cris_cpu_version >= CRIS_CPU_ETRAX4)
 #define TARGET_HAS_SWAP (cris_cpu_version >= CRIS_CPU_SVINTO)
-#define TARGET_V32 (cris_cpu_version >= CRIS_CPU_V32)
 
-#define CRIS_SUBTARGET_HANDLE_OPTION(x, y, z)
+/* The "break" instruction was introduced with ETRAX 4.  */
+#define TARGET_TRAP_USING_BREAK8 \
+ (cris_trap_using_break8 == 2 ? TARGET_HAS_BREAK : cris_trap_using_break8)
+
+/* This condition controls whether to expand atomics inline or call
+   library functions. */
+#define TARGET_ATOMICS_MAY_CALL_LIBFUNCS               \
+ (cris_atomics_calling_libfunc != 2 && cris_atomics_calling_libfunc != 0)
+
+/* The < v10 atomics turn off interrupts, so they don't need alignment.
+   Incidentally, by default alignment is off there causing variables to
+   be default unaligned all over, so we'd have to make support
+   libraries use a proper atomic type (instead of "int"), one we'd
+   specify as aligned.  */
+#define TARGET_TRAP_UNALIGNED_ATOMIC           \
+ (cris_trap_unaligned_atomic == 2              \
+  ? cris_cpu_version == 10                     \
+  : cris_trap_unaligned_atomic)
 
 /* Node: Storage Layout */
 
@@ -351,7 +330,7 @@ extern int cris_cpu_version;
     Note that to make this macro affect the alignment of stack
    locals, a fix was required, and special precautions when handling
    the stack pointer in various other macros (TARGET_ASM_FUNCTION_PROLOGUE
-   et al) were required.  See file "function.c".  If you would just define
+   et al) were required.  See file "function.cc".  If you would just define
    this macro, it would only affect the builtin alloca and variable
    local data (non-ANSI, non-K&R, Gnu C extension).  */
 #define STACK_BOUNDARY \
@@ -371,17 +350,6 @@ extern int cris_cpu_version;
      ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)                   \
      : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)
 
-/* Note that CONSTANT_ALIGNMENT has the effect of making gcc believe that
-   ALL references to constant stuff (in code segment, like strings) has
-   this alignment.  That is a rather rushed assumption.  Luckily we do not
-   care about the "alignment" operand to builtin memcpy (only place where
-   it counts), so it doesn't affect any bad spots.  */
-#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN)              \
- (TARGET_CONST_ALIGN                                           \
-  ? (TARGET_ALIGN_BY_32                                                \
-     ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)                   \
-     : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)
-
 /* FIXME: Define LOCAL_ALIGNMENT for word and dword or arrays and
    structures (if -mstack-align=), and check that it is good.  */
 
@@ -397,13 +365,6 @@ extern int cris_cpu_version;
    with other GNU/Linux ports (i.e. elfos.h users).  */
 #undef PCC_BITFIELD_TYPE_MATTERS
 
-/* This is only used for non-scalars.  Strange stuff happens to structs
-   (FIXME: What?) if we use anything larger than largest actually used
-   datum size, so lets make it 32.  The type "long long" will still work
-   as usual.  We can still have DImode insns, but they will only be used
-   for scalar data (i.e. long long).  */
-#define MAX_FIXED_MODE_SIZE 32
-
 
 /* Node: Type Layout */
 
@@ -425,8 +386,8 @@ extern int cris_cpu_version;
 /* Node: Register Basics */
 
 /*  We count all 16 non-special registers, SRP, a faked argument
-    pointer register, MOF and CCR/DCCR.  */
-#define FIRST_PSEUDO_REGISTER (16 + 1 + 1 + 1 + 1)
+    pointer register, MOF, CCR/DCCR, and the faked frame-pointer.  */
+#define FIRST_PSEUDO_REGISTER (16 + 1 + 1 + 1 + 1 + 1)
 
 /* For CRIS, these are r15 (pc) and r14 (sp). Register r8 is used as a
    frame-pointer, but is not fixed.  SRP is not included in general
@@ -434,15 +395,12 @@ extern int cris_cpu_version;
    registers are fixed at the moment.  The faked argument pointer register
    is fixed too.  */
 #define FIXED_REGISTERS \
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0}
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1}
 
 /* Register r9 is used for structure-address, r10-r13 for parameters,
    r10- for return values.  */
 #define CALL_USED_REGISTERS \
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1}
-
-#define CONDITIONAL_REGISTER_USAGE cris_conditional_register_usage ()
-
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1}
 
 /* Node: Allocation Order */
 
@@ -465,37 +423,8 @@ extern int cris_cpu_version;
     Use struct-return address first, since very few functions use
    structure return values so it is likely to be available.  */
 #define REG_ALLOC_ORDER \
- {9, 13, 12, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 14, 15, 17, 16, 18, 19}
-
-/* Use MOF and ACR.  Prefer ACR before any other register.  Prefer MOF
-   then SRP after saved registers.  The *after* is because they're only
-   useful for storage, not for things being computed, which is
-   apparently more common.  */
-#define REG_ALLOC_ORDER_V32 \
- {15, 9, 13, 12, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 17, 16, 14, 18, 19}
-
-
-/* Node: Values in Registers */
-
-/* The VOIDmode test is so we can omit mode on anonymous insns.  FIXME:
-   Still needed in 2.9x, at least for Axis-20000319.  */
-#define HARD_REGNO_NREGS(REGNO, MODE)  \
- (MODE == VOIDmode \
-  ? 1 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
-
-/* CRIS permits all registers to hold all modes.  Well, except for the
-   condition-code register.  And we can't hold larger-than-register size
-   modes in the last special register that can hold a full 32 bits.  */
-#define HARD_REGNO_MODE_OK(REGNO, MODE)                \
- (((MODE) == CCmode                            \
-   || (REGNO) != CRIS_CC0_REGNUM)              \
-  && (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD   \
-      || ((REGNO) != CRIS_MOF_REGNUM && (REGNO) != CRIS_ACR_REGNUM)))
-
-/* Because CCmode isn't covered by the "narrower mode" statement in
-   tm.texi, we can still say all modes are tieable despite not having an
-   always 1 HARD_REGNO_MODE_OK.  */
-#define MODES_TIEABLE_P(MODE1, MODE2) 1
+ {9, 13, 12, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 14, 15, 17, 16, 18, 19,        \
+  20}
 
 
 /* Node: Leaf Functions */
@@ -507,19 +436,15 @@ extern int cris_cpu_version;
 
 /* Node: Register Classes */
 
-/* FIXME: A separate class for the return register would make sense.
-
-   We need a separate register class to handle register allocation for
-   ACR, since it can't be used for post-increment.
-
-   It's not obvious, but having subunions of all movable-between
-   register classes does really help register allocation.  */
+/* It's not obvious, but having subunions of all movable-between
+   register classes does really help register allocation (pre-IRA
+   comment).  */
 enum reg_class
   {
     NO_REGS,
-    ACR_REGS, MOF_REGS, CC0_REGS, SPECIAL_REGS,
-    SPEC_ACR_REGS, GENNONACR_REGS,
-    SPEC_GENNONACR_REGS, GENERAL_REGS,
+    MOF_REGS, SRP_REGS, CC0_REGS,
+    MOF_SRP_REGS, SPECIAL_REGS,
+    GENERAL_REGS,
     ALL_REGS,
     LIM_REG_CLASSES
   };
@@ -528,93 +453,55 @@ enum reg_class
 
 #define REG_CLASS_NAMES                                                \
   {"NO_REGS",                                                  \
-   "ACR_REGS", "MOF_REGS", "CC0_REGS", "SPECIAL_REGS",         \
-   "SPEC_ACR_REGS", "GENNONACR_REGS", "SPEC_GENNONACR_REGS",   \
+   "MOF_REGS", "SRP_REGS", "CC0_REGS",                         \
+   "MOF_SRP_REGS", "SPECIAL_REGS",                             \
    "GENERAL_REGS", "ALL_REGS"}
 
 #define CRIS_SPECIAL_REGS_CONTENTS                                     \
  ((1 << CRIS_SRP_REGNUM) | (1 << CRIS_MOF_REGNUM) | (1 << CRIS_CC0_REGNUM))
 
+#define CRIS_FAKED_REGS_CONTENTS \
+ ((1 << CRIS_AP_REGNUM) | (1 << CRIS_FP_REGNUM))
+
 /* Count in the faked argument register in GENERAL_REGS.  Keep out SRP.  */
 #define REG_CLASS_CONTENTS                     \
   {                                            \
    {0},                                                \
-   {1 << CRIS_ACR_REGNUM},                     \
    {1 << CRIS_MOF_REGNUM},                     \
+   {1 << CRIS_SRP_REGNUM},                     \
    {1 << CRIS_CC0_REGNUM},                     \
+   {(1 << CRIS_MOF_REGNUM)                     \
+    | (1 << CRIS_SRP_REGNUM)},                 \
    {CRIS_SPECIAL_REGS_CONTENTS},               \
-   {CRIS_SPECIAL_REGS_CONTENTS                 \
-    | (1 << CRIS_ACR_REGNUM)},                 \
-   {(0xffff | (1 << CRIS_AP_REGNUM))           \
-    & ~(1 << CRIS_ACR_REGNUM)},                        \
-   {(0xffff | (1 << CRIS_AP_REGNUM)            \
-    | CRIS_SPECIAL_REGS_CONTENTS)              \
-    & ~(1 << CRIS_ACR_REGNUM)},                        \
-   {0xffff | (1 << CRIS_AP_REGNUM)},           \
-   {0xffff | (1 << CRIS_AP_REGNUM)             \
+   {0xffff | CRIS_FAKED_REGS_CONTENTS},                \
+   {0xffff | CRIS_FAKED_REGS_CONTENTS          \
     | CRIS_SPECIAL_REGS_CONTENTS}              \
   }
 
 #define REGNO_REG_CLASS(REGNO)                 \
-  ((REGNO) == CRIS_ACR_REGNUM ? ACR_REGS :     \
-   (REGNO) == CRIS_MOF_REGNUM ? MOF_REGS :     \
+  ((REGNO) == CRIS_MOF_REGNUM ? MOF_REGS :     \
+   (REGNO) == CRIS_SRP_REGNUM ? SRP_REGS :     \
    (REGNO) == CRIS_CC0_REGNUM ? CC0_REGS :     \
-   (REGNO) == CRIS_SRP_REGNUM ? SPECIAL_REGS : \
    GENERAL_REGS)
 
 #define BASE_REG_CLASS GENERAL_REGS
 
-#define MODE_CODE_BASE_REG_CLASS(MODE, OCODE, ICODE)   \
-  ((OCODE) != POST_INC ? BASE_REG_CLASS : GENNONACR_REGS)
-
 #define INDEX_REG_CLASS GENERAL_REGS
 
-#define IRA_COVER_CLASSES { GENERAL_REGS, SPECIAL_REGS, LIM_REG_CLASSES }
-
-#define REG_CLASS_FROM_LETTER(C)               \
-  (                                            \
-   (C) == 'a' ? ACR_REGS :                     \
-   (C) == 'b' ? GENNONACR_REGS :               \
-   (C) == 'h' ? MOF_REGS :                     \
-   (C) == 'x' ? SPECIAL_REGS :                 \
-   (C) == 'c' ? CC0_REGS :                     \
-   NO_REGS                                     \
-  )
-
 /* Since it uses reg_renumber, it is safe only once reg_renumber
-   has been allocated, which happens in local-alloc.c.  */
+   has been allocated, which happens in reginfo.cc during register
+   allocation.  */
 #define REGNO_OK_FOR_BASE_P(REGNO)                                     \
  ((REGNO) <= CRIS_LAST_GENERAL_REGISTER                                        \
+  || (REGNO) == FRAME_POINTER_REGNUM                                   \
   || (REGNO) == ARG_POINTER_REGNUM                                     \
   || (unsigned) reg_renumber[REGNO] <= CRIS_LAST_GENERAL_REGISTER      \
+  || (unsigned) reg_renumber[REGNO] == FRAME_POINTER_REGNUM            \
   || (unsigned) reg_renumber[REGNO] == ARG_POINTER_REGNUM)
 
-/* REGNO_OK_FOR_BASE_P seems to be obsolete wrt. this one, but not yet
-   documented as such.  */
-#define REGNO_MODE_CODE_OK_FOR_BASE_P(REGNO, MODE, OCODE, ICODE)       \
- (REGNO_OK_FOR_BASE_P (REGNO)                                          \
-  && ((OCODE) != POST_INC                                              \
-      || !((REGNO) == CRIS_ACR_REGNUM                                  \
-          || (unsigned) reg_renumber[REGNO] == CRIS_ACR_REGNUM)))
-
 /* See REGNO_OK_FOR_BASE_P.  */
 #define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P(REGNO)
 
-/* It seems like gcc (2.7.2 and 2.9x of 2000-03-22) may send "NO_REGS" as
-   the class for a constant (testcase: __Mul in arit.c).  To avoid forcing
-   out a constant into the constant pool, we will trap this case and
-   return something a bit more sane.  FIXME: Check if this is a bug.
-   Beware that we must not "override" classes that can be specified as
-   constraint letters, or else asm operands using them will fail when
-   they need to be reloaded.  FIXME: Investigate whether that constitutes
-   a bug.  */
-#define PREFERRED_RELOAD_CLASS(X, CLASS)       \
- ((CLASS) != ACR_REGS                          \
-  && (CLASS) != MOF_REGS                       \
-  && (CLASS) != CC0_REGS                       \
-  && (CLASS) != SPECIAL_REGS                   \
-  ? GENERAL_REGS : (CLASS))
-
 /* We can't move special registers to and from memory in smaller than
    word_mode.  We also can't move between special registers.  Luckily,
    -1, as returned by true_regnum for non-sub/registers, is valid as a
@@ -622,17 +509,12 @@ enum reg_class
    the effect that any X that isn't a special-register is treated as
    a non-empty intersection with GENERAL_REGS.  */
 #define SECONDARY_RELOAD_CLASS(CLASS, MODE, X)                         \
- ((((CLASS) == SPECIAL_REGS || (CLASS) == MOF_REGS)                    \
+ ((reg_class_subset_p (CLASS, SPECIAL_REGS)                            \
    && ((GET_MODE_SIZE (MODE) < 4 && MEM_P (X))                         \
        || !reg_classes_intersect_p (REGNO_REG_CLASS (true_regnum (X)), \
                                    GENERAL_REGS)))                     \
    ? GENERAL_REGS : NO_REGS)
 
-/* FIXME: Fix regrename.c; it should check validity of replacements,
-   not just with a silly pass-specific macro.  We may miss some
-   opportunities, but we must stop regrename from creating acr++.  */
-#define HARD_REGNO_RENAME_OK(FROM, TO) ((TO) != CRIS_ACR_REGNUM)
-
 /* For CRIS, this is always the size of MODE in words,
    since all registers are the same size.  To use omitted modes in
    patterns with reload constraints, you must say the widest size
@@ -645,128 +527,12 @@ enum reg_class
   ? 1 /* + cris_fatal ("CLASS_MAX_NREGS with VOIDmode")        */              \
   : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
 
-/* We are now out of letters; we could use ten more.  This forces us to
-   use C-code in the 'md' file.  FIXME: Use some EXTRA_CONSTRAINTS.  */
-#define CRIS_CONST_OK_FOR_LETTER_P(VALUE, C)           \
- (                                                     \
-  /* MOVEQ, CMPQ, ANDQ, ORQ.  */                       \
-  (C) == 'I' ? (VALUE) >= -32 && (VALUE) <= 31 :       \
-  /* ADDQ, SUBQ.  */                                   \
-  (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 63 :         \
-  /* ASRQ, BTSTQ, LSRQ, LSLQ.  */                      \
-  (C) == 'K' ? (VALUE) >= 0 && (VALUE) <= 31 :         \
-  /* A 16-bit signed number.  */                       \
-  (C) == 'L' ? (VALUE) >= -32768 && (VALUE) <= 32767 : \
-  /* The constant 0 for CLEAR.  */                     \
-  (C) == 'M' ? (VALUE) == 0 :                          \
-  /* A negative ADDQ or SUBQ.  */                      \
-  (C) == 'N' ? (VALUE) >= -63 && (VALUE) < 0 :         \
-  /* Quickened ints, QI and HI.  */                    \
-  (C) == 'O' ? (VALUE) >= 0 && (VALUE) <= 65535                \
-               && ((VALUE) >= (65535-31)               \
-                   || ((VALUE) >= (255-31)             \
-                       && (VALUE) <= 255 )) :          \
-  /* A 16-bit number signed *or* unsigned.  */         \
-  (C) == 'P' ? (VALUE) >= -32768 && (VALUE) <= 65535 : \
-  0)
-
-#define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, S) \
- (                                             \
-  ((C) != 'K' || (S)[1] == 'c')                        \
-   ? CRIS_CONST_OK_FOR_LETTER_P (VALUE, C) :   \
-  ((C) == 'K' && (S)[1] == 'p')                        \
-   ? exact_log2 (VALUE) >= 0 :                 \
-  0)
-
-#define CONSTRAINT_LEN(C, S) ((C) == 'K' ? 2 : DEFAULT_CONSTRAINT_LEN (C, S))
-
-/* It is really simple to make up a 0.0; it is the same as int-0 in
-   IEEE754.  */
-#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)                 \
- ((C) == 'G' && ((VALUE) == CONST0_RTX (DFmode)                        \
-                || (VALUE) == CONST0_RTX (SFmode)))
-
-/* We need this on cris to distinguish delay-slottable addressing modes.  */
-#define EXTRA_CONSTRAINT(X, C)                 \
- (                                             \
-  /* Slottable address mode?  */               \
-  (C) == 'Q' ? EXTRA_CONSTRAINT_Q (X) :                \
-  /* Operand to BDAP or BIAP?  */              \
-  (C) == 'R' ? EXTRA_CONSTRAINT_R (X) :                \
-  /* A local PIC symbol?  */                   \
-  (C) == 'S' ? EXTRA_CONSTRAINT_S (X) :                \
-  /* A three-address addressing-mode?  */      \
-  (C) == 'T' ? EXTRA_CONSTRAINT_T (X) :                \
-  /* A PLT symbol?  */                         \
-  (C) == 'U' ? EXTRA_CONSTRAINT_U (X) :                \
-  0)
-
-#define EXTRA_MEMORY_CONSTRAINT(X, STR) ((X) == 'Q')
-
-#define EXTRA_CONSTRAINT_Q(X)                          \
- (                                                     \
-  /* Just an indirect register (happens to also be     \
-     "all" slottable memory addressing modes not       \
-     covered by other constraints, i.e. '>').  */      \
-  MEM_P (X) && BASE_P (XEXP (X, 0))                    \
- )
-
-#define EXTRA_CONSTRAINT_R(X)                                  \
- (                                                             \
-  /* An operand to BDAP or BIAP:                               \
-     A BIAP; r.S? */                                           \
-  BIAP_INDEX_P (X)                                             \
-  /* A [reg] or (int) [reg], maybe with post-increment.  */    \
-  || BDAP_INDEX_P (X)                                          \
-  || CONSTANT_INDEX_P (X)                                      \
- )
-
-#define EXTRA_CONSTRAINT_T(X)                                          \
- (                                                                     \
-  /* Memory three-address operand.  All are indirect-memory:  */       \
-  MEM_P (X)                                                            \
-  && ((MEM_P (XEXP (X, 0))                                             \
-       /* Double indirect: [[reg]] or [[reg+]]?  */                    \
-       && (BASE_OR_AUTOINCR_P (XEXP (XEXP (X, 0), 0))))                        \
-      /* Just an explicit indirect reference: [const]?  */             \
-      || CONSTANT_P (XEXP (X, 0))                                      \
-      /* Something that is indexed; [...+...]?  */                     \
-      || (GET_CODE (XEXP (X, 0)) == PLUS                               \
-         /* A BDAP constant: [reg+(8|16|32)bit offset]?  */            \
-         && ((BASE_P (XEXP (XEXP (X, 0), 0))                           \
-              && CONSTANT_INDEX_P (XEXP (XEXP (X, 0), 1)))             \
-             /* A BDAP register: [reg+[reg(+)].S]?  */                 \
-             || (BASE_P (XEXP (XEXP (X, 0), 0))                        \
-                 && BDAP_INDEX_P(XEXP(XEXP(X, 0), 1)))                 \
-             /* Same, but with swapped arguments (no canonical         \
-                ordering between e.g. REG and MEM as of LAST_UPDATED   \
-                "Thu May 12 03:59:11 UTC 2005").  */                   \
-             || (BASE_P (XEXP (XEXP (X, 0), 1))                        \
-                 && BDAP_INDEX_P (XEXP (XEXP (X, 0), 0)))              \
-             /* A BIAP: [reg+reg.S] (MULT comes first).  */            \
-             || (BASE_P (XEXP (XEXP (X, 0), 1))                        \
-                 && BIAP_INDEX_P (XEXP (XEXP (X, 0), 0))))))           \
- )
-
-/* PIC-constructs for symbols.  */
-#define EXTRA_CONSTRAINT_S(X)                                          \
- (flag_pic && GET_CODE (X) == CONST && cris_valid_pic_const (X, false))
-
-#define EXTRA_CONSTRAINT_U(X)                                          \
- (flag_pic                                                             \
-  && CONSTANT_P (X)                                                    \
-  && cris_nonmemory_operand_or_callable_symbol (X, VOIDmode))
-
 
 /* Node: Frame Layout */
 
-#define STACK_GROWS_DOWNWARD
+#define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
 
-/* It seems to be indicated in the code (at least 2.1) that this is
-   better a constant, and best 0.  */
-#define STARTING_FRAME_OFFSET 0
-
 #define FIRST_PARM_OFFSET(FNDECL) 0
 
 #define RETURN_ADDR_RTX(COUNT, FRAMEADDR) \
@@ -785,8 +551,7 @@ enum reg_class
 #define CRIS_STACKADJ_REG CRIS_STRUCT_VALUE_REGNUM
 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (SImode, CRIS_STACKADJ_REG)
 
-#define EH_RETURN_HANDLER_RTX \
-  cris_return_addr_rtx (0, NULL)
+#define EH_RETURN_HANDLER_RTX cris_eh_return_handler_rtx ()
 
 #define INIT_EXPANDERS cris_init_expanders ()
 
@@ -802,9 +567,9 @@ enum reg_class
    number and dwarf frame register, we would either need to include all
    registers in the gcc description (with some marked fixed of course), or
    an inverse mapping from dwarf register to gcc register.  There is one
-   need in dwarf2out.c:expand_builtin_init_dwarf_reg_sizes.  Right now, I
+   need in dwarf2out.cc:expand_builtin_init_dwarf_reg_sizes.  Right now, I
    don't see that we need exact correspondence between DWARF *frame*
-   registers and DBX_REGISTER_NUMBER, so map them onto GCC registers.  */
+   registers and DEBUGGER_REGNO, so map them onto GCC registers.  */
 #define DWARF_FRAME_REGNUM(REG) (REG)
 
 /* Node: Stack Checking */
@@ -816,6 +581,9 @@ enum reg_class
 
 /* Register used for frame pointer.  This is also the last of the saved
    registers, when a frame pointer is not used.  */
+#define HARD_FRAME_POINTER_REGNUM CRIS_REAL_FP_REGNUM
+
+/* Faked register, is always eliminated to at least CRIS_REAL_FP_REGNUM.  */
 #define FRAME_POINTER_REGNUM CRIS_FP_REGNUM
 
 /* Faked register, is always eliminated.  We need it to eliminate
@@ -824,13 +592,17 @@ enum reg_class
 
 #define STATIC_CHAIN_REGNUM CRIS_STATIC_CHAIN_REGNUM
 
+/* No unwind context is needed for faked registers nor DCCR.  Currently not MOF
+   too, but let's keep that open.  */
+#define DWARF_FRAME_REGISTERS (CRIS_MOF_REGNUM + 1)
 
 /* Node: Elimination */
 
 #define ELIMINABLE_REGS                                \
  {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM},  \
-  {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},  \
-  {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
+  {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM},     \
+  {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},        \
+  {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
 
 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
  (OFFSET) = cris_initial_elimination_offset (FROM, TO)
@@ -870,12 +642,6 @@ struct cum_args {int regs;};
   && (REGNO) < CRIS_FIRST_ARG_REG + (CRIS_MAX_ARGS_IN_REGS))
 
 
-/* Node: Scalar Return */
-
-#define FUNCTION_VALUE_REGNO_P(N) cris_function_value_regno_p (N)
-
-
-
 /* Node: Aggregate Return */
 
 #define CRIS_STRUCT_VALUE_REGNUM ((CRIS_FIRST_ARG_REG) - 1)
@@ -886,13 +652,13 @@ struct cum_args {int regs;};
 
 /* Node: Function entry */
 
-/* See cris.c for TARGET_ASM_FUNCTION_PROLOGUE and
+/* See cris.cc for TARGET_ASM_FUNCTION_PROLOGUE and
    TARGET_ASM_FUNCTION_EPILOGUE.  */
 
 /* Node: Profiling */
 
 #define FUNCTION_PROFILER(FILE, LABELNO)  \
- error ("no FUNCTION_PROFILER for CRIS")
+ error ("no %<FUNCTION_PROFILER%> for CRIS")
 
 /* FIXME: Some of the undefined macros might be mandatory.  If so, fix
    documentation.  */
@@ -900,7 +666,7 @@ struct cum_args {int regs;};
 
 /* Node: Trampolines */
 
-#define TRAMPOLINE_SIZE (TARGET_V32 ? 58 : 32)
+#define TRAMPOLINE_SIZE 32
 
 /* CRIS wants instructions on word-boundary.  */
 #define TRAMPOLINE_ALIGNMENT 16
@@ -916,121 +682,10 @@ struct cum_args {int regs;};
 
 #define HAVE_POST_INCREMENT 1
 
-/* Must be a compile-time constant, so we go with the highest value
-   among all CRIS variants.  */
-#define MAX_REGS_PER_ADDRESS 2
+#define CONSTANT_ADDRESS_P(X) \
+  (CONSTANT_P (X) && cris_legitimate_address_p (QImode, X, false))
 
-/* There are helper macros defined here which are used only in
-   GO_IF_LEGITIMATE_ADDRESS.
-
-   Note that you *have to* reject invalid addressing modes for mode
-   MODE, even if it is legal for normal addressing modes.  You cannot
-   rely on the constraints to do this work.  They can only be used to
-   doublecheck your intentions.  One example is that you HAVE TO reject
-   (mem:DI (plus:SI (reg:SI x) (reg:SI y))) because for some reason
-   this cannot be reloaded.  (Which of course you can argue that gcc
-   should have done.)  FIXME:  Strange.  Check.  */
-
-/* No symbol can be used as an index (or more correct, as a base) together
-   with a register with PIC; the PIC register must be there.  */
-#define CONSTANT_INDEX_P(X) \
- (CONSTANT_P (X) && (!flag_pic || cris_valid_pic_const (X, true)))
-
-/* True if X is a valid base register.  */
-#define BASE_P(X) \
- (REG_P (X) && REG_OK_FOR_BASE_P (X))
-
-/* True if X is a valid base register with or without autoincrement.  */
-#define BASE_OR_AUTOINCR_P(X)                          \
- (BASE_P (X)                                           \
-  || (GET_CODE (X) == POST_INC                         \
-      && BASE_P (XEXP (X, 0))                          \
-      && REGNO (XEXP (X, 0)) != CRIS_ACR_REGNUM))
-
-/* True if X is a valid (register) index for BDAP, i.e. [Rs].S or [Rs+].S.  */
-#define BDAP_INDEX_P(X)                                        \
- ((MEM_P (X) && GET_MODE (X) == SImode                 \
-   && BASE_OR_AUTOINCR_P (XEXP (X, 0)))                        \
-  || (GET_CODE (X) == SIGN_EXTEND                      \
-      && MEM_P (XEXP (X, 0))                           \
-      && (GET_MODE (XEXP (X, 0)) == HImode             \
-         || GET_MODE (XEXP (X, 0)) == QImode)          \
-      && BASE_OR_AUTOINCR_P (XEXP (XEXP (X, 0), 0))))
-
-/* True if X is a valid (register) index for BIAP, i.e. Rd.m.  */
-#define BIAP_INDEX_P(X)                                \
- ((BASE_P (X) && REG_OK_FOR_INDEX_P (X))       \
-  || (GET_CODE (X) == MULT                     \
-      && BASE_P (XEXP (X, 0))                  \
-      && REG_OK_FOR_INDEX_P (XEXP (X, 0))      \
-      && CONST_INT_P (XEXP (X, 1))             \
-      && (INTVAL (XEXP (X, 1)) == 2            \
-         || INTVAL (XEXP (X, 1)) == 4)))
-
-/* A PIC operand looks like a normal symbol here.  At output we dress it
-   in "[rPIC+symbol:GOT]" (global symbol) or "rPIC+symbol:GOTOFF" (local
-   symbol) so we exclude all addressing modes where we can't replace a
-   plain "symbol" with that.  A global PIC symbol does not fit anywhere
-   here (but is thankfully a general_operand in itself).  A local PIC
-   symbol is valid for the plain "symbol + offset" case.  */
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                        \
- {                                                             \
-   rtx x1, x2;                                                 \
-   if (BASE_OR_AUTOINCR_P (X))                                 \
-     goto ADDR;                                                        \
-   else if (TARGET_V32)                                                \
-     /* Nothing else is valid then.  */                                \
-     ;                                                         \
-   else if (CONSTANT_INDEX_P (X))                              \
-     goto ADDR;                                                        \
-   /* Indexed?  */                                             \
-   else if (GET_CODE (X) == PLUS)                              \
-     {                                                         \
-       x1 = XEXP (X, 0);                                       \
-       x2 = XEXP (X, 1);                                       \
-       /* BDAP o, Rd.  */                                      \
-       if ((BASE_P (x1) && CONSTANT_INDEX_P (x2))              \
-          || (BASE_P (x2) && CONSTANT_INDEX_P (x1))            \
-           /* BDAP Rs[+], Rd.  */                              \
-          || (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD           \
-              && ((BASE_P (x1) && BDAP_INDEX_P (x2))           \
-                  || (BASE_P (x2) && BDAP_INDEX_P (x1))        \
-                  /* BIAP.m Rs, Rd */                          \
-                  || (BASE_P (x1) && BIAP_INDEX_P (x2))        \
-                  || (BASE_P (x2) && BIAP_INDEX_P (x1)))))     \
-        goto ADDR;                                             \
-     }                                                         \
-   else if (MEM_P (X))                                         \
-     {                                                         \
-       /* DIP (Rs).  Reject [[reg+]] and [[reg]] for           \
-         DImode (long long).  */                               \
-       if (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD              \
-          && (BASE_P (XEXP (X, 0))                             \
-              || BASE_OR_AUTOINCR_P (XEXP (X, 0))))            \
-        goto ADDR;                                             \
-     }                                                         \
- }
-
-#ifndef REG_OK_STRICT
- /* 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) <= CRIS_LAST_GENERAL_REGISTER      \
-  || REGNO (X) == ARG_POINTER_REGNUM           \
-  || REGNO (X) >= FIRST_PSEUDO_REGISTER)
-#else
- /* 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
-
-#ifndef REG_OK_STRICT
- /* 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) REG_OK_FOR_BASE_P (X)
-#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))
-#endif
+#define MAX_REGS_PER_ADDRESS 2
 
 /* Fix reloads known to cause suboptimal spilling.  */
 #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, INDL, WIN)     \
@@ -1041,17 +696,17 @@ struct cum_args {int regs;};
     }                                                                  \
   while (0)
 
-#define LEGITIMATE_CONSTANT_P(X) 1
-
 
 /* Node: Condition Code */
 
-#define NOTICE_UPDATE_CC(EXP, INSN) cris_notice_update_cc (EXP, INSN)
+/* FIXME: Maybe define TARGET_CANONICALIZE_COMPARISON later, when
+   playing with optimizations.  */
 
-/* FIXME: Maybe define CANONICALIZE_COMPARISON later, when playing with
-   optimizations.  It is needed; currently we do this with instruction
-   patterns and NOTICE_UPDATE_CC.  */
+#define SELECT_CC_MODE(op, x, y) cris_select_cc_mode(op, x, y)
 
+#define REVERSIBLE_CC_MODE(MODE) true
+
+/* No known need to define REVERSE_CONDITION, the default is good.  */
 
 /* Node: Costs */
 
@@ -1074,39 +729,18 @@ struct cum_args {int regs;};
 
 #define DATA_SECTION_ASM_OP "\t.data"
 
-#define FORCE_EH_FRAME_INFO_IN_DATA_SECTION (! TARGET_ELF)
-
 /* The jump table is immediately connected to the preceding insn.  */
 #define JUMP_TABLES_IN_TEXT_SECTION 1
 
 
-/* Node: PIC */
-
-/* Helper type.  */
-
-enum cris_pic_symbol_type
-  {
-    cris_no_symbol = 0,
-    cris_got_symbol = 1,
-    cris_rel_symbol = 2,
-    cris_got_symbol_needing_fixup = 3,
-    cris_invalid_pic_symbol = 4
-  };
-
-#define PIC_OFFSET_TABLE_REGNUM (flag_pic ? CRIS_GOT_REGNUM : INVALID_REGNUM)
-
-#define LEGITIMATE_PIC_OPERAND_P(X) cris_legitimate_pic_operand (X)
-
-
 /* Node: File Framework */
 
 /* We don't want an .ident for gcc.  To avoid that but still support
-   #ident, we override ASM_OUTPUT_IDENT and, since the gcc .ident is its
-   only use besides ASM_OUTPUT_IDENT, undef IDENT_ASM_OP from elfos.h.  */
-#undef IDENT_ASM_OP
-#undef ASM_OUTPUT_IDENT
-#define ASM_OUTPUT_IDENT(FILE, NAME) \
-  fprintf (FILE, "%s\"%s\"\n", "\t.ident\t", NAME);
+   #ident, we override TARGET_ASM_OUTPUT_IDENT and, since the gcc .ident
+   is its only use besides front-end .ident directives, we return if
+   the state if the cgraph is not PARSING.  */
+#undef TARGET_ASM_OUTPUT_IDENT
+#define TARGET_ASM_OUTPUT_IDENT cris_asm_output_ident
 
 #define ASM_APP_ON "#APP\n"
 
@@ -1115,9 +749,6 @@ enum cris_pic_symbol_type
 
 /* Node: Data Output */
 
-#define OUTPUT_ADDR_CONST_EXTRA(STREAM, X, FAIL) \
-  do { if (!cris_output_addr_const_extra (STREAM, X)) goto FAIL; } while (0)
-
 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) (C) == '@'
 
 /* Node: Uninitialized Data */
@@ -1130,7 +761,7 @@ enum cris_pic_symbol_type
    are used on the object files.  Since ".global ... .lcomm ..." works, we
    use that.  Use .._ALIGNED_COMMON, since gcc whines when we only have
    ..._COMMON, and we prefer to whine ourselves; BIGGEST_ALIGNMENT is not
-   the one to check.  This done for a.out only.  */
+   the one to check.  */
 /* FIXME: I suspect a bug in gcc with alignment.  Do not warn until
    investigated; it mucks up the testsuite results.  */
 #define CRIS_ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN, LOCAL) \
@@ -1145,29 +776,15 @@ enum cris_pic_symbol_type
       else if (align_ < 1)                                             \
        align_ = 1;                                                     \
                                                                        \
-      if (TARGET_ELF)                                                  \
+      if (LOCAL)                                                       \
        {                                                               \
-         if (LOCAL)                                                    \
-           {                                                           \
-             fprintf ((FILE), "%s", LOCAL_ASM_OP);                     \
-             assemble_name ((FILE), (NAME));                           \
-             fprintf ((FILE), "\n");                                   \
-           }                                                           \
-         fprintf ((FILE), "%s", COMMON_ASM_OP);                        \
+         fprintf ((FILE), "%s", LOCAL_ASM_OP);                         \
          assemble_name ((FILE), (NAME));                               \
-         fprintf ((FILE), ",%u,%u\n", (int)(SIZE), align_);            \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         /* We can't tell a one-only or weak COMM from a "global       \
-            COMM" so just make all non-locals weak.  */                \
-         if (! (LOCAL))                                                \
-           ASM_WEAKEN_LABEL (FILE, NAME);                              \
-         fputs ("\t.lcomm ", (FILE));                                  \
-         assemble_name ((FILE), (NAME));                               \
-         fprintf ((FILE), ",%u\n",                                     \
-                  ((int)(SIZE) + (align_ - 1)) & ~(align_ - 1));       \
+         fprintf ((FILE), "\n");                                       \
        }                                                               \
+      fprintf ((FILE), "%s", COMMON_ASM_OP);                           \
+      assemble_name ((FILE), (NAME));                                  \
+      fprintf ((FILE), ",%u,%u\n", (int)(SIZE), align_);               \
     }                                                                  \
   while (0)
 
@@ -1206,16 +823,17 @@ enum cris_pic_symbol_type
 
 #define REGISTER_NAMES                                 \
  {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",        \
-  "r9", "r10", "r11", "r12", "r13", "sp", "acr", "srp", "mof", "faked_ap", "dccr"}
+  "r9", "r10", "r11", "r12", "r13", "sp", "pc", "srp", \
+  "mof", "faked_ap", "dccr", "faked_fp"}
 
 #define ADDITIONAL_REGISTER_NAMES \
- {{"r14", 14}, {"r15", 15}, {"pc", 15}}
+ {{"r14", 14}, {"r15", 15}}
 
 /* Output an empty line to illustrate the presence of the delay slot.  */
 #define DBR_OUTPUT_SEQEND(FILE) \
   fprintf (FILE, "\n")
 
-#define LOCAL_LABEL_PREFIX (TARGET_ELF ? "." : "")
+#define LOCAL_LABEL_PREFIX "."
 
 /* cppinit.c initializes a const array from this, so it must be constant,
    can't have it different based on options.  Luckily, the prefix is
@@ -1230,10 +848,7 @@ enum cris_pic_symbol_type
 #define USER_LABEL_PREFIX "_"
 
 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO)                               \
-  fprintf (FILE,                                                       \
-          TARGET_V32                                                   \
-          ? "\tsubq 4,$sp\n\tmove $%s,[$sp]\n" : "\tpush $%s\n",       \
-          reg_names[REGNO])
+  fprintf (FILE, "\tpush $%s\n", reg_names[REGNO])
 
 #define ASM_OUTPUT_REG_POP(FILE, REGNO) \
   fprintf (FILE, "\tmove [$sp+],$%s\n", reg_names[REGNO])
@@ -1242,14 +857,7 @@ enum cris_pic_symbol_type
 /* Node: Dispatch Tables */
 
 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)               \
-  do                                                                   \
-    {                                                                  \
-      if (TARGET_V32)                                                  \
-       asm_fprintf (FILE, "\t.word %LL%d-.\n", VALUE);                 \
-      else                                                             \
-       asm_fprintf (FILE, "\t.word %LL%d-%LL%d\n", VALUE, REL);                \
-    }                                                                  \
-  while (0)
+  asm_fprintf (FILE, "\t.word %LL%d-%LL%d\n", VALUE, REL)
 
 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
   asm_fprintf (FILE, "\t.dword %LL%d\n", VALUE)
@@ -1279,7 +887,7 @@ enum cris_pic_symbol_type
 
 /* Node: All Debuggers */
 
-#define DBX_REGISTER_NUMBER(REGNO)                             \
+#define DEBUGGER_REGNO(REGNO)                          \
  ((REGNO) == CRIS_SRP_REGNUM ? CRIS_CANONICAL_SRP_REGNUM :     \
   (REGNO) == CRIS_MOF_REGNUM ? CRIS_CANONICAL_MOF_REGNUM :     \
   (REGNO) == CRIS_CC0_REGNUM ? CRIS_CANONICAL_CC0_REGNUM :     \
@@ -1288,25 +896,7 @@ enum cris_pic_symbol_type
 /* FIXME: Investigate DEBUGGER_AUTO_OFFSET, DEBUGGER_ARG_OFFSET.  */
 
 
-/* Node: DBX Options */
-
-/* Is this correct? Check later.  */
-#define DBX_NO_XREFS
-
-#define DBX_CONTIN_LENGTH 0
-
-/* FIXME: Is this needed when we have 0 DBX_CONTIN_LENGTH?  */
-#define DBX_CONTIN_CHAR '?'
-
-
-/* Node: DBX Hooks */
-/* (no definitions) */
-
-/* Node: File names and DBX */
-/* (no definitions) */
-
-
-/* Node: SDB and DWARF */
+/* Node: DWARF */
 /* (no definitions) */
 
 /* Node: Misc */
@@ -1324,8 +914,6 @@ enum cris_pic_symbol_type
 /* FIXME: Investigate CASE_VECTOR_SHORTEN_MODE to make sure HImode is not
    used when broken-.word could possibly fail (plus testcase).  */
 
-#define FIXUNS_TRUNC_LIKE_FIX_TRUNC
-
 /* This is the number of bytes that can be moved in one
    reasonably fast instruction sequence.  For CRIS, this is two
    instructions: mem => reg, reg => mem.  */
@@ -1333,8 +921,6 @@ enum cris_pic_symbol_type
 
 /* Maybe SHIFT_COUNT_TRUNCATED is safe to define?  FIXME: Check later.  */
 
-#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
-
 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
 #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
 
@@ -1342,11 +928,6 @@ enum cris_pic_symbol_type
 
 #define FUNCTION_MODE QImode
 
-#define NO_IMPLICIT_EXTERN_C
-
-/* No specific purpose other than warningless compatibility.  */
-#define HANDLE_PRAGMA_PACK_PUSH_POP 1
-
 /*
  * Local variables:
  * eval: (c-set-style "gnu")