OSDN Git Service

2003-09-19 Joel Sherrill <joel@oarcorp.com>
[pf3gnuchains/gcc-fork.git] / gcc / optabs.h
index b802f4d..27044ab 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions for code generation pass of GNU compiler.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -38,14 +38,15 @@ Boston, MA 02111-1307, USA.  */
    A few optabs, such as move_optab and cmp_optab, are used
    by special code.  */
 
-typedef struct optab
+struct optab GTY(())
 {
   enum rtx_code code;
-  struct {
+  struct optab_handlers {
     enum insn_code insn_code;
     rtx libfunc;
   } handlers [NUM_MACHINE_MODES];
-} * optab;
+};
+typedef struct optab * optab;
 
 /* Given an enum insn_code, access the function to construct
    the body of that kind of insn.  */
@@ -92,7 +93,7 @@ enum optab_index
   /* Arithmetic shift left */
   OTI_ashl,
   /* Logical shift right */
-  OTI_lshr,  
+  OTI_lshr,
   /* Arithmetic shift right */
   OTI_ashr,
   /* Rotate left */
@@ -107,6 +108,10 @@ enum optab_index
   OTI_umin,
   /* Unsigned maximum value */
   OTI_umax,
+  /* Power */
+  OTI_pow,
+  /* Arc tangent of y/x */
+  OTI_atan2,
 
   /* Move instruction.  */
   OTI_mov,
@@ -122,14 +127,32 @@ enum optab_index
   OTI_absv,
   /* Bitwise not */
   OTI_one_cmpl,
-  /* Find first bit set */
+  /* Bit scanning and counting */
   OTI_ffs,
+  OTI_clz,
+  OTI_ctz,
+  OTI_popcount,
+  OTI_parity,
   /* Square root */
   OTI_sqrt,
   /* Sine */
   OTI_sin,
   /* Cosine */
   OTI_cos,
+  /* Exponential */
+  OTI_exp,
+  /* Natural Logarithm */
+  OTI_log,
+  /* Rounding functions */
+  OTI_floor,
+  OTI_ceil,
+  OTI_trunc,
+  OTI_round,
+  OTI_nearbyint,
+  /* Tangent */
+  OTI_tan,
+  /* Inverse tangent */
+  OTI_atan,
 
   /* Compare insn; two operands.  */
   OTI_cmp,
@@ -145,14 +168,17 @@ enum optab_index
   OTI_cbranch,
   OTI_cmov,
   OTI_cstore,
-    
+
   /* Push instruction.  */
   OTI_push,
 
+  /* Conditional add instruction.  */
+  OTI_addcc,
+
   OTI_MAX
 };
 
-extern optab optab_table[OTI_MAX];
+extern GTY(()) optab optab_table[OTI_MAX];
 
 #define add_optab (optab_table[OTI_add])
 #define sub_optab (optab_table[OTI_sub])
@@ -184,6 +210,8 @@ extern optab optab_table[OTI_MAX];
 #define smax_optab (optab_table[OTI_smax])
 #define umin_optab (optab_table[OTI_umin])
 #define umax_optab (optab_table[OTI_umax])
+#define pow_optab (optab_table[OTI_pow])
+#define atan2_optab (optab_table[OTI_atan2])
 
 #define mov_optab (optab_table[OTI_mov])
 #define movstrict_optab (optab_table[OTI_movstrict])
@@ -194,9 +222,22 @@ extern optab optab_table[OTI_MAX];
 #define absv_optab (optab_table[OTI_absv])
 #define one_cmpl_optab (optab_table[OTI_one_cmpl])
 #define ffs_optab (optab_table[OTI_ffs])
+#define clz_optab (optab_table[OTI_clz])
+#define ctz_optab (optab_table[OTI_ctz])
+#define popcount_optab (optab_table[OTI_popcount])
+#define parity_optab (optab_table[OTI_parity])
 #define sqrt_optab (optab_table[OTI_sqrt])
 #define sin_optab (optab_table[OTI_sin])
 #define cos_optab (optab_table[OTI_cos])
+#define exp_optab (optab_table[OTI_exp])
+#define log_optab (optab_table[OTI_log])
+#define floor_optab (optab_table[OTI_floor])
+#define ceil_optab (optab_table[OTI_ceil])
+#define trunc_optab (optab_table[OTI_trunc])
+#define round_optab (optab_table[OTI_round])
+#define nearbyint_optab (optab_table[OTI_nearbyint])
+#define tan_optab (optab_table[OTI_tan])
+#define atan_optab (optab_table[OTI_atan])
 
 #define cmp_optab (optab_table[OTI_cmp])
 #define ucmp_optab (optab_table[OTI_ucmp])
@@ -208,11 +249,12 @@ extern optab optab_table[OTI_MAX];
 #define cmov_optab (optab_table[OTI_cmov])
 #define cstore_optab (optab_table[OTI_cstore])
 #define push_optab (optab_table[OTI_push])
+#define addcc_optab (optab_table[OTI_addcc])
 
 /* Tables of patterns for extending one integer mode to another.  */
 extern enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2];
 
-/* Tables of patterns for converting between fixed and floating point. */
+/* Tables of patterns for converting between fixed and floating point.  */
 extern enum insn_code fixtab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
 extern enum insn_code fixtrunctab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
 extern enum insn_code floattab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
@@ -224,10 +266,10 @@ extern enum insn_code reload_in_optab[NUM_MACHINE_MODES];
 extern enum insn_code reload_out_optab[NUM_MACHINE_MODES];
 
 /* Contains the optab used for each rtx code.  */
-extern optab code_to_optab[NUM_RTX_CODE + 1];
+extern GTY(()) optab code_to_optab[NUM_RTX_CODE + 1];
 
 \f
-typedef rtx (*rtxfun) PARAMS ((rtx));
+typedef rtx (*rtxfun) (rtx);
 
 /* Indexed by the rtx-code for a conditional (eg. EQ, LT,...)
    gives the gen_function to make a branch to test that condition.  */
@@ -256,42 +298,43 @@ extern enum insn_code clrstr_optab[NUM_MACHINE_MODES];
 /* Define functions given in optabs.c.  */
 
 /* Expand a binary operation given optab and rtx operands.  */
-extern rtx expand_binop PARAMS ((enum machine_mode, optab, rtx, rtx, rtx,
-                                int, enum optab_methods));
+extern rtx expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int,
+                        enum optab_methods);
 
 /* Expand a binary operation with both signed and unsigned forms.  */
-extern rtx sign_expand_binop PARAMS ((enum machine_mode, optab, optab, rtx,
-                                     rtx, rtx, int, enum optab_methods));
+extern rtx sign_expand_binop (enum machine_mode, optab, optab, rtx, rtx,
+                             rtx, int, enum optab_methods);
 
 /* Generate code to perform an operation on two operands with two results.  */
-extern int expand_twoval_binop PARAMS ((optab, rtx, rtx, rtx, rtx, int));
+extern int expand_twoval_binop (optab, rtx, rtx, rtx, rtx, int);
 
 /* Expand a unary arithmetic operation given optab rtx operand.  */
-extern rtx expand_unop PARAMS ((enum machine_mode, optab, rtx, rtx, int));
+extern rtx expand_unop (enum machine_mode, optab, rtx, rtx, int);
 
 /* Expand the absolute value operation.  */
-extern rtx expand_abs PARAMS ((enum machine_mode, rtx, rtx, int, int));
+extern rtx expand_abs_nojump (enum machine_mode, rtx, rtx, int);
+extern rtx expand_abs (enum machine_mode, rtx, rtx, int, int);
 
 /* Expand the complex absolute value operation.  */
-extern rtx expand_complex_abs PARAMS ((enum machine_mode, rtx, rtx, int));
+extern rtx expand_complex_abs (enum machine_mode, rtx, rtx, int);
 
 /* Generate an instruction with a given INSN_CODE with an output and
    an input.  */
-extern void emit_unop_insn PARAMS ((int, rtx, rtx, enum rtx_code));
+extern void emit_unop_insn (int, rtx, rtx, enum rtx_code);
 
 /* Emit code to perform a series of operations on a multi-word quantity, one
    word at a time.  */
-extern rtx emit_no_conflict_block PARAMS ((rtx, rtx, rtx, rtx, rtx));
+extern rtx emit_no_conflict_block (rtx, rtx, rtx, rtx, rtx);
 
 /* Emit one rtl instruction to store zero in specified rtx.  */
-extern void emit_clr_insn PARAMS ((rtx));
+extern void emit_clr_insn (rtx);
 
 /* Emit one rtl insn to store 1 in specified rtx assuming it contains 0.  */
-extern void emit_0_to_1_insn PARAMS ((rtx));
+extern void emit_0_to_1_insn (rtx);
 
 /* Emit one rtl insn to compare two rtx's.  */
-extern void emit_cmp_insn PARAMS ((rtx, rtx, enum rtx_code, rtx,
-                                  enum machine_mode, int, unsigned int));
+extern void emit_cmp_insn (rtx, rtx, enum rtx_code, rtx, enum machine_mode,
+                          int);
 
 /* The various uses that a comparison can have; used by can_compare_p:
    jumps, conditional moves, store flag operations.  */
@@ -304,34 +347,29 @@ enum can_compare_purpose
 
 /* Nonzero if a compare of mode MODE can be done straightforwardly
    (without splitting it into pieces).  */
-extern int can_compare_p PARAMS ((enum rtx_code, enum machine_mode,
-                                 enum can_compare_purpose));
-
-extern void prepare_cmp_insn PARAMS ((rtx *, rtx *, enum rtx_code *, rtx,
-                                     enum machine_mode *, int *, int,
-                                     enum can_compare_purpose));
+extern int can_compare_p (enum rtx_code, enum machine_mode,
+                         enum can_compare_purpose);
 
-extern rtx prepare_operand PARAMS ((int, rtx, int, enum machine_mode,
-                                   enum machine_mode, int));
+extern rtx prepare_operand (int, rtx, int, enum machine_mode,
+                           enum machine_mode, int);
 
 /* Return the INSN_CODE to use for an extend operation.  */
-extern enum insn_code can_extend_p PARAMS ((enum machine_mode,
-                                           enum machine_mode, int));
+extern enum insn_code can_extend_p (enum machine_mode, enum machine_mode, int);
 
 /* Generate the body of an insn to extend Y (with mode MFROM)
    into X (with mode MTO).  Do zero-extension if UNSIGNEDP is nonzero.  */
-extern rtx gen_extend_insn PARAMS ((rtx, rtx, enum machine_mode,
-                                   enum machine_mode, int));
+extern rtx gen_extend_insn (rtx, rtx, enum machine_mode,
+                           enum machine_mode, int);
 
 /* Initialize the tables that control conversion between fixed and
    floating values.  */
-extern void init_fixtab PARAMS ((void));
-extern void init_floattab PARAMS ((void));
+extern void init_fixtab (void);
+extern void init_floattab (void);
 
 /* Generate code for a FLOAT_EXPR.  */
-extern void expand_float PARAMS ((rtx, rtx, int));
+extern void expand_float (rtx, rtx, int);
 
 /* Generate code for a FIX_EXPR.  */
-extern void expand_fix PARAMS ((rtx, rtx, int));
+extern void expand_fix (rtx, rtx, int);
 
 #endif /* GCC_OPTABS_H */