OSDN Git Service

* reginfo.c (init_reg_sets_1): Adjust comments.
[pf3gnuchains/gcc-fork.git] / gcc / config / v850 / v850.h
index bc8b040..25faff1 100644 (file)
@@ -1,13 +1,13 @@
 /* Definitions of target machine for GNU compiler. NEC V850 series
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+   2007, 2008, 2009  Free Software Foundation, Inc.
    Contributed by Jeff Law (law@cygnus.com).
 
    This file is part of GCC.
 
    GCC 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)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GCC is distributed in the hope that it will be useful,
@@ -16,9 +16,8 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING.  If not, write to
-   the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
 
 #ifndef GCC_V850_H
 #define GCC_V850_H
@@ -81,6 +80,8 @@
   builtin_define( "__v850" );                  \
   builtin_assert( "machine=v850" );            \
   builtin_assert( "cpu=v850" );                        \
+  if (TARGET_EP)                               \
+    builtin_define ("__EP__");                 \
 } while(0)
 
 #define MASK_CPU (MASK_V850 | MASK_V850E)
@@ -131,7 +132,13 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 {                                                                      \
   target_flags |= MASK_STRICT_ALIGN;                                   \
   if (LEVEL)                                                           \
-    target_flags |= (MASK_EP | MASK_PROLOG_FUNCTION);                  \
+    /* Note - we no longer enable MASK_EP when optimizing.  This is    \
+       because of a hardware bug which stops the SLD and SST instructions\
+       from correctly detecting some hazards.  If the user is sure that \
+       their hardware is fixed or that their program will not encounter \
+       the conditions that trigger the bug then they can enable -mep by \
+       hand.  */                                                       \
+    target_flags |= MASK_PROLOG_FUNCTION;                              \
 }
 
 \f
@@ -171,7 +178,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
 #define PARM_BOUNDARY          32
 
-/* The stack goes in 32 bit lumps.  */
+/* The stack goes in 32-bit lumps.  */
 #define STACK_BOUNDARY                 32
 
 /* Allocation boundary (in *bits*) for the code of a function.
@@ -311,6 +318,11 @@ enum reg_class
 
 #define N_REG_CLASSES (int) LIM_REG_CLASSES
 
+#define IRA_COVER_CLASSES              \
+{                                      \
+  GENERAL_REGS, LIM_REG_CLASSES                \
+}
+
 /* Give names of register classes as strings for dump file.  */
 
 #define REG_CLASS_NAMES \
@@ -379,19 +391,19 @@ enum reg_class
 #define INT_8_BITS(VALUE) ((unsigned) (VALUE) + 0x80 < 0x100)
 /* zero */
 #define CONST_OK_FOR_I(VALUE) ((VALUE) == 0)
-/* 5 bit signed immediate */
+/* 5-bit signed immediate */
 #define CONST_OK_FOR_J(VALUE) ((unsigned) (VALUE) + 0x10 < 0x20)
-/* 16 bit signed immediate */
+/* 16-bit signed immediate */
 #define CONST_OK_FOR_K(VALUE) ((unsigned) (VALUE) + 0x8000 < 0x10000)
 /* valid constant for movhi instruction.  */
 #define CONST_OK_FOR_L(VALUE) \
   (((unsigned) ((int) (VALUE) >> 16) + 0x8000 < 0x10000) \
    && CONST_OK_FOR_I ((VALUE & 0xffff)))
-/* 16 bit unsigned immediate */
+/* 16-bit unsigned immediate */
 #define CONST_OK_FOR_M(VALUE) ((unsigned)(VALUE) < 0x10000)
-/* 5 bit unsigned immediate in shift instructions */
+/* 5-bit unsigned immediate in shift instructions */
 #define CONST_OK_FOR_N(VALUE) ((unsigned) (VALUE) <= 31)
-/* 9 bit signed immediate for word multiply instruction.  */
+/* 9-bit signed immediate for word multiply instruction.  */
 #define CONST_OK_FOR_O(VALUE) ((unsigned) (VALUE) + 0x100 < 0x200)
 
 #define CONST_OK_FOR_P(VALUE) 0
@@ -434,12 +446,12 @@ enum reg_class
 
 #define STACK_GROWS_DOWNWARD
 
-/* Define this if the nominal address of the stack frame
+/* Define this to nonzero if the nominal address of the stack frame
    is at the high-address end of the local variables;
    that is, each additional local variable allocated
    goes at a more negative offset in the frame.  */
 
-#define FRAME_GROWS_DOWNWARD
+#define FRAME_GROWS_DOWNWARD 1
 
 /* Offset within stack frame to start allocating local variables at.
    If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
@@ -494,12 +506,6 @@ enum reg_class
 /* Register in which static-chain is passed to a function.  */
 #define STATIC_CHAIN_REGNUM 20
 
-/* Value should be nonzero if functions must have frame pointers.
-   Zero means the frame pointer need not be set up (and parms
-   may be accessed via the stack pointer) in functions that seem suitable.
-   This is computed in `reload', in reload1.c.  */
-#define FRAME_POINTER_REQUIRED 0
-
 /* If defined, this macro specifies a table of register pairs used to
    eliminate unneeded registers that point into the stack frame.  If
    it is not defined, the only elimination attempted by the compiler
@@ -532,16 +538,6 @@ enum reg_class
  { ARG_POINTER_REGNUM,  STACK_POINTER_REGNUM },                        \
  { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM }}                  \
 
-/* 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
-   cases preventing register elimination are things that the compiler
-   already knows about.  */
-
-#define CAN_ELIMINATE(FROM, TO) \
- ((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1)
-
 /* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'.  It
    specifies the initial difference between the specified pair of
    registers.  This macro must be defined if `ELIMINABLE_REGS' is
@@ -550,7 +546,7 @@ enum reg_class
 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                   \
 {                                                                      \
   if ((FROM) == FRAME_POINTER_REGNUM)                                  \
-    (OFFSET) = get_frame_size () + current_function_outgoing_args_size;        \
+    (OFFSET) = get_frame_size () + crtl->outgoing_args_size;   \
   else if ((FROM) == ARG_POINTER_REGNUM)                               \
    (OFFSET) = compute_frame_size (get_frame_size (), (long *)0);       \
   else                                                                 \
@@ -560,15 +556,6 @@ enum reg_class
 /* Keep the stack pointer constant throughout the function.  */
 #define ACCUMULATE_OUTGOING_ARGS 1
 
-/* Value is the number of bytes of arguments automatically
-   popped when returning from a subroutine call.
-   FUNDECL is the declaration node of the function (as a tree),
-   FUNTYPE is the data type of the function (as a tree),
-   or for a library call it is an identifier node for the subroutine name.
-   SIZE is the number of bytes of arguments passed on the stack.  */
-
-#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
@@ -618,20 +605,12 @@ struct cum_arg { int nbytes; int anonymous_args; };
 
 /* Define this if the above stack space is to be considered part of the
    space allocated by the caller.  */
-#define OUTGOING_REG_PARM_STACK_SPACE
+#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
 
 /* 1 if N is a possible register number for function argument passing.  */
 
 #define FUNCTION_ARG_REGNO_P(N) (N >= 6 && N <= 9)
 
-/* Define how to find the value returned by a function.
-   VALTYPE is the data type of the value (as a tree).
-   If the precise function being called is known, FUNC is its FUNCTION_DECL;
-   otherwise, FUNC is 0.  */
-   
-#define FUNCTION_VALUE(VALTYPE, FUNC) \
-  gen_rtx_REG (TYPE_MODE (VALTYPE), 10)
-
 /* Define how to find the value returned by a library function
    assuming the value has mode MODE.  */
 
@@ -662,33 +641,10 @@ struct cum_arg { int nbytes; int anonymous_args; };
 
 #define FUNCTION_PROFILER(FILE, LABELNO) ;
 
-#define TRAMPOLINE_TEMPLATE(FILE)                      \
-  do {                                                 \
-    fprintf (FILE, "\tjarl .+4,r12\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");                         \
-    fprintf (FILE, "\t.long 0\n");                     \
-    fprintf (FILE, "\t.long 0\n");                     \
-  } while (0)
-
 /* Length in units of the trampoline for entering a nested function.  */
 
 #define TRAMPOLINE_SIZE 24
 
-/* Emit RTL insns to initialize the variable parts of a trampoline.
-   FNADDR is an RTX for the address of the function's pure code.
-   CXT is an RTX for the static chain value for the function.  */
-
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                      \
-{                                                                      \
-  emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 16)),   \
-                (CXT));                                                \
-  emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 20)),   \
-                (FNADDR));                                             \
-}
-
 /* Addressing modes, and classification of registers for them.  */
 
 \f
@@ -758,11 +714,11 @@ struct cum_arg { int nbytes; int anonymous_args; };
    register class that does not include r0 on the output.  */
 
 #define EXTRA_CONSTRAINT(OP, C)                                                \
- ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP), 0)              \
+ ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP), FALSE)          \
   : (C) == 'R' ? special_symbolref_operand (OP, VOIDmode)              \
   : (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF                          \
                  && !SYMBOL_REF_ZDA_P (OP))                            \
-  : (C) == 'T' ? ep_memory_operand(OP,GET_MODE(OP),TRUE)               \
+  : (C) == 'T' ? ep_memory_operand (OP, GET_MODE (OP), TRUE)           \
   : (C) == 'U' ? ((GET_CODE (OP) == SYMBOL_REF                         \
                   && SYMBOL_REF_ZDA_P (OP))                            \
                  || (GET_CODE (OP) == CONST                            \
@@ -789,13 +745,14 @@ struct cum_arg { int nbytes; int anonymous_args; };
 
 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                                \
 do {                                                                   \
-  if (RTX_OK_FOR_BASE_P (X)) goto ADDR;                                        \
+  if (RTX_OK_FOR_BASE_P (X))                                           \
+    goto ADDR;                                                         \
   if (CONSTANT_ADDRESS_P (X)                                           \
       && (MODE == QImode || INTVAL (X) % 2 == 0)                       \
       && (GET_MODE_SIZE (MODE) <= 4 || INTVAL (X) % 4 == 0))           \
     goto ADDR;                                                         \
   if (GET_CODE (X) == LO_SUM                                           \
-      && GET_CODE (XEXP (X, 0)) == REG                                 \
+      && REG_P (XEXP (X, 0))                                           \
       && REG_OK_FOR_BASE_P (XEXP (X, 0))                               \
       && CONSTANT_P (XEXP (X, 1))                                      \
       && (GET_CODE (XEXP (X, 1)) != CONST_INT                          \
@@ -807,17 +764,15 @@ do {                                                                      \
       && (GET_MODE_SIZE (MODE) <= GET_MODE_SIZE (word_mode)))          \
      goto ADDR;                                                                \
   if (GET_CODE (X) == PLUS                                             \
+      && RTX_OK_FOR_BASE_P (XEXP (X, 0))                               \
       && CONSTANT_ADDRESS_P (XEXP (X, 1))                              \
-      && (MODE == QImode || INTVAL (XEXP (X, 1)) % 2 == 0)             \
-      && RTX_OK_FOR_BASE_P (XEXP (X, 0))) goto ADDR;                   \
+      && ((MODE == QImode || INTVAL (XEXP (X, 1)) % 2 == 0)            \
+          && CONST_OK_FOR_K (INTVAL (XEXP (X, 1))                      \
+                              + (GET_MODE_NUNITS (MODE) * UNITS_PER_WORD)))) \
+    goto ADDR;                 \
 } while (0)
 
 \f
-/* Go to LABEL if ADDR (a legitimate address expression)
-   has an effect that depends on the machine mode it is used for.  */
-
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  {}
-
 /* Nonzero if the constant value X is a legitimate general operand.
    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
 
@@ -849,7 +804,7 @@ do {                                                                        \
 
 /* 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
+#define MOVE_RATIO(speed) 6
 
 /* Indirect calls are expensive, never turn a direct call
    into an indirect call.  */
@@ -864,101 +819,11 @@ typedef enum
   DATA_AREA_ZDA
 } v850_data_area;
 
-/* A list of names for sections other than the standard two, which are
-   `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_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
-   `data_section', for your additional sections.  Do not define this
-   macro if you do not define `EXTRA_SECTIONS'.  */
-#undef EXTRA_SECTION_FUNCTIONS
-
-/* This could be done a lot more cleanly using ANSI C....  */
-#define EXTRA_SECTION_FUNCTIONS                                                \
-void                                                                   \
-sdata_section ()                                                       \
-{                                                                      \
-  if (in_section != in_sdata)                                          \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP);            \
-      in_section = in_sdata;                                           \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-rosdata_section ()                                                     \
-{                                                                      \
-  if (in_section != in_rosdata)                                                \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", ROSDATA_SECTION_ASM_OP);          \
-      in_section = in_sdata;                                           \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-sbss_section ()                                                                \
-{                                                                      \
-  if (in_section != in_sbss)                                           \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", SBSS_SECTION_ASM_OP);             \
-      in_section = in_sbss;                                            \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-tdata_section ()                                                       \
-{                                                                      \
-  if (in_section != in_tdata)                                          \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", TDATA_SECTION_ASM_OP);            \
-      in_section = in_tdata;                                           \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-zdata_section ()                                                       \
-{                                                                      \
-  if (in_section != in_zdata)                                          \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", ZDATA_SECTION_ASM_OP);            \
-      in_section = in_zdata;                                           \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-rozdata_section ()                                                     \
-{                                                                      \
-  if (in_section != in_rozdata)                                                \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", ROZDATA_SECTION_ASM_OP);          \
-      in_section = in_rozdata;                                         \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-void                                                                   \
-zbss_section ()                                                                \
-{                                                                      \
-  if (in_section != in_zbss)                                           \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", ZBSS_SECTION_ASM_OP);             \
-      in_section = in_zbss;                                            \
-    }                                                                  \
-}
-
 #define TEXT_SECTION_ASM_OP  "\t.section .text"
 #define DATA_SECTION_ASM_OP  "\t.section .data"
 #define BSS_SECTION_ASM_OP   "\t.section .bss"
 #define SDATA_SECTION_ASM_OP "\t.section .sdata,\"aw\""
 #define SBSS_SECTION_ASM_OP  "\t.section .sbss,\"aw\""
-#define ZDATA_SECTION_ASM_OP "\t.section .zdata,\"aw\""
-#define ZBSS_SECTION_ASM_OP  "\t.section .zbss,\"aw\""
-#define TDATA_SECTION_ASM_OP "\t.section .tdata,\"aw\""
-#define ROSDATA_SECTION_ASM_OP "\t.section .rosdata,\"a\""
-#define ROZDATA_SECTION_ASM_OP "\t.section .rozdata,\"a\""
 
 #define SCOMMON_ASM_OP                "\t.scomm\t"
 #define ZCOMMON_ASM_OP                "\t.zcomm\t"
@@ -1041,19 +906,6 @@ zbss_section ()                                                           \
   { "r30",     30 },                                                   \
   { "lp",      31} }
 
-/* Print an instruction operand X on file FILE.
-   look in v850.c for details */
-
-#define PRINT_OPERAND(FILE, X, CODE)  print_operand (FILE, X, CODE)
-
-#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
-  ((CODE) == '.')
-
-/* Print a memory operand whose address is X, on file FILE.
-   This uses a function in output-vax.c.  */
-
-#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
-
 #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)
 #define ASM_OUTPUT_REG_POP(FILE,REGNO)
 
@@ -1065,12 +917,14 @@ zbss_section ()                                                          \
 
 /* This is how to output an element of a case-vector that is relative.  */
 
+/* Disable the shift, which is for the currently disabled "switch"
+   opcode.  Se casesi in v850.md.  */
 #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"),                    \
-          (! TARGET_BIG_SWITCH && TARGET_V850E ? "(" : ""),            \
+          (0 && ! TARGET_BIG_SWITCH && TARGET_V850E ? "(" : ""),               \
           VALUE, REL,                                                  \
-          (! TARGET_BIG_SWITCH && TARGET_V850E ? ")>>1" : ""))
+          (0 && ! TARGET_BIG_SWITCH && TARGET_V850E ? ")>>1" : ""))
 
 #define ASM_OUTPUT_ALIGN(FILE, LOG)    \
   if ((LOG) != 0)                      \
@@ -1218,4 +1072,6 @@ extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_K
 #define SYMBOL_REF_TDA_P(X)    ((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_TDA) != 0)
 #define SYMBOL_REF_SDA_P(X)    ((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_SDA) != 0)
 
+#define TARGET_ASM_INIT_SECTIONS v850_asm_init_sections
+
 #endif /* ! GCC_V850_H */