diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-07 02:23:42 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-07 02:23:42 +0000 |
commit | a7cc195f790136b5b4e9e0bddcc99de03149e1f1 (patch) | |
tree | 272ff451c0f5e3b65cd727409933c9d1f5119570 /gcc/optabs.h | |
parent | 6d2bcb24a901d8ed522851bc6946e8a995fea423 (diff) | |
download | gcc-a7cc195f790136b5b4e9e0bddcc99de03149e1f1.tar.gz |
* libfuncs.h (LTI_extendsfdf2, LTI_extendsfxf2, LTI_extendsftf2)
(LTI_extenddfxf2, LTI_extenddftf2, LTI_truncdfsf2, LTI_truncxfsf2)
(LTI_trunctfsf2, LTI_truncxfdf2, LTI_trunctfdf2, LTI_floatsisf)
(LTI_floatdisf, LTI_floattisf, LTI_floatsidf, LTI_floatdidf)
(LTI_floattidf, LTI_floatsixf, LTI_floatdixf, LTI_floattixf)
(LTI_floatsitf, LTI_floatditf, LTI_floattitf, LTI_fixsfsi, LTI_fixsfdi)
(LTI_fixsfti, LTI_fixdfsi, LTI_fixdfdi, LTI_fixdfti, LTI_fixxfsi)
(LTI_fixxfdi, LTI_fixxfti, LTI_fixtfsi, LTI_fixtfdi, LTI_fixtfti)
(LTI_fixunssfsi, LTI_fixunssfdi, LTI_fixunssfti, LTI_fixunsdfsi)
(LTI_fixunsdfdi, LTI_fixunsdfti, LTI_fixunsxfsi, LTI_fixunsxfdi)
(LTI_fixunsxfti, LTI_fixunstfsi, LTI_fixunstfdi, LTI_fixunstfti)
(extendsfdf2_libfunc, extendsfxf2_libfunc, extendsftf2_libfunc)
(extenddfxf2_libfunc, extenddftf2_libfunc, truncdfsf2_libfunc)
(truncxfsf2_libfunc, trunctfsf2_libfunc, truncxfdf2_libfunc)
(trunctfdf2_libfunc, floatsisf_libfunc, floatdisf_libfunc)
(floattisf_libfunc, floatsidf_libfunc, floatdidf_libfunc)
(floattidf_libfunc, floatsixf_libfunc, floatdixf_libfunc)
(floattixf_libfunc, floatsitf_libfunc, floatditf_libfunc)
(floattitf_libfunc, fixsfsi_libfunc, fixsfdi_libfunc, fixsfti_libfunc)
(fixdfsi_libfunc, fixdfdi_libfunc, fixdfti_libfunc, fixxfsi_libfunc)
(fixxfdi_libfunc, fixxfti_libfunc, fixtfsi_libfunc, fixtfdi_libfunc)
(fixtfti_libfunc, fixunssfsi_libfunc, fixunssfdi_libfunc)
(fixunssfti_libfunc, fixunsdfsi_libfunc, fixunsdfdi_libfunc)
(fixunsdfti_libfunc, fixunsxfsi_libfunc, fixunsxfdi_libfunc)
(fixunsxfti_libfunc, fixunstfsi_libfunc, fixunstfdi_libfunc)
(fixunstfti_libfunc): Delete.
* optabs.h (struct optab_handlers): Break out of struct optab.
(struct convert_optab, convert_optab, enum convert_optab_index,
convert_optab_table, sext_optab, zext_optab, trunc_optab,
sfix_optab, ufix_optab, sfixtrunc_optab, ufixtrunc_optab,
sfloat_optab, ufloat_optab): New.
(set_conv_libfunc): Prototype.
(GEN_FCN): Use C90 indirect call syntax, remove unnecessary cast.
(trunc_optab): Renamed btrunc_optab.
* builtins.c (expand_builtin_mathfn): Update to match.
* optabs.c (extendtab, fixtab, fixtrunctab, floattab): Delete.
(convert_optab_table, new_convert_optab, init_convert_optab)
(init_interclass_conv_libfuncs, init_intraclass_conv_libfuncs)
(set_conv_libfunc): New.
(can_extend_p, gen_extend_insn, can_fix_p, can_float_p)
(expand_float, expand_fix): Use new conversion optabs,
not old insn code tables or long chains of ifs.
(init_optabs): No need to clear old insn code tables.
Initialize the new optabs, not the old libfunc array entries.
Don't handle FIXUNS_TRUNC_LIKE_FIX_TRUNC here.
* genopinit.c: Initialize conversion optabs, not the
former insn code tables. Remove unnecessary casts.
Handle FIXUNS_TRUNC_LIKE_FIX_TRUNC here.
* expr.c (convert_move): Remove redundant check that
to_real==from_real. Use the conversion optabs instead
of long chains of tests of modes. Move partial-integer-mode
interconversion above all integer conversion. Do not recurse
on a value forced into a register in the original mode.
* config/gofast.h, config/frv/frv.c, config/ia64/ia64.c
* config/mips/mips.c, config/pa/pa.c, config/rs6000/rs6000.c
* config/sparc/sparc.c: Use set_conv_libfunc to adjust entries
in new conversion optabs; do not reference the old libfunc
array entries. No need to include libfuncs.h.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72178 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/optabs.h')
-rw-r--r-- | gcc/optabs.h | 62 |
1 files changed, 50 insertions, 12 deletions
diff --git a/gcc/optabs.h b/gcc/optabs.h index 02c0af5d33a..d8448afb034 100644 --- a/gcc/optabs.h +++ b/gcc/optabs.h @@ -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 @@ -242,7 +255,7 @@ extern GTY(()) optab optab_table[OTI_MAX]; #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 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]) @@ -268,13 +281,36 @@ extern GTY(()) optab optab_table[OTI_MAX]; #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]; +/* Conversion optabs have their own table and indexes. */ +enum convert_optab_index +{ + CTI_sext, + CTI_zext, + CTI_trunc, + + CTI_sfix, + CTI_ufix, + + CTI_sfixtrunc, + CTI_ufixtrunc, + + CTI_sfloat, + CTI_ufloat, + + CTI_MAX +}; + +extern GTY(()) convert_optab convert_optab_table[CTI_MAX]; -/* 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]; +#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 @@ -385,6 +421,8 @@ 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 (rtx, rtx, int); |