OSDN Git Service

* genrecog.c (pred): Update comparison_operator for the unordered
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.h
index 2b81e8c..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_NO_PUSH_ARGS      0x00004000      /* Use push instructions */
+#define MASK_ACCUMULATE_OUTGOING_ARGS 0x00008000/* Accumulate outgoing args */
 
 /* 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)
 
+/* 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)
@@ -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" },                           \
+  { "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 }}
 
@@ -1136,6 +1153,19 @@ enum reg_class
 
 #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
 
@@ -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 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
@@ -2160,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,
-   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") \
+       CC(CCZmode, "CCZ") \
        CC(CCFPmode, "CCFP") \
        CC(CCFPUmode, "CCFPU")
 
@@ -2173,7 +2206,7 @@ while (0)
    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)                         \
@@ -2181,7 +2214,7 @@ while (0)
    ? (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.  */
@@ -2475,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}},         \
+  {"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}},                    \