OSDN Git Service

* Makefile.in (cse.o): Depend on TARGET_H.
[pf3gnuchains/gcc-fork.git] / gcc / config / v850 / v850.h
index eb41ff9..447e247 100644 (file)
@@ -1,29 +1,28 @@
 /* Definitions of target machine for GNU compiler. NEC V850 series
-   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    Contributed by Jeff Law (law@cygnus.com).
 
-This file is part of GNU CC.
+   This file is part of GNU CC.
 
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   GNU CC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   GNU CC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with GNU CC; see the file COPYING.  If not, write to
+   the Free Software Foundation, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef GCC_V850_H
 #define GCC_V850_H
 
-#include "svr4.h"      /* Automatically does #undef CPP_PREDEFINES */
-
 /* These are defiend in svr4.h but we want to override them.  */
 #undef ASM_FINAL_SPEC
 #undef LIB_SPEC
@@ -32,8 +31,8 @@ Boston, MA 02111-1307, USA.  */
 #undef STARTFILE_SPEC
 #undef ASM_SPEC
 
-
 #define TARGET_CPU_generic     1
+#define TARGET_CPU_v850e       2
 
 #ifndef TARGET_CPU_DEFAULT
 #define TARGET_CPU_DEFAULT     TARGET_CPU_generic
@@ -44,9 +43,22 @@ Boston, MA 02111-1307, USA.  */
 #define SUBTARGET_CPP_SPEC     "%{!mv*:-D__v850__}"
 #define TARGET_VERSION                 fprintf (stderr, " (NEC V850)");
 
+/* Choose which processor will be the default.
+   We must pass a -mv850xx option to the assembler if no explicit -mv* option
+   is given, because the assembler's processor default may not be correct.  */
+#if TARGET_CPU_DEFAULT == TARGET_CPU_v850e
+#undef  MASK_DEFAULT
+#define MASK_DEFAULT            MASK_V850E
+#undef  SUBTARGET_ASM_SPEC
+#define SUBTARGET_ASM_SPEC     "%{!mv*:-mv850e}"
+#undef  SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC     "%{!mv*:-D__v850e__}"
+#undef  TARGET_VERSION
+#define TARGET_VERSION                 fprintf (stderr, " (NEC V850E)");
+#endif
 
 #define ASM_SPEC "%{mv*:-mv%*}"
-#define CPP_SPEC               "%{mv850ea:-D__v850ea__} %{mv850e:-D__v850e__} %{mv850:-D__v850__} %(subtarget_cpp_spec)"
+#define CPP_SPEC               "%{mv850e:-D__v850e__} %{mv850:-D__v850__} %(subtarget_cpp_spec)"
 
 #define EXTRA_SPECS \
  { "subtarget_asm_spec", SUBTARGET_ASM_SPEC }, \
@@ -68,8 +80,16 @@ extern int target_flags;
 
 #define MASK_CPU                0x00000030
 #define MASK_V850               0x00000010
+#define MASK_V850E              0x00000020
+#define MASK_SMALL_SLD          0x00000040
 
 #define MASK_BIG_SWITCH                0x00000100
+#define MASK_NO_APP_REGS        0x00000200
+#define MASK_DISABLE_CALLT      0x00000400
+#define MASK_STRICT_ALIGN       0x00000800
+
+#define MASK_US_BIT_SET         0x00001000
+#define MASK_US_MASK_SET        0x00002000
 
 /* Macros used in the machine description to test the flags.  */
 
@@ -108,8 +128,25 @@ extern int target_flags;
 /* Whether to emit 2 byte per entry or 4 byte per entry switch tables.  */
 #define TARGET_BIG_SWITCH (target_flags & MASK_BIG_SWITCH)
 
-/* General debug flag */
-#define TARGET_DEBUG (target_flags & MASK_DEBUG)
+/* General debug flag.  */
+#define TARGET_DEBUG           (target_flags & MASK_DEBUG)
+#define TARGET_V850E                   ((target_flags & MASK_V850E) == MASK_V850E)
+
+#define TARGET_US_BIT_SET      (target_flags & MASK_US_BIT_SET)
+
+/* Whether to assume that the SLD.B and SLD.H instructions only have small
+   displacement fields, thus allowing the generated code to run on any of
+   the V850 range of processors.  */
+#define TARGET_SMALL_SLD       (target_flags & MASK_SMALL_SLD)
+
+/* True if callt will not be used for function prolog & epilog.  */
+#define TARGET_DISABLE_CALLT   (target_flags & MASK_DISABLE_CALLT)
+
+/* False if r2 and r5 can be used by the compiler.  True if r2
+   and r5 are to be fixed registers (for compatibility with GHS).  */
+#define TARGET_NO_APP_REGS     (target_flags & MASK_NO_APP_REGS)
+
+#define TARGET_STRICT_ALIGN    (target_flags & MASK_STRICT_ALIGN)
 
 /* Macro to define tables used to set the flags.
    This is a list in braces of pairs in braces,
@@ -135,6 +172,22 @@ extern int target_flags;
    { "v850",                    MASK_V850,                             \
                                 N_("Compile for the v850 processor") },        \
    { "v850",                    -(MASK_V850 ^ MASK_CPU), "" },         \
+   { "v850e",                   MASK_V850E, N_("Compile for v850e processor") }, \
+   { "v850e",                  -(MASK_V850E ^ MASK_CPU), "" }, /* Make sure that the other bits are cleared.  */ \
+   { "small-sld",               MASK_SMALL_SLD, N_("Enable the use of the short load instructions") }, \
+   { "no-small-sld",           -MASK_SMALL_SLD, "" },                  \
+   { "disable-callt",            MASK_DISABLE_CALLT,                   \
+                                       N_("Do not use the callt instruction") },   \
+   { "no-disable-callt",        -MASK_DISABLE_CALLT, "" },                     \
+   { "US-bit-set",              (MASK_US_BIT_SET | MASK_US_MASK_SET), "" },    \
+   { "no-US-bit-set",          -MASK_US_BIT_SET, "" },                 \
+   { "no-US-bit-set",           MASK_US_MASK_SET, "" },                \
+   { "app-regs",                -MASK_NO_APP_REGS, ""  },               \
+   { "no-app-regs",              MASK_NO_APP_REGS,                     \
+                                       N_("Do not use registers r2 and r5") }, \
+   { "strict-align",             MASK_STRICT_ALIGN,                    \
+                               N_("Enfore strict alignment") },        \
+   { "no-strict-align",         -MASK_STRICT_ALIGN, "" },              \
    { "big-switch",              MASK_BIG_SWITCH,                       \
                                        N_("Use 4 byte entries in switch tables") },\
    { "",                        MASK_DEFAULT, ""}}
@@ -159,24 +212,6 @@ enum small_memory_type {
 
 extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 
-/* This macro is similar to `TARGET_SWITCHES' but defines names of
-   command options that have values.  Its definition is an
-   initializer with a subgrouping for each command option.
-
-   Each subgrouping contains a string constant, that defines the
-   fixed part of the option name, and the address of a variable.  The
-   variable, type `char *', is set to the variable part of the given
-   option if the fixed part matches.  The actual option name is made
-   by appending `-m' to the specified name.
-
-   Here is an example which defines `-mshort-data-NUMBER'.  If the
-   given option is `-mshort-data-512', the variable `m88k_short_data'
-   will be set to the string `"512"'.
-
-          extern char *m88k_short_data;
-          #define TARGET_OPTIONS \
-           { { "short-data-", &m88k_short_data } } */
-
 #define TARGET_OPTIONS                                                 \
 {                                                                      \
   { "tda=",    &small_memory[ (int)SMALL_MEMORY_TDA ].value,           \
@@ -214,7 +249,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
    LEVEL is the optimization level specified; 2 if `-O2' is
    specified, 1 if `-O' is specified, and 0 if neither is specified.
 
-   SIZE is non-zero if `-Os' is specified, 0 otherwise.  
+   SIZE is nonzero if `-Os' is specified, 0 otherwise.  
 
    You should not use this macro to change options that are not
    machine-specific.  These should uniformly selected by the same
@@ -226,6 +261,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 
 #define OPTIMIZATION_OPTIONS(LEVEL,SIZE)                               \
 {                                                                      \
+  target_flags |= MASK_STRICT_ALIGN;                                   \
   if (LEVEL)                                                           \
     target_flags |= (MASK_EP | MASK_PROLOG_FUNCTION);                  \
 }
@@ -247,22 +283,9 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
    This is not true on the NEC V850.  */
 #define WORDS_BIG_ENDIAN 0
 
-/* Number of bits in an addressable storage unit */
-#define BITS_PER_UNIT 8
-
-/* Width in bits of a "word", which is the contents of a machine register.
-   Note that this is not necessarily the width of data type `int';
-   if using 16-bit ints on a 68000, this would still be 32.
-   But on a machine with 16-bit registers, this would be 16.  */
-#define BITS_PER_WORD          32
-
 /* Width of a word, in units (bytes).  */
 #define UNITS_PER_WORD         4
 
-/* Width in bits of a pointer.
-   See also the macro `Pmode' defined below.  */
-#define POINTER_SIZE           32
-
 /* Define this macro if it is advisable to hold scalars in registers
    in a wider mode than that declared by the program.  In such cases,
    the value is constrained to be within the bounds of the declared
@@ -298,23 +321,12 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 
 /* Define this if move instructions will actually fail to work
    when given unaligned data.  */
-#ifndef STRICT_ALIGNMENT 
-#define STRICT_ALIGNMENT TARGET_V850
-#endif
+#define STRICT_ALIGNMENT  TARGET_STRICT_ALIGN
 
 /* Define this as 1 if `char' should by default be signed; else as 0.
 
    On the NEC V850, loads do sign extension, so make this default. */
 #define DEFAULT_SIGNED_CHAR 1
-
-/* 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
 \f
 /* Standard register usage.  */
 
@@ -370,6 +382,17 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
    0,  1,  3,  4,  5, 30, 32, 33       /* fixed registers */           \
 }
 
+/* If TARGET_NO_APP_REGS is not defined then add r2 and r5 to
+   the pool of fixed registers. See PR 14505. */
+#define CONDITIONAL_REGISTER_USAGE  \
+{                                                       \
+  if (TARGET_NO_APP_REGS)                               \
+    {                                                   \
+     fixed_regs[2] = 1;  call_used_regs[2] = 1;         \
+     fixed_regs[5] = 1;  call_used_regs[5] = 1;         \
+    }                                                   \
+}
+
 /* Return number of consecutive hard regs needed starting at reg REGNO
    to hold something of mode MODE.
 
@@ -500,11 +523,11 @@ enum reg_class
 #define CONST_OK_FOR_M(VALUE) ((unsigned)(VALUE) < 0x10000)
 /* 5 bit unsigned immediate in shift instructions */
 #define CONST_OK_FOR_N(VALUE) ((unsigned) (VALUE) <= 31)
+/* 9 bit signed immediate for word multiply instruction.  */
+#define CONST_OK_FOR_O(VALUE) ((unsigned) (VALUE) + 0x100 < 0x200)
 
-#define CONST_OK_FOR_O(VALUE) 0
 #define CONST_OK_FOR_P(VALUE) 0
 
-
 #define CONST_OK_FOR_LETTER_P(VALUE, C)  \
   ((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \
    (C) == 'J' ? CONST_OK_FOR_J (VALUE) : \
@@ -641,7 +664,7 @@ enum reg_class
  { ARG_POINTER_REGNUM,  STACK_POINTER_REGNUM },                        \
  { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM }}                  \
 
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
    try to replace register number FROM-REG with register number
    TO-REG.  This macro need only be defined if `ELIMINABLE_REGS' is
    defined, and will usually be the constant 1, since most of the
@@ -681,6 +704,7 @@ enum reg_class
 
 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
 
+#define RETURN_ADDR_RTX(COUNT, FP) v850_return_addr (COUNT)
 \f
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
@@ -689,7 +713,7 @@ enum reg_class
    such as FUNCTION_ARG to determine where the next arg should go.  */
 
 #define CUMULATIVE_ARGS struct cum_arg
-struct cum_arg { int nbytes; };
+struct cum_arg { int nbytes; int anonymous_args; };
 
 /* Define where to put the arguments to a function.
    Value is zero to push the argument on the stack,
@@ -715,7 +739,7 @@ struct cum_arg { int nbytes; };
    For a library call, FNTYPE is 0.  */
 
 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT)      \
- ((CUM).nbytes = 0)
+ ((CUM).nbytes = 0, (CUM).anonymous_args = 0)
 
 /* Update the data in CUM to advance over an argument
    of mode MODE and data type TYPE.
@@ -734,10 +758,9 @@ struct cum_arg { int nbytes; };
    space allocated by the caller.  */
 #define OUTGOING_REG_PARM_STACK_SPACE
 
-extern int current_function_anonymous_args;
 /* Do any setup necessary for varargs/stdargs functions.  */
 #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \
-  current_function_anonymous_args = (!TARGET_GHS ? 1 : 0);
+  (CUM).anonymous_args = (!TARGET_GHS ? 1 : 0);
 
 /* Implement `va_arg'.  */
 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
@@ -789,6 +812,12 @@ extern int current_function_anonymous_args;
 
 #define EXIT_IGNORE_STACK 1
 
+/* Define this macro as a C expression that is nonzero for registers
+   used by the epilogue or the `return' pattern.  */
+
+#define EPILOGUE_USES(REGNO) \
+  (reload_completed && (REGNO) == LINK_POINTER_REGNUM)
+
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  */
 
@@ -797,7 +826,7 @@ extern int current_function_anonymous_args;
 #define TRAMPOLINE_TEMPLATE(FILE)                      \
   do {                                                 \
     fprintf (FILE, "\tjarl .+4,r12\n");                        \
-    fprintf (FILE, "\tld.w 12[r12],r5\n");             \
+    fprintf (FILE, "\tld.w 12[r12],r20\n");            \
     fprintf (FILE, "\tld.w 16[r12],r12\n");            \
     fprintf (FILE, "\tjmp [r12]\n");                   \
     fprintf (FILE, "\tnop\n");                         \
@@ -893,7 +922,7 @@ extern int current_function_anonymous_args;
  ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP), 0)                      \
   : (C) == 'R' ? special_symbolref_operand (OP, VOIDmode)              \
   : (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF && ! ZDA_NAME_P (XSTR (OP, 0))) \
-  : (C) == 'T' ? 0                                                     \
+  : (C) == 'T' ? ep_memory_operand(OP,GET_MODE(OP),TRUE)                       \
   : (C) == 'U' ? ((GET_CODE (OP) == SYMBOL_REF && ZDA_NAME_P (XSTR (OP, 0))) \
                  || (GET_CODE (OP) == CONST                            \
                      && GET_CODE (XEXP (OP, 0)) == PLUS                \
@@ -985,7 +1014,7 @@ do {                                                                       \
 /* Tell final.c how to eliminate redundant test instructions.  */
 
 /* Here we define machine-dependent flags and fields in cc_status
-   (see `conditions.h').  No extra ones are needed for the vax.  */
+   (see `conditions.h').  No extra ones are needed for the VAX.  */
 
 /* Store in cc_status the expressions
    that the condition codes will describe
@@ -996,45 +1025,6 @@ do {                                                                      \
 #define CC_NO_CARRY CC_NO_OVERFLOW
 #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP, INSN)
 
-/* A part of a C `switch' statement that describes the relative costs
-   of constant RTL expressions.  It must contain `case' labels for
-   expression codes `const_int', `const', `symbol_ref', `label_ref'
-   and `const_double'.  Each case must ultimately reach a `return'
-   statement to return the relative cost of the use of that kind of
-   constant value in an expression.  The cost may depend on the
-   precise value of the constant, which is available for examination
-   in X, and the rtx code of the expression in which it is contained,
-   found in OUTER_CODE.
-
-   CODE is the expression code--redundant, since it can be obtained
-   with `GET_CODE (X)'. */
-
-#define CONST_COSTS(RTX,CODE,OUTER_CODE)                               \
-  case CONST_INT:                                                      \
-  case CONST_DOUBLE:                                                   \
-  case CONST:                                                          \
-  case SYMBOL_REF:                                                     \
-  case LABEL_REF:                                                      \
-    {                                                                  \
-      int _zxy = const_costs(RTX, CODE);                               \
-      return (_zxy) ? COSTS_N_INSNS (_zxy) : 0;                                \
-    }
-
-/* A crude cut at RTX_COSTS for the V850.  */
-
-/* Provide the costs of a rtl expression.  This is in the body of a
-   switch on CODE. 
-
-   There aren't DImode MOD, DIV or MULT operations, so call them
-   very expensive.  Everything else is pretty much a constant cost.  */
-
-#define RTX_COSTS(RTX,CODE,OUTER_CODE)                                 \
-  case MOD:                                                            \
-  case DIV:                                                            \
-    return 60;                                                         \
-  case MULT:                                                           \
-    return 20;
-
 /* All addressing modes have the same cost on the V850 series.  */
 #define ADDRESS_COST(ADDR) 1
 
@@ -1042,9 +1032,6 @@ do {                                                                      \
    than accessing full words.  */
 #define SLOW_BYTE_ACCESS 1
 
-/* Define this if zero-extension is slow (more than one real instruction).  */
-#define SLOW_ZERO_EXTEND 
-
 /* According expr.c, a value of around 6 should minimize code size, and
    for the V850 series, that's our primary concern.  */
 #define MOVE_RATIO 6
@@ -1066,8 +1053,8 @@ typedef enum
    `in_text' and `in_data'.  You need not define this macro on a
    system with no other sections (that GCC needs to use).  */
 #undef EXTRA_SECTIONS
-#define EXTRA_SECTIONS in_tdata, in_sdata, in_zdata, in_const, in_ctors, \
-in_dtors, in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
+#define EXTRA_SECTIONS in_tdata, in_sdata, in_zdata, \
+ in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
 
 /* One or more functions to be defined in `varasm.c'.  These
    functions should do jobs analogous to those of `text_section' and
@@ -1077,10 +1064,6 @@ in_dtors, in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
 
 /* This could be done a lot more cleanly using ANSI C ... */
 #define EXTRA_SECTION_FUNCTIONS                                                \
-CONST_SECTION_FUNCTION                                                 \
-CTORS_SECTION_FUNCTION                                                 \
-DTORS_SECTION_FUNCTION                                                 \
-                                                                       \
 void                                                                   \
 sdata_section ()                                                       \
 {                                                                      \
@@ -1166,81 +1149,6 @@ zbss_section ()                                                          \
 #define ZCOMMON_ASM_OP                "\t.zcomm\t"
 #define TCOMMON_ASM_OP                "\t.tcomm\t"
 
-/* A C statement or statements to switch to the appropriate section
-   for output of EXP.  You can assume that EXP is either a `VAR_DECL'
-   node or a constant of some sort.  RELOC indicates whether the
-   initial value of EXP requires link-time relocations.  Select the
-   section by calling `text_section' or one of the alternatives for
-   other sections.
-
-   Do not define this macro if you put all read-only variables and
-   constants in the read-only data section (usually the text section).  */
-#undef  SELECT_SECTION
-#define SELECT_SECTION(EXP, RELOC)                                     \
-do {                                                                   \
-  if (TREE_CODE (EXP) == VAR_DECL)                                     \
-    {                                                                  \
-      int is_const;                                                    \
-      if (!TREE_READONLY (EXP)                                         \
-         || TREE_SIDE_EFFECTS (EXP)                                    \
-         || !DECL_INITIAL (EXP)                                        \
-         || (DECL_INITIAL (EXP) != error_mark_node                     \
-             && !TREE_CONSTANT (DECL_INITIAL (EXP))))                  \
-        is_const = FALSE;                                              \
-      else                                                             \
-        is_const = TRUE;                                               \
-                                                                       \
-      switch (v850_get_data_area (EXP))                                        \
-        {                                                              \
-        case DATA_AREA_ZDA:                                            \
-         if (is_const)                                                 \
-           rozdata_section ();                                         \
-         else                                                          \
-           zdata_section ();                                           \
-         break;                                                        \
-                                                                       \
-        case DATA_AREA_TDA:                                            \
-         tdata_section ();                                             \
-         break;                                                        \
-                                                                       \
-        case DATA_AREA_SDA:                                            \
-         if (is_const)                                                 \
-           rosdata_section ();                                         \
-         else                                                          \
-           sdata_section ();                                           \
-         break;                                                        \
-                                                                       \
-        default:                                                       \
-          if (is_const)                                                        \
-           const_section ();                                           \
-         else                                                          \
-           data_section ();                                            \
-         break;                                                        \
-        }                                                              \
-    }                                                                  \
-  else if (TREE_CODE (EXP) == STRING_CST)                              \
-    {                                                                  \
-      if (! flag_writable_strings)                                     \
-       const_section ();                                               \
-      else                                                             \
-       data_section ();                                                \
-    }                                                                  \
-                                                                       \
-  else                                                                 \
-    const_section ();                                                  \
-                                                                       \
-} while (0)
-
-/* A C statement or statements to switch to the appropriate section
-   for output of RTX in mode MODE.  You can assume that RTX is some
-   kind of constant in RTL.  The argument MODE is redundant except in
-   the case of a `const_int' rtx.  Select the section by calling
-   `text_section' or one of the alternatives for other sections.
-
-   Do not define this macro if you put all constants in the read-only
-   data section.  */
-/* #define SELECT_RTX_SECTION(MODE, RTX) */
-
 /* Output at beginning/end of assembler file.  */
 #undef ASM_FILE_START
 #define ASM_FILE_START(FILE) asm_file_start(FILE)
@@ -1257,51 +1165,12 @@ do {                                                                    \
 
 #define ASM_APP_OFF "#NO_APP\n"
 
-/* This is how to output an assembler line defining a `double' constant.
-   It is .double or .float, depending.  */
-
-#define ASM_OUTPUT_DOUBLE(FILE, VALUE)                 \
-do { char dstr[30];                                    \
-     REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
-     fprintf (FILE, "\t.double %s\n", dstr);           \
-   } while (0)
-
-
-/* This is how to output an assembler line defining a `float' constant.  */
-#define ASM_OUTPUT_FLOAT(FILE, VALUE)                  \
-do { char dstr[30];                                    \
-     REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
-     fprintf (FILE, "\t.float %s\n", dstr);            \
-   } while (0)
-
-/* This is how to output an assembler line defining an `int' constant.  */
-
-#define ASM_OUTPUT_INT(FILE, VALUE)            \
-( fprintf (FILE, "\t.long "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
+#undef  USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX "_"
 
-/* Likewise for `char' and `short' constants.  */
-
-#define ASM_OUTPUT_SHORT(FILE, VALUE)          \
-( fprintf (FILE, "\t.hword "),                 \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
-
-#define ASM_OUTPUT_CHAR(FILE, VALUE)           \
-( fprintf (FILE, "\t.byte "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
-
-/* This is how to output an assembler line for a numeric constant byte.  */
-#define ASM_OUTPUT_BYTE(FILE, VALUE)  \
-  fprintf (FILE, "\t.byte 0x%x\n", (VALUE))
-
-/* Define the parentheses used to group arithmetic operations
-   in assembler code.  */
-
-#define ASM_OPEN_PAREN "("
-#define ASM_CLOSE_PAREN ")"
+#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL)  \
+  if (! v850_output_addr_const_extra (FILE, X)) \
+     goto FAIL
 
 /* This says how to output the assembler to define a global
    uninitialized but not common symbol.  */
@@ -1327,36 +1196,17 @@ do { char dstr[30];                                     \
 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \
      v850_output_local (FILE, DECL, NAME, SIZE, ALIGN)
      
-/* This is how to output the definition of a user-level label named NAME,
-   such as the label on a static function or variable NAME.  */
-
-#define ASM_OUTPUT_LABEL(FILE, NAME)   \
-  do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
-
-/* This is how to output a command to make the user-level label named NAME
-   defined for reference from other files.  */
-
-#define ASM_GLOBALIZE_LABEL(FILE, NAME)        \
-  do { fputs ("\t.global ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
+/* Globalizing directive for a label.  */
+#define GLOBAL_ASM_OP "\t.global "
 
 /* This is how to output a reference to a user-level label named NAME.
    `assemble_name' uses this.  */
 
 #undef ASM_OUTPUT_LABELREF
-#define ASM_OUTPUT_LABELREF(FILE, NAME)                  \
-  do {                                            \
-  const char * real_name;                         \
-  STRIP_NAME_ENCODING (real_name, (NAME));        \
-  fprintf (FILE, "_%s", real_name);               \
-  } while (0)           
+#define ASM_OUTPUT_LABELREF(FILE, NAME) \
+  asm_fprintf (FILE, "%U%s", (*targetm.strip_name_encoding) (NAME))
 
-/* 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.  */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),   \
-  sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
 
 /* This is how we tell the assembler that two symbols have the same value.  */
 
@@ -1406,15 +1256,17 @@ do { char dstr[30];                                     \
 /* This is how to output an element of a case-vector that is absolute.  */
 
 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
-  asm_fprintf (FILE, "\t%s .L%d\n",                                    \
-              (TARGET_BIG_SWITCH ? ".long" : ".short"), VALUE)
+  fprintf (FILE, "\t%s .L%d\n",                                        \
+          (TARGET_BIG_SWITCH ? ".long" : ".short"), VALUE)
 
 /* This is how to output an element of a case-vector that is relative.  */
 
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
-  fprintf (FILE, "\t%s .L%d-.L%d\n",                                   \
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)               \
+  fprintf (FILE, "\t%s %s.L%d-.L%d%s\n",                               \
           (TARGET_BIG_SWITCH ? ".long" : ".short"),                    \
-          VALUE, REL)
+          (! TARGET_BIG_SWITCH && TARGET_V850E ? "(" : ""),            \
+          VALUE, REL,                                                  \
+          (! TARGET_BIG_SWITCH && TARGET_V850E ? ")>>1" : ""))
 
 #define ASM_OUTPUT_ALIGN(FILE, LOG)    \
   if ((LOG) != 0)                      \
@@ -1427,12 +1279,6 @@ do { char dstr[30];                                      \
 #undef PREFERRED_DEBUGGING_TYPE
 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
 
-#define DBX_REGISTER_NUMBER(REGNO) REGNO
-
-/* Define to use software floating point emulator for REAL_ARITHMETIC and
-   decimal <-> binary conversion. */
-#define REAL_ARITHMETIC
-
 /* Specify the machine mode that this machine uses
    for the index in the tablejump instruction.  */
 #define CASE_VECTOR_MODE (TARGET_BIG_SWITCH ? SImode : HImode)
@@ -1462,16 +1308,10 @@ do { char dstr[30];                                     \
 /* Byte and short loads sign extend the value to a word.  */
 #define LOAD_EXTEND_OP(MODE) SIGN_EXTEND
 
-/* Specify the tree operation to be used to convert reals to integers.  */
-#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
-
 /* This flag, if defined, says the same insns that convert to a signed fixnum
    also convert validly to an unsigned one.  */
 #define FIXUNS_TRUNC_LIKE_FIX_TRUNC
 
-/* This is the kind of divide that is easiest to do in the general case.  */
-#define EASY_DIV_EXPR TRUNC_DIV_EXPR
-
 /* Max number of bytes we can move from memory to memory
    in one reasonably fast instruction.  */
 #define MOVE_MAX       4
@@ -1487,6 +1327,23 @@ do { char dstr[30];                                      \
 
 #define STORE_FLAG_VALUE 1
 
+#define MULDI3_LIBCALL  "__muldi3"
+#define UCMPDI2_LIBCALL "__ucmpdi2"
+#define CMPDI2_LIBCALL  "__cmpdi2"
+#define NEGDI2_LIBCALL  "__negdi2"
+
+#define INIT_TARGET_OPTABS                             \
+  do                                                   \
+    {                                                  \
+      cmp_optab->handlers[(int) DImode].libfunc                \
+       = init_one_libfunc (CMPDI2_LIBCALL);            \
+      ucmp_optab->handlers[(int) DImode].libfunc        \
+       = init_one_libfunc (UCMPDI2_LIBCALL);           \
+      neg_optab->handlers[(int) DImode].libfunc                \
+       = init_one_libfunc (NEGDI2_LIBCALL);            \
+    }                                                  \
+  while (0)
+
 /* Specify the machine mode that pointers have.
    After generation of rtl, the compiler makes no further distinction
    between pointers and any other objects of this machine mode.  */
@@ -1497,27 +1354,16 @@ do { char dstr[30];                                     \
    so give the MEM rtx a byte's mode.  */
 #define FUNCTION_MODE QImode
 
-/* 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, IDENTIFIER, ARGS) \
-  v850_valid_machine_decl_attribute (DECL, IDENTIFIER, ARGS)
-
-/* A C statement that assigns default attributes to a newly created DECL.  */
-#define SET_DEFAULT_DECL_ATTRIBUTES(decl, attr) \
-     v850_set_default_decl_attr (decl)
-
 /* Tell compiler we want to support GHS pragmas */
-#define REGISTER_TARGET_PRAGMAS(PFILE) do {                              \
-  cpp_register_pragma_space (PFILE, "ghs");                              \
-  cpp_register_pragma (PFILE, "ghs", "interrupt", ghs_pragma_interrupt);  \
-  cpp_register_pragma (PFILE, "ghs", "section",   ghs_pragma_section);    \
-  cpp_register_pragma (PFILE, "ghs", "starttda",  ghs_pragma_starttda);   \
-  cpp_register_pragma (PFILE, "ghs", "startsda",  ghs_pragma_startsda);   \
-  cpp_register_pragma (PFILE, "ghs", "startzda",  ghs_pragma_startzda);   \
-  cpp_register_pragma (PFILE, "ghs", "endtda",    ghs_pragma_endtda);    \
-  cpp_register_pragma (PFILE, "ghs", "endsda",    ghs_pragma_endsda);    \
-  cpp_register_pragma (PFILE, "ghs", "endzda",    ghs_pragma_endzda);    \
+#define REGISTER_TARGET_PRAGMAS() do {                         \
+  c_register_pragma ("ghs", "interrupt", ghs_pragma_interrupt);        \
+  c_register_pragma ("ghs", "section",   ghs_pragma_section);  \
+  c_register_pragma ("ghs", "starttda",  ghs_pragma_starttda); \
+  c_register_pragma ("ghs", "startsda",  ghs_pragma_startsda); \
+  c_register_pragma ("ghs", "startzda",  ghs_pragma_startzda); \
+  c_register_pragma ("ghs", "endtda",    ghs_pragma_endtda);   \
+  c_register_pragma ("ghs", "endsda",    ghs_pragma_endsda);   \
+  c_register_pragma ("ghs", "endzda",    ghs_pragma_endzda);   \
 } while (0)
 
 /* enum GHS_SECTION_KIND is an enumeration of the kinds of sections that
@@ -1555,6 +1401,24 @@ enum GHS_section_kind
   COUNT_OF_GHS_SECTION_KINDS  /* must be last */
 };
 
+/* The following code is for handling pragmas supported by the
+   v850 compiler produced by Green Hills Software.  This is at
+   the specific request of a customer.  */
+
+typedef struct data_area_stack_element
+{
+  struct data_area_stack_element * prev;
+  v850_data_area                   data_area; /* Current default data area.  */
+} data_area_stack_element;
+
+/* Track the current data area set by the
+   data area pragma (which can be nested).  */
+extern data_area_stack_element * data_area_stack;
+
+/* Names of the various data areas used on the v850.  */
+extern union tree_node * GHS_default_section_names [(int) COUNT_OF_GHS_SECTION_KINDS];
+extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_KINDS];
+
 /* The assembler op to start the file.  */
 
 #define FILE_ASM_OP "\t.file\n"
@@ -1567,15 +1431,6 @@ enum GHS_section_kind
 
 #define EP_REGNUM 30   /* ep register number */
 
-#define ENCODE_SECTION_INFO(DECL)                      \
-  do                                                   \
-    {                                                  \
-      if ((TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \
-         && TREE_CODE (DECL) == VAR_DECL)              \
-       v850_encode_data_area (DECL);                   \
-    }                                                  \
-  while (0)
-
 #define ZDA_NAME_FLAG_CHAR '@'
 #define TDA_NAME_FLAG_CHAR '%'
 #define SDA_NAME_FLAG_CHAR '&'
@@ -1585,13 +1440,10 @@ enum GHS_section_kind
 #define SDA_NAME_P(NAME) (*(NAME) == SDA_NAME_FLAG_CHAR)
 
 #define ENCODED_NAME_P(SYMBOL_NAME)    \
-  (ZDA_NAME_P (SYMBOL_NAME)            \
+  (   ZDA_NAME_P (SYMBOL_NAME)         \
    || TDA_NAME_P (SYMBOL_NAME)         \
    || SDA_NAME_P (SYMBOL_NAME))
 
-#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
-     (VAR) = (SYMBOL_NAME) + (ENCODED_NAME_P (SYMBOL_NAME) || *(SYMBOL_NAME) == '*')
-
 /* Define this if you have defined special-purpose predicates in the
    file `MACHINE.c'.  This macro is called within an initializer of an
    array of structures.  The first field in the structure is the name
@@ -1600,9 +1452,10 @@ enum GHS_section_kind
    matched by the predicate.  The list should have a trailing comma.  */
 
 #define PREDICATE_CODES                                                        \
-{ "ep_memory_operand",         { MEM }},                               \
 { "reg_or_0_operand",          { REG, SUBREG, CONST_INT, CONST_DOUBLE }}, \
 { "reg_or_int5_operand",       { REG, SUBREG, CONST_INT }},            \
+{ "reg_or_int9_operand",       { REG, SUBREG, CONST_INT }},            \
+{ "reg_or_const_operand",       { REG, CONST_INT }},                   \
 { "call_address_operand",      { REG, SYMBOL_REF }},                   \
 { "movsi_source_operand",      { LABEL_REF, SYMBOL_REF, CONST_INT,     \
                                  CONST_DOUBLE, CONST, HIGH, MEM,       \
@@ -1612,6 +1465,9 @@ enum GHS_section_kind
 { "pattern_is_ok_for_prologue",        { PARALLEL }},                          \
 { "pattern_is_ok_for_epilogue",        { PARALLEL }},                          \
 { "register_is_ok_for_epilogue",{ REG }},                              \
+{ "pattern_is_ok_for_dispose", { PARALLEL }},                          \
+{ "pattern_is_ok_for_prepare", { PARALLEL }},                          \
+{ "register_is_ok_for_dispose",        { REG }},                               \
 { "not_power_of_two_operand",  { CONST_INT }},
   
-#endif /* v850.h */
+#endif /* ! GCC_V850_H */