X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Foptabs.h;h=1426e570fb9659c1e99839b33d630dd3601e07d2;hb=66c6bae7a65cc3aec9e520b1f2e9a98ede5798df;hp=a85ce3035cb38b964bd8691fcee87a460f1a19fb;hpb=b8d2bcdd743853cfef58c1c0d7ee7f518c098416;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/optabs.h b/gcc/optabs.h index a85ce3035cb..1426e570fb9 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 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GCC. @@ -93,6 +93,9 @@ enum optab_index /* Signed remainder */ OTI_smod, OTI_umod, + /* Floating point remainder functions */ + OTI_fmod, + OTI_drem, /* Convert float to integer in float fmt */ OTI_ftrunc, @@ -130,6 +133,8 @@ enum optab_index OTI_mov, /* Move, preserving high part of register. */ OTI_movstrict, + /* Move, with a misaligned memory. */ + OTI_movmisalign, /* Unary operations */ /* Negation */ @@ -148,24 +153,53 @@ enum optab_index OTI_parity, /* Square root */ OTI_sqrt, + /* Sine-Cosine */ + OTI_sincos, /* Sine */ OTI_sin, + /* Inverse sine */ + OTI_asin, /* Cosine */ OTI_cos, + /* Inverse cosine */ + OTI_acos, /* Exponential */ OTI_exp, + /* Base-10 Exponential */ + OTI_exp10, + /* Base-2 Exponential */ + OTI_exp2, + /* Exponential - 1*/ + OTI_expm1, + /* Load exponent of a floating point number */ + OTI_ldexp, + /* Radix-independent exponent */ + OTI_logb, + OTI_ilogb, /* Natural Logarithm */ OTI_log, + /* Base-10 Logarithm */ + OTI_log10, + /* Base-2 Logarithm */ + OTI_log2, + /* logarithm of 1 plus argument */ + OTI_log1p, /* Rounding functions */ OTI_floor, + OTI_lfloor, OTI_ceil, - OTI_trunc, + 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, @@ -203,6 +237,11 @@ enum optab_index OTI_vec_extract, /* Initialize vector operand. */ OTI_vec_init, + /* Extract specified elements from vectors, for vector load. */ + OTI_vec_realign_load, + + /* Perform a raise to the power of integer. */ + OTI_powi, OTI_MAX }; @@ -226,6 +265,8 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define udivmod_optab (optab_table[OTI_udivmod]) #define smod_optab (optab_table[OTI_smod]) #define umod_optab (optab_table[OTI_umod]) +#define fmod_optab (optab_table[OTI_fmod]) +#define drem_optab (optab_table[OTI_drem]) #define ftrunc_optab (optab_table[OTI_ftrunc]) #define and_optab (optab_table[OTI_and]) #define ior_optab (optab_table[OTI_ior]) @@ -244,6 +285,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]) @@ -256,17 +298,34 @@ extern GTY(()) optab optab_table[OTI_MAX]; #define popcount_optab (optab_table[OTI_popcount]) #define parity_optab (optab_table[OTI_parity]) #define sqrt_optab (optab_table[OTI_sqrt]) +#define sincos_optab (optab_table[OTI_sincos]) #define sin_optab (optab_table[OTI_sin]) +#define asin_optab (optab_table[OTI_asin]) #define cos_optab (optab_table[OTI_cos]) +#define acos_optab (optab_table[OTI_acos]) #define exp_optab (optab_table[OTI_exp]) +#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]) +#define log10_optab (optab_table[OTI_log10]) +#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 btrunc_optab (optab_table[OTI_trunc]) +#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]) @@ -291,6 +350,9 @@ extern GTY(()) optab optab_table[OTI_MAX]; #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_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 @@ -335,12 +397,12 @@ extern GTY(()) optab code_to_optab[NUM_RTX_CODE + 1]; typedef rtx (*rtxfun) (rtx); -/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...) +/* Indexed by the rtx-code for a conditional (e.g. EQ, LT,...) gives the gen_function to make a branch to test that condition. */ extern rtxfun bcc_gen_fctn[NUM_RTX_CODE]; -/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...) +/* Indexed by the rtx-code for a conditional (e.g. EQ, LT,...) gives the insn code to make a store-condition insn to test that condition. */ @@ -353,30 +415,88 @@ extern enum insn_code setcc_gen_code[NUM_RTX_CODE]; extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES]; #endif +/* Indexed by the machine mode, gives the insn code for vector conditional + operation. */ + +extern enum insn_code vcond_gen_code[NUM_MACHINE_MODES]; +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 movstr_optab[NUM_MACHINE_MODES]; +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 clrstr_optab[NUM_MACHINE_MODES]; +extern enum insn_code clrmem_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]; +/* 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, + 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); +/* Generate code to perform an operation on one operand with two results. */ +extern int expand_twoval_unop (optab, rtx, rtx, rtx, int); + /* Generate code to perform an operation on two operands with two results. */ extern int expand_twoval_binop (optab, rtx, rtx, rtx, rtx, int); +/* Generate code to perform an operation on two operands with two + results, using a library function. */ +extern bool expand_twoval_binop_libfunc (optab, rtx, rtx, rtx, rtx, + enum rtx_code); + /* Expand a unary arithmetic operation given optab rtx operand. */ extern rtx expand_unop (enum machine_mode, optab, rtx, rtx, int); @@ -384,8 +504,8 @@ 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 complex absolute value operation. */ -extern rtx expand_complex_abs (enum machine_mode, rtx, rtx, 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. */ @@ -395,12 +515,6 @@ extern void emit_unop_insn (int, rtx, rtx, enum rtx_code); word at a time. */ 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 (rtx); - -/* Emit one rtl insn to store 1 in specified rtx assuming it contains 0. */ -extern void emit_0_to_1_insn (rtx); - /* Emit one rtl insn to compare two rtx's. */ extern void emit_cmp_insn (rtx, rtx, enum rtx_code, rtx, enum machine_mode, int); @@ -414,14 +528,15 @@ enum can_compare_purpose ccp_store_flag }; +/* Return the optab used for computing the given operation on the type + given by the second argument. */ +extern optab optab_for_tree_code (enum tree_code, tree); + /* Nonzero if a compare of mode MODE can be done straightforwardly (without splitting it into pieces). */ 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); @@ -430,11 +545,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, @@ -446,4 +556,10 @@ extern void expand_float (rtx, rtx, int); /* Generate code for a FIX_EXPR. */ extern void expand_fix (rtx, rtx, int); +/* Return tree if target supports vector operations for COND_EXPR. */ +bool expand_vec_cond_expr_p (tree, enum machine_mode); + +/* Generate code for VEC_COND_EXPR. */ +extern rtx expand_vec_cond_expr (tree, rtx); + #endif /* GCC_OPTABS_H */