OSDN Git Service

* genrecog.c (pred): Update comparison_operator for the unordered
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.h
index afaa80d..cde39ce 100644 (file)
@@ -100,6 +100,8 @@ extern int target_flags;
 #define MASK_STACK_PROBE       0x00000100      /* Enable stack probing */
 #define MASK_NO_ALIGN_STROPS   0x00001000      /* Enable aligning of string ops. */
 #define MASK_INLINE_ALL_STROPS 0x00002000      /* Inline stringops in all cases */
 #define MASK_STACK_PROBE       0x00000100      /* Enable stack probing */
 #define MASK_NO_ALIGN_STROPS   0x00001000      /* Enable aligning of string ops. */
 #define MASK_INLINE_ALL_STROPS 0x00002000      /* Inline stringops in all cases */
+#define MASK_NO_PUSH_ARGS      0x00004000      /* Use push instructions */
+#define MASK_ACCUMULATE_OUTGOING_ARGS 0x00008000/* Accumulate outgoing args */
 
 /* Temporary codegen switches */
 #define MASK_INTEL_SYNTAX      0x00000200
 
 /* Temporary codegen switches */
 #define MASK_INTEL_SYNTAX      0x00000200
@@ -119,6 +121,13 @@ extern int target_flags;
    faster code on the pentium.  */
 #define TARGET_ALIGN_DOUBLE (target_flags & MASK_ALIGN_DOUBLE)
 
    faster code on the pentium.  */
 #define TARGET_ALIGN_DOUBLE (target_flags & MASK_ALIGN_DOUBLE)
 
+/* Use push instructions to save outgoing args.  */
+#define TARGET_PUSH_ARGS (!(target_flags & MASK_NO_PUSH_ARGS))
+
+/* Accumulate stack adjustments to prologue/epilogue.  */
+#define TARGET_ACCUMULATE_OUTGOING_ARGS \
+ (target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)
+
 /* Put uninitialized locals into bss, not data.
    Meaningful only on svr3.  */
 #define TARGET_SVR3_SHLIB (target_flags & MASK_SVR3_SHLIB)
 /* Put uninitialized locals into bss, not data.
    Meaningful only on svr3.  */
 #define TARGET_SVR3_SHLIB (target_flags & MASK_SVR3_SHLIB)
@@ -254,6 +263,14 @@ extern const int x86_promote_hi_regs;
     "Inline all known string operations" },                                  \
   { "no-inline-all-stringops", -MASK_INLINE_ALL_STROPS,                      \
     "Do not inline all known string operations" },                           \
     "Inline all known string operations" },                                  \
   { "no-inline-all-stringops", -MASK_INLINE_ALL_STROPS,                      \
     "Do not inline all known string operations" },                           \
+  { "push-args",               -MASK_NO_PUSH_ARGS,                           \
+    "Use push instructions to save outgoing arguments" },                    \
+  { "no-push-args",            MASK_NO_PUSH_ARGS,                            \
+    "Do not use push instructions to save outgoing arguments" },             \
+  { "accumulate-outgoing-args",        MASK_ACCUMULATE_OUTGOING_ARGS,                \
+    "Use push instructions to save outgoing arguments" },                    \
+  { "no-accumulate-outgoing-args",-MASK_ACCUMULATE_OUTGOING_ARGS,            \
+    "Do not use push instructions to save outgoing arguments" },             \
   SUBTARGET_SWITCHES                                                         \
   { "", TARGET_DEFAULT, 0 }}
 
   SUBTARGET_SWITCHES                                                         \
   { "", TARGET_DEFAULT, 0 }}
 
@@ -1136,6 +1153,19 @@ enum reg_class
 
 #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & (-2))
 
 
 #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & (-2))
 
+/* If defined, the maximum amount of space required for outgoing arguments will
+   be computed and placed into the variable
+   `current_function_outgoing_args_size'.  No space will be pushed onto the
+   stack for each call; instead, the function prologue should increase the stack
+   frame size by this amount.  */
+
+#define ACCUMULATE_OUTGOING_ARGS TARGET_ACCUMULATE_OUTGOING_ARGS
+
+/* If defined, a C expression whose value is nonzero when we want to use PUSH
+   instructions to pass outgoing arguments.  */
+
+#define PUSH_ARGS (TARGET_PUSH_ARGS && !ACCUMULATE_OUTGOING_ARGS)
+
 /* Offset of first parameter from the argument pointer register value.  */
 #define FIRST_PARM_OFFSET(FNDECL) 0
 
 /* Offset of first parameter from the argument pointer register value.  */
 #define FIRST_PARM_OFFSET(FNDECL) 0
 
@@ -1180,7 +1210,7 @@ enum reg_class
 #define APPLY_RESULT_SIZE (8+108)
 
 /* 1 if N is a possible register number for function argument passing.  */
 #define APPLY_RESULT_SIZE (8+108)
 
 /* 1 if N is a possible register number for function argument passing.  */
-#define FUNCTION_ARG_REGNO_P(N) ((N) >= 0 && (N) < REGPARM_MAX)
+#define FUNCTION_ARG_REGNO_P(N) ((N) < REGPARM_MAX)
 
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
 
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
@@ -1230,6 +1260,11 @@ typedef struct ix86_args {
 
 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0
 
 
 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0
 
+/* If PIC, we cannot optimize sibling calls to global functions
+   because the PLT requires %ebx live.  */
+#define FUNCTION_OK_FOR_SIBCALL(DECL) \
+  (DECL && (! flag_pic || ! TREE_PUBLIC (DECL)))
+
 /* This macro is invoked just before the start of a function.
    It is used here to output code for -fpic that will load the
    return address into %ebx.  */
 /* This macro is invoked just before the start of a function.
    It is used here to output code for -fpic that will load the
    return address into %ebx.  */
@@ -2155,10 +2190,13 @@ while (0)
 
    Add CCNO to indicate No Overflow, which is often also includes
    No Carry.  This is typically used on the output of logicals,
 
    Add CCNO to indicate No Overflow, which is often also includes
    No Carry.  This is typically used on the output of logicals,
-   and is only valid in comparisons against zero.  */
+   and is only valid in comparisons against zero.
+
+   Add CCZ to indicate that only the Zero flag is valid.  */
 
 #define EXTRA_CC_MODES \
        CC(CCNOmode, "CCNO") \
 
 #define EXTRA_CC_MODES \
        CC(CCNOmode, "CCNO") \
+       CC(CCZmode, "CCZ") \
        CC(CCFPmode, "CCFP") \
        CC(CCFPUmode, "CCFPU")
 
        CC(CCFPmode, "CCFP") \
        CC(CCFPUmode, "CCFPU")
 
@@ -2168,7 +2206,7 @@ while (0)
    For floating-point equality comparisons, CCFPEQmode should be used.
    VOIDmode should be used in all other cases.
 
    For floating-point equality comparisons, CCFPEQmode should be used.
    VOIDmode should be used in all other cases.
 
-   For integer comparisons against zero, reduce to CCNOmode if
+   For integer comparisons against zero, reduce to CCNOmode or CCZmode if
    possible, to allow for more combinations.  */
 
 #define SELECT_CC_MODE(OP,X,Y)                         \
    possible, to allow for more combinations.  */
 
 #define SELECT_CC_MODE(OP,X,Y)                         \
@@ -2176,7 +2214,7 @@ while (0)
    ? (OP) == EQ || (OP) == NE ? CCFPUmode : CCFPmode   \
    : (OP) == LE || (OP) == GT ? CCmode                 \
    : (Y) != const0_rtx ? CCmode                                \
    ? (OP) == EQ || (OP) == NE ? CCFPUmode : CCFPmode   \
    : (OP) == LE || (OP) == GT ? CCmode                 \
    : (Y) != const0_rtx ? CCmode                                \
-   : CCNOmode)
+   : (OP) == EQ || (OP) == NE ? CCZmode : CCNOmode)
 \f
 /* Control the assembler format that we output, to the extent
    this does not vary between assemblers.  */
 \f
 /* Control the assembler format that we output, to the extent
    this does not vary between assemblers.  */
@@ -2457,7 +2495,6 @@ do { long l;                                              \
                       LABEL_REF, SUBREG, REG, MEM}},                   \
   {"pic_symbolic_operand", {CONST}},                                   \
   {"call_insn_operand", {MEM}},                                                \
                       LABEL_REF, SUBREG, REG, MEM}},                   \
   {"pic_symbolic_operand", {CONST}},                                   \
   {"call_insn_operand", {MEM}},                                                \
-  {"expander_call_insn_operand", {MEM}},                               \
   {"constant_call_address_operand", {MEM}},                            \
   {"const0_operand", {CONST_INT, CONST_DOUBLE}},                       \
   {"const1_operand", {CONST_INT}},                                     \
   {"constant_call_address_operand", {MEM}},                            \
   {"const0_operand", {CONST_INT, CONST_DOUBLE}},                       \
   {"const1_operand", {CONST_INT}},                                     \
@@ -2471,6 +2508,8 @@ do { long l;                                              \
   {"non_q_regs_operand", {SUBREG, REG}},                               \
   {"no_comparison_operator", {EQ, NE, LT, GE, LTU, GTU, LEU, GEU}},    \
   {"fcmov_comparison_operator", {EQ, NE, LTU, GTU, LEU, GEU}},         \
   {"non_q_regs_operand", {SUBREG, REG}},                               \
   {"no_comparison_operator", {EQ, NE, LT, GE, LTU, GTU, LEU, GEU}},    \
   {"fcmov_comparison_operator", {EQ, NE, LTU, GTU, LEU, GEU}},         \
+  {"uno_comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU,  \
+                              GTU, UNORDERED, ORDERED}},               \
   {"cmp_fp_expander_operand", {CONST_DOUBLE, SUBREG, REG, MEM}},       \
   {"ext_register_operand", {SUBREG, REG}},                             \
   {"binary_fp_operator", {PLUS, MINUS, MULT, DIV}},                    \
   {"cmp_fp_expander_operand", {CONST_DOUBLE, SUBREG, REG, MEM}},       \
   {"ext_register_operand", {SUBREG, REG}},                             \
   {"binary_fp_operator", {PLUS, MINUS, MULT, DIV}},                    \