diff options
Diffstat (limited to 'contrib/gcc/optabs.h')
-rw-r--r-- | contrib/gcc/optabs.h | 195 |
1 files changed, 152 insertions, 43 deletions
diff --git a/contrib/gcc/optabs.h b/contrib/gcc/optabs.h index fd80d82..4f39e35 100644 --- a/contrib/gcc/optabs.h +++ b/contrib/gcc/optabs.h @@ -1,5 +1,5 @@ /* Definitions for code generation pass of GNU compiler. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GCC. @@ -38,19 +38,32 @@ Boston, MA 02111-1307, USA. */ A few optabs, such as move_optab and cmp_optab, are used by special code. */ +struct optab_handlers GTY(()) +{ + enum insn_code insn_code; + rtx libfunc; +}; + struct optab GTY(()) { enum rtx_code code; - struct optab_handlers { - enum insn_code insn_code; - rtx libfunc; - } handlers [NUM_MACHINE_MODES]; + struct optab_handlers handlers[NUM_MACHINE_MODES]; }; typedef struct optab * optab; +/* A convert_optab is for some sort of conversion operation between + modes. The first array index is the destination mode, the second + is the source mode. */ +struct convert_optab GTY(()) +{ + enum rtx_code code; + struct optab_handlers handlers[NUM_MACHINE_MODES][NUM_MACHINE_MODES]; +}; +typedef struct convert_optab *convert_optab; + /* Given an enum insn_code, access the function to construct the body of that kind of insn. */ -#define GEN_FCN(CODE) (*insn_data[(int) (CODE)].genfun) +#define GEN_FCN(CODE) (insn_data[CODE].genfun) /* Enumeration of valid indexes into optab_table. */ enum optab_index @@ -93,7 +106,7 @@ enum optab_index /* Arithmetic shift left */ OTI_ashl, /* Logical shift right */ - OTI_lshr, + OTI_lshr, /* Arithmetic shift right */ OTI_ashr, /* Rotate left */ @@ -108,6 +121,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, @@ -123,8 +140,12 @@ 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 */ @@ -135,6 +156,16 @@ enum optab_index 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, @@ -143,6 +174,15 @@ enum optab_index /* tst insn; compare one operand against 0 */ OTI_tst, + /* Floating point comparison optabs - used primarily for libfuncs */ + OTI_eq, + OTI_ne, + OTI_gt, + OTI_ge, + OTI_lt, + OTI_le, + OTI_unord, + /* String length */ OTI_strlen, @@ -150,10 +190,20 @@ enum optab_index OTI_cbranch, OTI_cmov, OTI_cstore, - + /* Push instruction. */ OTI_push, + /* Conditional add instruction. */ + OTI_addcc, + + /* Set specified field of vector operand. */ + OTI_vec_set, + /* Extract specified field of vector operand. */ + OTI_vec_extract, + /* Initialize vector operand. */ + OTI_vec_init, + OTI_MAX }; @@ -189,6 +239,8 @@ extern GTY(()) 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]) @@ -199,30 +251,77 @@ extern GTY(()) 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 btrunc_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]) #define tst_optab (optab_table[OTI_tst]) +#define eq_optab (optab_table[OTI_eq]) +#define ne_optab (optab_table[OTI_ne]) +#define gt_optab (optab_table[OTI_gt]) +#define ge_optab (optab_table[OTI_ge]) +#define lt_optab (optab_table[OTI_lt]) +#define le_optab (optab_table[OTI_le]) +#define unord_optab (optab_table[OTI_unord]) + #define strlen_optab (optab_table[OTI_strlen]) #define cbranch_optab (optab_table[OTI_cbranch]) #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]) + +#define vec_set_optab (optab_table[OTI_vec_set]) +#define vec_extract_optab (optab_table[OTI_vec_extract]) +#define vec_init_optab (optab_table[OTI_vec_init]) + +/* Conversion optabs have their own table and indexes. */ +enum convert_optab_index +{ + CTI_sext, + CTI_zext, + CTI_trunc, + + CTI_sfix, + CTI_ufix, -/* Tables of patterns for extending one integer mode to another. */ -extern enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2]; + CTI_sfixtrunc, + CTI_ufixtrunc, -/* 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]; + CTI_sfloat, + CTI_ufloat, + + CTI_MAX +}; + +extern GTY(()) convert_optab convert_optab_table[CTI_MAX]; + +#define sext_optab (convert_optab_table[CTI_sext]) +#define zext_optab (convert_optab_table[CTI_zext]) +#define trunc_optab (convert_optab_table[CTI_trunc]) +#define sfix_optab (convert_optab_table[CTI_sfix]) +#define ufix_optab (convert_optab_table[CTI_ufix]) +#define sfixtrunc_optab (convert_optab_table[CTI_sfixtrunc]) +#define ufixtrunc_optab (convert_optab_table[CTI_ufixtrunc]) +#define sfloat_optab (convert_optab_table[CTI_sfloat]) +#define ufloat_optab (convert_optab_table[CTI_ufloat]) /* These arrays record the insn_code of insns that may be needed to perform input and output reloads of special objects. They provide a @@ -231,10 +330,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]; -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. */ @@ -260,45 +359,51 @@ extern enum insn_code movstr_optab[NUM_MACHINE_MODES]; /* This array records the insn_code of insns to perform block clears. */ extern enum insn_code clrstr_optab[NUM_MACHINE_MODES]; +/* These arrays record the insn_code of two different kinds of insns + to perform block compares. */ +extern enum insn_code cmpstr_optab[NUM_MACHINE_MODES]; +extern enum insn_code cmpmem_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)); +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. */ @@ -311,30 +416,34 @@ 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 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); + +/* Call this to reset the function entry for one optab. */ +extern void set_optab_libfunc (optab, enum machine_mode, const char *); +extern void set_conv_libfunc (convert_optab, enum machine_mode, + enum machine_mode, const char *); /* 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 */ |