X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Foptabs.h;h=78cf53b15ff117cc150d6fdf8e6190597ef99927;hp=2d332e31794461dabf59009e15c5d97f851d5b6a;hb=1c51e1aa8590b0b770f9466e6d45098ec6376404;hpb=c1e065f3f2d78e85f387fef9d235c466bda6b1bc diff --git a/gcc/optabs.h b/gcc/optabs.h index 2d332e31794..78cf53b15ff 100644 --- a/gcc/optabs.h +++ b/gcc/optabs.h @@ -1,5 +1,5 @@ /* Definitions for code generation pass of GNU compiler. - Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GCC. @@ -15,8 +15,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #ifndef GCC_OPTABS_H #define GCC_OPTABS_H @@ -82,6 +82,8 @@ enum optab_index /* Signed multiply with result one machine mode wider than args */ OTI_smul_widen, OTI_umul_widen, + /* Widening multiply of one unsigned and one signed operand. */ + OTI_usmul_widen, /* Signed divide */ OTI_sdiv, @@ -133,6 +135,8 @@ enum optab_index OTI_mov, /* Move, preserving high part of register. */ OTI_movstrict, + /* Move, with a misaligned memory. */ + OTI_movmisalign, /* Unary operations */ /* Negation */ @@ -169,6 +173,8 @@ enum optab_index OTI_exp2, /* Exponential - 1*/ OTI_expm1, + /* Load exponent of a floating point number */ + OTI_ldexp, /* Radix-independent exponent */ OTI_logb, OTI_ilogb, @@ -182,15 +188,20 @@ enum optab_index OTI_log1p, /* Rounding functions */ OTI_floor, + OTI_lfloor, OTI_ceil, + OTI_lceil, OTI_btrunc, OTI_round, OTI_nearbyint, OTI_rint, + OTI_lrint, /* Tangent */ OTI_tan, /* Inverse tangent */ OTI_atan, + /* Copy sign */ + OTI_copysign, /* Compare insn; two operands. */ OTI_cmp, @@ -222,17 +233,29 @@ enum optab_index /* Conditional add instruction. */ OTI_addcc, + /* Reduction operations on a vector operand. */ + OTI_reduc_smax, + OTI_reduc_umax, + OTI_reduc_smin, + OTI_reduc_umin, + OTI_reduc_splus, + OTI_reduc_uplus, + /* Set specified field of vector operand. */ OTI_vec_set, /* Extract specified field of vector operand. */ OTI_vec_extract, /* Initialize vector operand. */ OTI_vec_init, - /* Extract specified elements from vectors, for vector store. */ - OTI_vec_realign_store, + /* Whole vector shift. The shift amount is in bits. */ + OTI_vec_shl, + OTI_vec_shr, /* Extract specified elements from vectors, for vector load. */ OTI_vec_realign_load, + /* Perform a raise to the power of integer. */ + OTI_powi, + OTI_MAX }; @@ -247,6 +270,7 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define umul_highpart_optab (optab_table[OTI_umul_highpart]) #define smul_widen_optab (optab_table[OTI_smul_widen]) #define umul_widen_optab (optab_table[OTI_umul_widen]) +#define usmul_widen_optab (optab_table[OTI_usmul_widen]) #define sdiv_optab (optab_table[OTI_sdiv]) #define smulv_optab (optab_table[OTI_smulv]) #define sdivv_optab (optab_table[OTI_sdivv]) @@ -275,6 +299,7 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define mov_optab (optab_table[OTI_mov]) #define movstrict_optab (optab_table[OTI_movstrict]) +#define movmisalign_optab (optab_table[OTI_movmisalign]) #define neg_optab (optab_table[OTI_neg]) #define negv_optab (optab_table[OTI_negv]) @@ -296,6 +321,7 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define exp10_optab (optab_table[OTI_exp10]) #define exp2_optab (optab_table[OTI_exp2]) #define expm1_optab (optab_table[OTI_expm1]) +#define ldexp_optab (optab_table[OTI_ldexp]) #define logb_optab (optab_table[OTI_logb]) #define ilogb_optab (optab_table[OTI_ilogb]) #define log_optab (optab_table[OTI_log]) @@ -303,13 +329,17 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define log2_optab (optab_table[OTI_log2]) #define log1p_optab (optab_table[OTI_log1p]) #define floor_optab (optab_table[OTI_floor]) +#define lfloor_optab (optab_table[OTI_lfloor]) #define ceil_optab (optab_table[OTI_ceil]) +#define lceil_optab (optab_table[OTI_lceil]) #define btrunc_optab (optab_table[OTI_btrunc]) #define round_optab (optab_table[OTI_round]) #define nearbyint_optab (optab_table[OTI_nearbyint]) #define rint_optab (optab_table[OTI_rint]) +#define lrint_optab (optab_table[OTI_lrint]) #define tan_optab (optab_table[OTI_tan]) #define atan_optab (optab_table[OTI_atan]) +#define copysign_optab (optab_table[OTI_copysign]) #define cmp_optab (optab_table[OTI_cmp]) #define ucmp_optab (optab_table[OTI_ucmp]) @@ -331,42 +361,52 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define push_optab (optab_table[OTI_push]) #define addcc_optab (optab_table[OTI_addcc]) +#define reduc_smax_optab (optab_table[OTI_reduc_smax]) +#define reduc_umax_optab (optab_table[OTI_reduc_umax]) +#define reduc_smin_optab (optab_table[OTI_reduc_smin]) +#define reduc_umin_optab (optab_table[OTI_reduc_umin]) +#define reduc_splus_optab (optab_table[OTI_reduc_splus]) +#define reduc_uplus_optab (optab_table[OTI_reduc_uplus]) + #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]) -#define vec_realign_store_optab (optab_table[OTI_vec_realign_store]) +#define vec_shl_optab (optab_table[OTI_vec_shl]) +#define vec_shr_optab (optab_table[OTI_vec_shr]) #define vec_realign_load_optab (optab_table[OTI_vec_realign_load]) +#define powi_optab (optab_table[OTI_powi]) + /* Conversion optabs have their own table and indexes. */ enum convert_optab_index { - CTI_sext, - CTI_zext, - CTI_trunc, + COI_sext, + COI_zext, + COI_trunc, - CTI_sfix, - CTI_ufix, + COI_sfix, + COI_ufix, - CTI_sfixtrunc, - CTI_ufixtrunc, + COI_sfixtrunc, + COI_ufixtrunc, - CTI_sfloat, - CTI_ufloat, + COI_sfloat, + COI_ufloat, - CTI_MAX + COI_MAX }; -extern GTY(()) convert_optab convert_optab_table[CTI_MAX]; +extern GTY(()) convert_optab convert_optab_table[COI_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]) +#define sext_optab (convert_optab_table[COI_sext]) +#define zext_optab (convert_optab_table[COI_zext]) +#define trunc_optab (convert_optab_table[COI_trunc]) +#define sfix_optab (convert_optab_table[COI_sfix]) +#define ufix_optab (convert_optab_table[COI_ufix]) +#define sfixtrunc_optab (convert_optab_table[COI_sfixtrunc]) +#define ufixtrunc_optab (convert_optab_table[COI_ufixtrunc]) +#define sfloat_optab (convert_optab_table[COI_sfloat]) +#define ufloat_optab (convert_optab_table[COI_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 @@ -407,24 +447,65 @@ extern enum insn_code vcondu_gen_code[NUM_MACHINE_MODES]; /* This array records the insn_code of insns to perform block moves. */ extern enum insn_code movmem_optab[NUM_MACHINE_MODES]; -/* This array records the insn_code of insns to perform block clears. */ -extern enum insn_code clrmem_optab[NUM_MACHINE_MODES]; +/* This array records the insn_code of insns to perform block sets. */ +extern enum insn_code setmem_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 cmpstrn_optab[NUM_MACHINE_MODES]; extern enum insn_code cmpmem_optab[NUM_MACHINE_MODES]; +/* Synchronization primitives. This first set is atomic operation for + which we don't care about the resulting value. */ +extern enum insn_code sync_add_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_sub_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_ior_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_and_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_xor_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_nand_optab[NUM_MACHINE_MODES]; + +/* This second set is atomic operations in which we return the value + that existed in memory before the operation. */ +extern enum insn_code sync_old_add_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_old_sub_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_old_ior_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_old_and_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_old_xor_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_old_nand_optab[NUM_MACHINE_MODES]; + +/* This third set is atomic operations in which we return the value + that resulted after performing the operation. */ +extern enum insn_code sync_new_add_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_new_sub_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_new_ior_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_new_and_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_new_xor_optab[NUM_MACHINE_MODES]; +extern enum insn_code sync_new_nand_optab[NUM_MACHINE_MODES]; + +/* Atomic compare and swap. */ +extern enum insn_code sync_compare_and_swap[NUM_MACHINE_MODES]; +extern enum insn_code sync_compare_and_swap_cc[NUM_MACHINE_MODES]; + +/* Atomic exchange with acquire semantics. */ +extern enum insn_code sync_lock_test_and_set[NUM_MACHINE_MODES]; + +/* Atomic clear with release semantics. */ +extern enum insn_code sync_lock_release[NUM_MACHINE_MODES]; + /* Define functions given in optabs.c. */ -extern rtx expand_ternary_op (enum machine_mode mode, optab ternary_optab, - rtx op0, rtx op1, rtx op2, rtx target, +extern rtx expand_ternary_op (enum machine_mode mode, optab ternary_optab, + rtx op0, rtx op1, rtx op2, rtx target, int unsignedp); /* Expand a binary operation given optab and rtx operands. */ extern rtx expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int, enum optab_methods); +extern bool force_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 (enum machine_mode, optab, optab, rtx, rtx, rtx, int, enum optab_methods); @@ -447,6 +528,9 @@ extern rtx expand_unop (enum machine_mode, optab, rtx, rtx, 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 copysign operation. */ +extern rtx expand_copysign (rtx, rtx, rtx); + /* Generate an instruction with a given INSN_CODE with an output and an input. */ extern void emit_unop_insn (int, rtx, rtx, enum rtx_code); @@ -477,9 +561,6 @@ extern optab optab_for_tree_code (enum tree_code, tree); extern int can_compare_p (enum rtx_code, enum machine_mode, enum can_compare_purpose); -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 (enum machine_mode, enum machine_mode, int); @@ -488,11 +569,6 @@ extern enum insn_code can_extend_p (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 (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, @@ -510,4 +586,7 @@ bool expand_vec_cond_expr_p (tree, enum machine_mode); /* Generate code for VEC_COND_EXPR. */ extern rtx expand_vec_cond_expr (tree, rtx); +/* Generate code for VEC_LSHIFT_EXPR and VEC_RSHIFT_EXPR. */ +extern rtx expand_vec_shift_expr (tree, rtx); + #endif /* GCC_OPTABS_H */