OSDN Git Service

* config/i386/bmmintrin.h: Replace by #error.
[pf3gnuchains/gcc-fork.git] / gcc / config / v850 / v850.h
index 08c85fd..026a229 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
@@ -179,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.
@@ -319,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 \
@@ -387,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
@@ -502,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
@@ -540,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
@@ -558,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                                                                 \
@@ -626,7 +614,7 @@ 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.  */
 
@@ -797,13 +785,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                          \
@@ -815,17 +804,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.  */
 
@@ -857,7 +844,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.  */
@@ -872,101 +859,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"
@@ -1073,12 +970,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)                      \
@@ -1226,4 +1125,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 */