OSDN Git Service

Define SMALL_REGISTER_CLASSES with a value
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.h
index 9ce6f26..241650f 100644 (file)
@@ -95,6 +95,7 @@ extern int target_flags;
 #define MASK_NO_PSEUDO         000010000000    /* Move op's args -> pseudos */
 #define MASK_DEBUG_ARG         000020000000    /* Debug function_arg */   
 #define MASK_SCHEDULE_PROLOGUE  000040000000    /* Emit prologue as rtl */
+#define MASK_STACK_PROBE       000100000000    /* Enable stack probing */
 
 /* Use the floating point instructions */
 #define TARGET_80387 (target_flags & MASK_80387)
@@ -163,8 +164,9 @@ extern int target_flags;
 #define TARGET_USE_Q_REG (ix86_cpu == PROCESSOR_PENTIUM \
                          || ix86_cpu == PROCESSOR_PENTIUMPRO)
 #define TARGET_USE_ANY_REG (ix86_cpu == PROCESSOR_I486)
-#define TARGET_CMOVE (ix86_isa == PROCESSOR_PENTIUMPRO)
+#define TARGET_CMOVE (ix86_arch == PROCESSOR_PENTIUMPRO)
 #define TARGET_DEEP_BRANCH_PREDICTION (ix86_cpu == PROCESSOR_PENTIUMPRO)
+#define TARGET_STACK_PROBE (target_flags & MASK_STACK_PROBE)
 
 #define TARGET_SWITCHES                                                        \
 { { "80387",                    MASK_80387 },                          \
@@ -202,6 +204,8 @@ extern int target_flags;
   { "no-move",                  MASK_NO_MOVE },                        \
   { "debug-arg",                MASK_DEBUG_ARG },                      \
   { "no-debug-arg",            -MASK_DEBUG_ARG },                      \
+  { "stack-arg-probe",          MASK_STACK_PROBE },                    \
+  { "no-stack-arg-probe",      -MASK_STACK_PROBE },                    \
   SUBTARGET_SWITCHES                                                   \
   { "", MASK_SCHEDULE_PROLOGUE | TARGET_DEFAULT}}
 
@@ -223,11 +227,7 @@ enum processor_type
 
 extern enum processor_type ix86_cpu;
 
-extern int ix86_isa;
-
-/* Define generic processor types based upon current deployment.  */
-#define PROCESSOR_COMMON  PROCESSOR_I386
-#define PROCESSOR_COMMON_STRING PROCESSOR_I386_STRING
+extern int ix86_arch;
 
 /* Define the default processor.  This is overridden by other tm.h files.  */
 #define PROCESSOR_DEFAULT \
@@ -258,7 +258,7 @@ extern int ix86_isa;
    by appending `-m' to the specified name.  */
 #define TARGET_OPTIONS                                                 \
 { { "cpu=",            &ix86_cpu_string},                              \
-  { "arch=",           &ix86_isa_string},                              \
+  { "arch=",           &ix86_arch_string},                             \
   { "reg-alloc=",      &i386_reg_alloc_order },                        \
   { "regparm=",                &i386_regparm_string },                         \
   { "align-loops=",    &i386_align_loops_string },                     \
@@ -301,6 +301,32 @@ extern int ix86_isa;
 %{mpentiumpro:-mcpu=pentiumpro}}"
 #endif
 \f
+#ifndef CPP_CPU_SPEC
+#define CPP_CPU_SPEC "\
+-Di386 -Asystem(unix) -Acpu(i386) -Amachine(i386) \
+%{mcpu=i486:-Di486} %{m486:-Di486} \
+%{mpentium:-Dpentium -Di586} %{mcpu=pentium:-Dpentium -Di586} \
+%{mpentiumpro:-Dpentiumpro -Di686} %{mcpu=pentiumpro:-Dpentiumpro -Di686}"
+#endif
+
+/* This macro defines names of additional specifications to put in the specs
+   that can be used in various specifications like CC1_SPEC.  Its definition
+   is an initializer with a subgrouping for each command option.
+
+   Each subgrouping contains a string constant, that defines the
+   specification name, and a string constant that used by the GNU CC driver
+   program.
+
+   Do not define this macro if it does not need to do anything.  */
+
+#ifndef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS
+#endif
+
+#define EXTRA_SPECS                                                    \
+  { "cpp_cpu", CPP_CPU_SPEC },                                         \
+  SUBTARGET_EXTRA_SPECS
+\f
 /* target machine storage layout */
 
 /* Define for XFmode extended real floating point support.
@@ -520,7 +546,7 @@ extern int ix86_isa;
    : FP_REGNO_P (REGNO)                                                \
    ? (((int) GET_MODE_CLASS (MODE) == (int) MODE_FLOAT         \
        || (int) GET_MODE_CLASS (MODE) == (int) MODE_COMPLEX_FLOAT)     \
-      && GET_MODE_UNIT_SIZE (MODE) <= 12)                      \
+      && GET_MODE_UNIT_SIZE (MODE) <= (LONG_DOUBLE_TYPE_SIZE == 96 ? 12 : 8))\
    : (int) (MODE) != (int) QImode ? 1                          \
    : (reload_in_progress | reload_completed) == 1)
 
@@ -680,7 +706,7 @@ enum reg_class
    rtl to be used as spill registers but prevents the compiler from
    extending the lifetime of these registers. */
 
-#define SMALL_REGISTER_CLASSES
+#define SMALL_REGISTER_CLASSES 1
 
 #define QI_REG_P(X) \
   (REG_P (X) && REGNO (X) < 4)
@@ -1844,10 +1870,12 @@ while (0)
        HOST_WIDE_INT value = INTVAL (XEXP (X, 1));                     \
                                                                        \
        if (value == 1)                                                 \
-         return COSTS_N_INSNS (ix86_cost->add) + rtx_cost(XEXP (X, 0));\
+         return COSTS_N_INSNS (ix86_cost->add)                         \
+                               + rtx_cost(XEXP (X, 0), OUTER_CODE);    \
                                                                        \
        if (value == 2 || value == 3)                                   \
-         return COSTS_N_INSNS (ix86_cost->lea) + rtx_cost(XEXP (X, 0));\
+         return COSTS_N_INSNS (ix86_cost->lea)                         \
+                                + rtx_cost(XEXP (X, 0), OUTER_CODE);   \
       }                                                                        \
     /* fall through */                                                 \
                                                                        \
@@ -1865,12 +1893,12 @@ while (0)
        return ((GET_CODE (XEXP (X, 1)) == AND                          \
                 ? COSTS_N_INSNS(ix86_cost->shift_var * 2)              \
                 : COSTS_N_INSNS(ix86_cost->shift_var * 6 + 2))         \
-               + rtx_cost(XEXP (X, 0)));                               \
+               + rtx_cost(XEXP (X, 0), OUTER_CODE));                   \
       }                                                                        \
     return COSTS_N_INSNS (GET_CODE (XEXP (X, 1)) == CONST_INT          \
                          ? ix86_cost->shift_const                      \
                          : ix86_cost->shift_var)                       \
-      + rtx_cost(XEXP (X, 0));                                         \
+      + rtx_cost(XEXP (X, 0), OUTER_CODE);                             \
                                                                        \
   case MULT:                                                           \
     if (GET_CODE (XEXP (X, 1)) == CONST_INT)                           \
@@ -1879,10 +1907,11 @@ while (0)
        int nbits = 0;                                                  \
                                                                        \
        if (value == 2)                                                 \
-         return COSTS_N_INSNS (ix86_cost->add) + rtx_cost(XEXP (X, 0));\
-                                                                       \
+         return COSTS_N_INSNS (ix86_cost->add)                         \
+                                + rtx_cost(XEXP (X, 0), OUTER_CODE);   \
        if (value == 4 || value == 8)                                   \
-         return COSTS_N_INSNS (ix86_cost->lea) + rtx_cost(XEXP (X, 0));\
+         return COSTS_N_INSNS (ix86_cost->lea)                         \
+                                + rtx_cost(XEXP (X, 0), OUTER_CODE);   \
                                                                        \
        while (value != 0)                                              \
          {                                                             \
@@ -1892,11 +1921,11 @@ while (0)
                                                                        \
        if (nbits == 1)                                                 \
          return COSTS_N_INSNS (ix86_cost->shift_const)                 \
-           + rtx_cost(XEXP (X, 0));                                    \
+           + rtx_cost(XEXP (X, 0), OUTER_CODE);                        \
                                                                        \
        return COSTS_N_INSNS (ix86_cost->mult_init                      \
                              + nbits * ix86_cost->mult_bit)            \
-         + rtx_cost(XEXP (X, 0));                                      \
+         + rtx_cost(XEXP (X, 0), OUTER_CODE);                          \
       }                                                                        \
                                                                        \
     else                       /* This is arbitrary */                 \
@@ -1922,8 +1951,10 @@ while (0)
   case MINUS:                                                          \
     if (GET_MODE (X) == DImode)                                                \
       return COSTS_N_INSNS (ix86_cost->add) * 2                                \
-       + (rtx_cost (XEXP (X, 0)) << (GET_MODE (XEXP (X, 0)) != DImode))\
-       + (rtx_cost (XEXP (X, 1)) << (GET_MODE (XEXP (X, 1)) != DImode));\
+       + (rtx_cost (XEXP (X, 0), OUTER_CODE)                           \
+          << (GET_MODE (XEXP (X, 0)) != DImode))                       \
+       + (rtx_cost (XEXP (X, 1), OUTER_CODE)                           \
+          << (GET_MODE (XEXP (X, 1)) != DImode));                      \
   case NEG:                                                            \
   case NOT:                                                            \
     if (GET_MODE (X) == DImode)                                                \
@@ -2202,7 +2233,7 @@ extern struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)();
 /* Here we define machine-dependent flags and fields in cc_status
    (see `conditions.h').  */
 
-/* Set if the cc value is was actually from the 80387 and
+/* Set if the cc value was actually from the 80387 and
    we are testing eax directly (i.e. no sahf) */
 #define CC_TEST_AX 020000
 
@@ -2214,6 +2245,10 @@ extern struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)();
    the state of equality is indicated by zero in the carry bit.  */
 #define CC_Z_IN_NOT_C 010000
 
+/* Set if the CC value was actually from the 80387 and loaded directly
+   into the eflags instead of via eax/sahf.  */
+#define CC_FCOMI 040000
+
 /* Store in cc_status the expressions
    that the condition codes will describe
    after execution of an instruction whose pattern is EXP.
@@ -2628,7 +2663,7 @@ extern void rewrite_address ();
 
 /* Variables in i386.c */
 extern char *ix86_cpu_string;                  /* for -mcpu=<xxx> */
-extern char *ix86_isa_string;                  /* for -mcpu=<xxx> */
+extern char *ix86_arch_string;                 /* for -march=<xxx> */
 extern char *i386_reg_alloc_order;             /* register allocation order */
 extern char *i386_regparm_string;              /* # registers to use to pass args */
 extern char *i386_align_loops_string;          /* power of two alignment for loops */