Reduce the size of optabs representation

From-SVN: r189821
This commit is contained in:
Richard Henderson 2012-07-24 11:28:15 -07:00 committed by Richard Henderson
parent 658e8ebaac
commit cd1440b199
8 changed files with 1111 additions and 1912 deletions

View File

@ -1,3 +1,139 @@
2012-07-24 Richard Henderson <rth@redhat.com>
* optabs.def: New file.
* Makefile.in (OPTABS_H): Add insn-opinit.h.
(MOSTLYCLEANFILES): Likewise.
(insn-opinit.o): Remove reload.h
(simple_rtl_generated_c): Remove insn-opinit.c.
(s-opinit): New rule.
(build/genopinit.o): Add optabs.def.
* genopinit.c (rtx_upname): New.
(optabs): Extract to optabs.def
(enum optab_tag, struct optab_def_d, optabs): New.
(struct pattern_d, patterns): New.
(match_pattern): Split out from ...
(gen_insn): ... here. Push matches on patterns vec.
(pattern_cmp, optab_kind_cmp, optab_rcode_cmp): New.
(header_file_name, source_file_name, handle_arg): New.
(open_outfile): New.
(main): Sort and emit new tables. Generate lookup_handler,
raw_optab_handler, swap_optab_enable.
* libfuncs.h (libfunc_entry): Change "size_t optab" to "optab op".
* optabs.c (code_to_optab_): Remove.
(hash_libfunc): Update for optab name change.
(eq_libfunc): Likewise.
(convert_optab_libfunc): Update computation of optab member;
use the new convlib_def table.
(optab_libfunc): Similarly.
(set_optab_libfunc, set_conv_libfunc): Likewise.
(sign_expand_binop): Use swap_optab_enable instead of fake optabs.
(init_insn_codes, init_optab, init_optabv, init_convert_optab): Remove.
(init_optabs): Don't call them; export the data to optabs.def.
(gen_int_libfunc, gen_fp_libfunc): Export non-static.
(gen_fixed_libfunc, gen_signed_fixed_libfunc): Likewise.
(gen_unsigned_fixed_libfunc, gen_int_fp_libfunc): Likewise.
(gen_intv_fp_libfunc, gen_int_fp_fixed_libfunc): Likewise.
(gen_int_fp_signed_fixed_libfunc, gen_int_fixed_libfunc): Likewise.
(gen_int_signed_fixed_libfunc): Likewise.
(gen_int_unsigned_fixed_libfunc): Likewise.
(gen_interclass_conv_libfunc, gen_int_to_fp_conv_libfunc): Likewise.
(gen_ufloat_conv_libfunc): Likewise.
(gen_int_to_fp_nondecimal_conv_libfunc): Likewise.
(gen_fp_to_int_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
(gen_trunc_conv_libfunc, gen_extend_conv_libfunc): Likewise.
(gen_fract_conv_libfunc, gen_fractuns_conv_libfunc): Likewise.
(gen_satfract_conv_libfunc, gen_satfractuns_conv_libfunc): Likewise.
(debug_optab_libfuncs): Update for optab representation change.
* optabs.h: Include insn-opinit.h.
(optab, convert_optab, direct_optab): New typedefs.
(struct optab_handlers, struct widening_optab_handlers): Remove.
(struct optab_libcall_d): Rename from optab_d; remove code_,
handlers, widening members.
(struct convert_optab_libcall_d): Rename from convert_optab_d;
remove code_ and handlers members.
(enum optab_index, enum convert_optab_index): Remove.
(enum direct_optab_index): Remove.
(code_to_optab_): Fix array range.
(optab_to_code): Covert to inline function.
(optab_to_code_, convlib_def, normlib_def): Declare.
(raw_optab_handler, swap_optab_enable): Declare.
(unknown_optab): Remove; export to optabs.def
(ssadd_optab, usadd_optab, sssub_optab, ussub_optab, ssmul_optab,
usmul_optab, ssdiv_optab, usdiv_optab, ssneg_optab, usneg_optab,
ssashl_optab, usashl_optab, add_optab, sub_optab, smul_optab,
addv_optab, subv_optab, smul_highpart_optab, umul_highpart_optab,
smul_widen_optab, umul_widen_optab, usmul_widen_optab,
smadd_widen_optab, umadd_widen_optab, ssmadd_widen_optab,
usmadd_widen_optab, smsub_widen_optab, umsub_widen_optab,
ssmsub_widen_optab, usmsub_widen_optab, sdiv_optab, smulv_optab,
sdivv_optab, sdivmod_optab, udiv_optab, udivmod_optab, smod_optab,
umod_optab, fmod_optab, remainder_optab, ftrunc_optab, and_optab,
ior_optab, xor_optab, ashl_optab, lshr_optab, ashr_optab, rotl_optab,
rotr_optab, vashl_optab, vlshr_optab, vashr_optab, vrotl_optab,
vrotr_optab, smin_optab, smax_optab, umin_optab, umax_optab, pow_optab,
atan2_optab, fma_optab, fms_optab, fnma_optab, fnms_optab, mov_optab,
movstrict_optab, movmisalign_optab, storent_optab, neg_optab,
negv_optab, abs_optab, absv_optab, one_cmpl_optab, bswap_optab,
ffs_optab, clz_optab, ctz_optab, clrsb_optab, popcount_optab,
parity_optab, sqrt_optab, sincos_optab, sin_optab, asin_optab,
cos_optab, acos_optab, exp_optab, exp10_optab, exp2_optab, expm1_optab,
ldexp_optab, scalb_optab, significand_optab, logb_optab, ilogb_optab,
log_optab, log10_optab, log2_optab, log1p_optab, floor_optab,
ceil_optab, btrunc_optab, round_optab, nearbyint_optab, rint_optab,
tan_optab, atan_optab, copysign_optab, signbit_optab, isinf_optab,
cmp_optab, ucmp_optab, eq_optab, ne_optab, gt_optab, ge_optab,
lt_optab, le_optab, unord_optab, strlen_optab, cbranch_optab,
cmov_optab, cstore_optab, ctrap_optab, push_optab, addcc_optab,
reduc_smax_optab, reduc_umax_optab, reduc_smin_optab, reduc_umin_optab,
reduc_splus_optab, reduc_uplus_optab, ssum_widen_optab,
usum_widen_optab, sdot_prod_optab, udot_prod_optab, vec_set_optab,
vec_extract_optab, vec_init_optab, vec_shl_optab, vec_shr_optab,
vec_realign_load_optab, vec_widen_umult_hi_optab,
vec_widen_umult_lo_optab, vec_widen_smult_hi_optab,
vec_widen_smult_lo_optab, vec_widen_umult_even_optab,
vec_widen_umult_odd_optab, vec_widen_smult_even_optab,
vec_widen_smult_odd_optab, vec_widen_ushiftl_hi_optab,
vec_widen_ushiftl_lo_optab, vec_widen_sshiftl_hi_optab,
vec_widen_sshiftl_lo_optab, vec_unpacks_hi_optab, vec_unpacks_lo_optab,
vec_unpacku_hi_optab, vec_unpacku_lo_optab, vec_unpacks_float_hi_optab,
vec_unpacks_float_lo_optab, vec_unpacku_float_hi_optab,
vec_unpacku_float_lo_optab, vec_pack_trunc_optab, vec_pack_ssat_optab,
vec_pack_usat_optab, vec_pack_sfix_trunc_optab,
vec_pack_ufix_trunc_optab, powi_optab, sync_compare_and_swap_optab,
sync_lock_test_and_set_optab, sync_old_add_optab, sync_old_sub_optab,
sync_old_ior_optab, sync_old_and_optab, sync_old_xor_optab,
sync_old_nand_optab, sync_new_add_optab, sync_new_sub_optab,
sync_new_ior_optab, sync_new_and_optab, sync_new_xor_optab,
sync_new_nand_optab, sext_optab, zext_optab, trunc_optab, sfix_optab,
ufix_optab, sfixtrunc_optab, ufixtrunc_optab, sfloat_optab,
ufloat_optab, lrint_optab, lround_optab, lfloor_optab, lceil_optab,
fract_optab, fractuns_optab, satfract_optab, satfractuns_optab,
vec_load_lanes_optab, vec_store_lanes_optab, vcond_optab, vcondu_optab,
movcc_optab, reload_in_optab, reload_out_optab, movmem_optab,
setmem_optab, cmpstr_optab, cmpstrn_optab, cmpmem_optab,
sync_lock_release_optab, sync_add_optab, sync_sub_optab,
sync_ior_optab, sync_and_optab, sync_xor_optab, sync_nand_optab,
atomic_exchange_optab, atomic_compare_and_swap_optab,
atomic_load_optab, atomic_store_optab, atomic_add_fetch_optab,
atomic_sub_fetch_optab, atomic_and_fetch_optab,
atomic_nand_fetch_optab, atomic_xor_fetch_optab, atomic_or_fetch_optab,
atomic_fetch_add_optab, atomic_fetch_sub_optab, atomic_fetch_and_optab,
atomic_fetch_nand_optab, atomic_fetch_xor_optab, atomic_fetch_or_optab,
atomic_add_optab, atomic_sub_optab, atomic_and_optab,
atomic_nand_optab, atomic_xor_optab, atomic_or_optab,
atomic_always_lock_free_optab, atomic_is_lock_free_optab,
atomic_thread_fence_optab, atomic_signal_fence_optab,
vec_perm_optab, vec_perm_const_optab): Likewise.
(struct target_optabs): Remove x_optab_table, x_convert_optab_table,
and x_direct_optab_table members; add pat_enable.
(optab_table, convert_optab_table, direct_optab_table): Remove.
(optab_handler): Use raw_optab_handler.
(widening_optab_handler, convert_optab_handler): Likewise.
(set_optab_handler, set_widening_optab_handler): Remove.
(set_convert_optab_handler, set_direct_optab_handler): Remove.
(direct_optab_handler): Defer to optab_handler.
* rtl.h (NON_GENERATOR_NUM_RTX_CODE): New.
2012-07-24 Jason Merrill <jason@redhat.com>
* bitmap.c (bitmap_descriptor): Adjust order of parameters to

View File

@ -889,7 +889,7 @@ OPTIONS_H = options.h flag-types.h $(OPTIONS_H_EXTRA)
FUNCTION_H = function.h $(HASHTAB_H) vecprim.h $(TM_H) hard-reg-set.h \
$(VEC_H) vecir.h $(INPUT_H) $(MACHMODE_H)
EXPR_H = expr.h insn-config.h $(FUNCTION_H) $(RTL_H) $(FLAGS_H) $(TREE_H) $(MACHMODE_H) $(EMIT_RTL_H)
OPTABS_H = optabs.h insn-codes.h
OPTABS_H = optabs.h insn-codes.h insn-opinit.h
REGS_H = regs.h $(MACHMODE_H) hard-reg-set.h
SCHED_INT_H = sched-int.h $(INSN_ATTR_H) $(BASIC_BLOCK_H) $(RTL_H) $(DF_H) \
vecprim.h $(REGSET_H)
@ -1484,7 +1484,7 @@ BACKEND = libbackend.a main.o @TREEBROWSER@ libcommon-target.a libcommon.a \
MOSTLYCLEANFILES = insn-flags.h insn-config.h insn-codes.h \
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
insn-attr.h insn-attr-common.h insn-attrtab.c insn-dfatab.c \
insn-latencytab.c insn-opinit.c insn-preds.c insn-constants.h \
insn-latencytab.c insn-opinit.c insn-opinit.h insn-preds.c insn-constants.h \
tm-preds.h tm-constrs.h checksum-options \
tree-check.h min-insn-modes.c insn-modes.c insn-modes.h \
genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-input.list \
@ -3430,7 +3430,7 @@ insn-modes.o : insn-modes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(MACHMODE_H)
insn-opinit.o : insn-opinit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(RTL_H) $(TM_P_H) insn-config.h $(FLAGS_H) $(RECOG_H) \
$(EXPR_H) $(OPTABS_H) reload.h
$(EXPR_H) $(OPTABS_H)
insn-output.o : insn-output.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(RTL_H) $(GGC_H) $(REGS_H) conditions.h \
hard-reg-set.h insn-config.h $(INSN_ATTR_H) $(EXPR_H) output.h \
@ -3459,7 +3459,7 @@ simple_rtl_generated_h = insn-attr.h insn-attr-common.h insn-codes.h \
insn-config.h insn-flags.h
simple_rtl_generated_c = insn-automata.c insn-emit.c \
insn-extract.c insn-opinit.c insn-output.c \
insn-extract.c insn-output.c \
insn-peep.c insn-recog.c
simple_generated_h = $(simple_rtl_generated_h) insn-constants.h
@ -3506,6 +3506,15 @@ s-attrtab : $(MD_DEPS) build/genattrtab$(build_exeext) \
$(SHELL) $(srcdir)/../move-if-change tmp-latencytab.c insn-latencytab.c
$(STAMP) s-attrtab
# genopinit produces two files.
insn-opinit.c insn-opinit.h: s-opinit ; @true
s-opinit: $(MD_DEPS) build/genopinit$(build_exeext) insn-conditions.md
$(RUN_GEN) build/genopinit$(build_exeext) $(md_file) \
insn-conditions.md -htmp-opinit.h -ctmp-opinit.c
$(SHELL) $(srcdir)/../move-if-change tmp-opinit.h insn-opinit.h
$(SHELL) $(srcdir)/../move-if-change tmp-opinit.c insn-opinit.c
$(STAMP) s-opinit
# gencondmd doesn't use the standard naming convention.
build/gencondmd.c: s-conditions; @true
s-conditions: $(MD_DEPS) build/genconditions$(build_exeext)
@ -3859,7 +3868,7 @@ build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \
build/genmodes.o : genmodes.c $(BCONFIG_H) $(SYSTEM_H) errors.h \
$(HASHTAB_H) machmode.def $(extra_modes_file)
build/genopinit.o : genopinit.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \
coretypes.h $(GTM_H) errors.h gensupport.h
coretypes.h $(GTM_H) errors.h gensupport.h optabs.def
build/genoutput.o : genoutput.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \
coretypes.h $(GTM_H) errors.h $(READ_MD_H) gensupport.h
build/genpeep.o : genpeep.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \

View File

@ -1,7 +1,5 @@
/* Generate code to initialize optabs from machine description.
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
Free Software Foundation, Inc.
Copyright (C) 1993-2012 Free Software Foundation, Inc.
This file is part of GCC.
@ -29,542 +27,498 @@ along with GCC; see the file COPYING3. If not see
#include "gensupport.h"
/* Many parts of GCC use arrays that are indexed by machine mode and
contain the insn codes for pattern in the MD file that perform a given
operation on operands of that mode.
#define DEF_RTL_EXPR(V, N, X, C) #V,
These patterns are present in the MD file with names that contain
the mode(s) used and the name of the operation. This program
writes a function `init_all_optabs' that initializes the optabs with
all the insn codes of the relevant patterns present in the MD file.
static const char * const rtx_upname[] = {
#include "rtl.def"
};
This array contains a list of optabs that need to be initialized. Within
each string, the name of the pattern to be matched against is delimited
with $( and $). In the string, $a and $b are used to match a short mode
name (the part of the mode name not including `mode' and converted to
lower-case). When writing out the initializer, the entire string is
used. $A and $B are replaced with the full name of the mode; $a and $b
are replaced with the short form of the name, as above.
#undef DEF_RTL_EXPR
If $N is present in the pattern, it means the two modes must be in
the same mode class, and $b must be greater than $a (e.g, QImode
and HImode).
/* The entries in optabs.def are categorized:
C: A "conversion" optab, which uses two modes; has libcall data.
N: A "normal" optab, which uses one mode; has libcall data.
D: A "direct" optab, which uses one mode; does not have libcall data.
V: An "oVerflow" optab. Like N, but does not record its code in
code_to_optab.
CX, NX, VX: An extra pattern entry for a conversion or normal optab.
These patterns may be present in the MD file with names that contain
the mode(s) used and the name of the operation. This array contains
a list of optabs that need to be initialized. Within each name,
$a and $b are used to match a short mode name (the part of the mode
name not including `mode' and converted to lower-case).
$I means that only full integer modes should be considered for the
next mode, and $F means that only float modes should be considered.
$P means that both full and partial integer modes should be considered.
$Q means that only fixed-point modes should be considered.
$V means to emit 'v' if the first mode is a MODE_FLOAT mode.
The pattern may be NULL if the optab exists only for the libcalls
that we plan to attach to it, and there are no named patterns in
the md files. */
For some optabs, we store the operation by RTL codes. These are only
used for comparisons. In that case, $c and $C are the lower-case and
upper-case forms of the comparison, respectively. */
#define OPTAB_CL(name, pat, c, b, l) name,
#define OPTAB_CX(name, pat)
#define OPTAB_CD(name, pat) name,
#define OPTAB_NL(name, pat, c, b, s, l) name,
#define OPTAB_NC(name, pat, c) name,
#define OPTAB_NX(name, pat)
#define OPTAB_VL(name, pat, c, b, s, l) name,
#define OPTAB_VC(name, pat, c) name,
#define OPTAB_VX(name, pat)
#define OPTAB_DC(name, pat, c) name,
#define OPTAB_D(name, pat) name,
static const char * const optabs[] =
{ "set_convert_optab_handler (sext_optab, $B, $A, CODE_FOR_$(extend$a$b2$))",
"set_convert_optab_handler (zext_optab, $B, $A, CODE_FOR_$(zero_extend$a$b2$))",
"set_convert_optab_handler (sfix_optab, $B, $A, CODE_FOR_$(fix$F$a$I$b2$))",
"set_convert_optab_handler (ufix_optab, $B, $A, CODE_FOR_$(fixuns$F$a$b2$))",
"set_convert_optab_handler (sfixtrunc_optab, $B, $A, CODE_FOR_$(fix_trunc$F$a$I$b2$))",
"set_convert_optab_handler (ufixtrunc_optab, $B, $A, CODE_FOR_$(fixuns_trunc$F$a$I$b2$))",
"set_convert_optab_handler (sfloat_optab, $B, $A, CODE_FOR_$(float$I$a$F$b2$))",
"set_convert_optab_handler (ufloat_optab, $B, $A, CODE_FOR_$(floatuns$I$a$F$b2$))",
"set_convert_optab_handler (trunc_optab, $B, $A, CODE_FOR_$(trunc$a$b2$))",
"set_convert_optab_handler (fract_optab, $B, $A, CODE_FOR_$(fract$a$b2$))",
"set_convert_optab_handler (fractuns_optab, $B, $A, CODE_FOR_$(fractuns$I$a$Q$b2$))",
"set_convert_optab_handler (fractuns_optab, $B, $A, CODE_FOR_$(fractuns$Q$a$I$b2$))",
"set_convert_optab_handler (satfract_optab, $B, $A, CODE_FOR_$(satfract$a$Q$b2$))",
"set_convert_optab_handler (satfractuns_optab, $B, $A, CODE_FOR_$(satfractuns$I$a$Q$b2$))",
"set_convert_optab_handler (vec_load_lanes_optab, $A, $B, CODE_FOR_$(vec_load_lanes$a$b$))",
"set_convert_optab_handler (vec_store_lanes_optab, $A, $B, CODE_FOR_$(vec_store_lanes$a$b$))",
"set_optab_handler (add_optab, $A, CODE_FOR_$(add$P$a3$))",
"set_optab_handler (addv_optab, $A, CODE_FOR_$(add$F$a3$)),\n\
set_optab_handler (add_optab, $A, CODE_FOR_$(add$F$a3$))",
"set_optab_handler (addv_optab, $A, CODE_FOR_$(addv$I$a3$))",
"set_optab_handler (add_optab, $A, CODE_FOR_$(add$Q$a3$))",
"set_optab_handler (ssadd_optab, $A, CODE_FOR_$(ssadd$Q$a3$))",
"set_optab_handler (usadd_optab, $A, CODE_FOR_$(usadd$Q$a3$))",
"set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$P$a3$))",
"set_optab_handler (subv_optab, $A, CODE_FOR_$(sub$F$a3$)),\n\
set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$F$a3$))",
"set_optab_handler (subv_optab, $A, CODE_FOR_$(subv$I$a3$))",
"set_optab_handler (sub_optab, $A, CODE_FOR_$(sub$Q$a3$))",
"set_optab_handler (sssub_optab, $A, CODE_FOR_$(sssub$Q$a3$))",
"set_optab_handler (ussub_optab, $A, CODE_FOR_$(ussub$Q$a3$))",
"set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$Q$a3$))",
"set_optab_handler (ssmul_optab, $A, CODE_FOR_$(ssmul$Q$a3$))",
"set_optab_handler (usmul_optab, $A, CODE_FOR_$(usmul$Q$a3$))",
"set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$P$a3$))",
"set_optab_handler (smulv_optab, $A, CODE_FOR_$(mul$F$a3$)),\n\
set_optab_handler (smul_optab, $A, CODE_FOR_$(mul$F$a3$))",
"set_optab_handler (smulv_optab, $A, CODE_FOR_$(mulv$I$a3$))",
"set_optab_handler (umul_highpart_optab, $A, CODE_FOR_$(umul$a3_highpart$))",
"set_optab_handler (smul_highpart_optab, $A, CODE_FOR_$(smul$a3_highpart$))",
"set_widening_optab_handler (smul_widen_optab, $B, $A, CODE_FOR_$(mul$a$b3$)$N)",
"set_widening_optab_handler (umul_widen_optab, $B, $A, CODE_FOR_$(umul$a$b3$)$N)",
"set_widening_optab_handler (usmul_widen_optab, $B, $A, CODE_FOR_$(usmul$a$b3$)$N)",
"set_widening_optab_handler (smadd_widen_optab, $B, $A, CODE_FOR_$(madd$a$b4$)$N)",
"set_widening_optab_handler (umadd_widen_optab, $B, $A, CODE_FOR_$(umadd$a$b4$)$N)",
"set_widening_optab_handler (ssmadd_widen_optab, $B, $A, CODE_FOR_$(ssmadd$a$b4$)$N)",
"set_widening_optab_handler (usmadd_widen_optab, $B, $A, CODE_FOR_$(usmadd$a$b4$)$N)",
"set_widening_optab_handler (smsub_widen_optab, $B, $A, CODE_FOR_$(msub$a$b4$)$N)",
"set_widening_optab_handler (umsub_widen_optab, $B, $A, CODE_FOR_$(umsub$a$b4$)$N)",
"set_widening_optab_handler (ssmsub_widen_optab, $B, $A, CODE_FOR_$(ssmsub$a$b4$)$N)",
"set_widening_optab_handler (usmsub_widen_optab, $B, $A, CODE_FOR_$(usmsub$a$b4$)$N)",
"set_optab_handler (sdiv_optab, $A, CODE_FOR_$(div$a3$))",
"set_optab_handler (ssdiv_optab, $A, CODE_FOR_$(ssdiv$Q$a3$))",
"set_optab_handler (sdivv_optab, $A, CODE_FOR_$(div$V$I$a3$))",
"set_optab_handler (udiv_optab, $A, CODE_FOR_$(udiv$I$a3$))",
"set_optab_handler (udiv_optab, $A, CODE_FOR_$(udiv$Q$a3$))",
"set_optab_handler (usdiv_optab, $A, CODE_FOR_$(usdiv$Q$a3$))",
"set_optab_handler (sdivmod_optab, $A, CODE_FOR_$(divmod$a4$))",
"set_optab_handler (udivmod_optab, $A, CODE_FOR_$(udivmod$a4$))",
"set_optab_handler (smod_optab, $A, CODE_FOR_$(mod$a3$))",
"set_optab_handler (umod_optab, $A, CODE_FOR_$(umod$a3$))",
"set_optab_handler (fmod_optab, $A, CODE_FOR_$(fmod$a3$))",
"set_optab_handler (remainder_optab, $A, CODE_FOR_$(remainder$a3$))",
"set_optab_handler (ftrunc_optab, $A, CODE_FOR_$(ftrunc$F$a2$))",
"set_optab_handler (and_optab, $A, CODE_FOR_$(and$a3$))",
"set_optab_handler (ior_optab, $A, CODE_FOR_$(ior$a3$))",
"set_optab_handler (xor_optab, $A, CODE_FOR_$(xor$a3$))",
"set_optab_handler (ashl_optab, $A, CODE_FOR_$(ashl$a3$))",
"set_optab_handler (ssashl_optab, $A, CODE_FOR_$(ssashl$Q$a3$))",
"set_optab_handler (usashl_optab, $A, CODE_FOR_$(usashl$Q$a3$))",
"set_optab_handler (ashr_optab, $A, CODE_FOR_$(ashr$a3$))",
"set_optab_handler (lshr_optab, $A, CODE_FOR_$(lshr$a3$))",
"set_optab_handler (rotl_optab, $A, CODE_FOR_$(rotl$a3$))",
"set_optab_handler (rotr_optab, $A, CODE_FOR_$(rotr$a3$))",
"set_optab_handler (vashr_optab, $A, CODE_FOR_$(vashr$a3$))",
"set_optab_handler (vlshr_optab, $A, CODE_FOR_$(vlshr$a3$))",
"set_optab_handler (vashl_optab, $A, CODE_FOR_$(vashl$a3$))",
"set_optab_handler (vrotl_optab, $A, CODE_FOR_$(vrotl$a3$))",
"set_optab_handler (vrotr_optab, $A, CODE_FOR_$(vrotr$a3$))",
"set_optab_handler (smin_optab, $A, CODE_FOR_$(smin$a3$))",
"set_optab_handler (smax_optab, $A, CODE_FOR_$(smax$a3$))",
"set_optab_handler (umin_optab, $A, CODE_FOR_$(umin$I$a3$))",
"set_optab_handler (umax_optab, $A, CODE_FOR_$(umax$I$a3$))",
"set_optab_handler (pow_optab, $A, CODE_FOR_$(pow$a3$))",
"set_optab_handler (atan2_optab, $A, CODE_FOR_$(atan2$a3$))",
"set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$P$a2$))",
"set_optab_handler (negv_optab, $A, CODE_FOR_$(neg$F$a2$)),\n\
set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$F$a2$))",
"set_optab_handler (negv_optab, $A, CODE_FOR_$(negv$I$a2$))",
"set_optab_handler (neg_optab, $A, CODE_FOR_$(neg$Q$a2$))",
"set_optab_handler (ssneg_optab, $A, CODE_FOR_$(ssneg$Q$a2$))",
"set_optab_handler (usneg_optab, $A, CODE_FOR_$(usneg$Q$a2$))",
"set_optab_handler (abs_optab, $A, CODE_FOR_$(abs$P$a2$))",
"set_optab_handler (absv_optab, $A, CODE_FOR_$(abs$F$a2$)),\n\
set_optab_handler (abs_optab, $A, CODE_FOR_$(abs$F$a2$))",
"set_optab_handler (absv_optab, $A, CODE_FOR_$(absv$I$a2$))",
"set_optab_handler (copysign_optab, $A, CODE_FOR_$(copysign$F$a3$))",
"set_optab_handler (signbit_optab, $A, CODE_FOR_$(signbit$F$a2$))",
"set_optab_handler (isinf_optab, $A, CODE_FOR_$(isinf$a2$))",
"set_optab_handler (sqrt_optab, $A, CODE_FOR_$(sqrt$a2$))",
"set_optab_handler (floor_optab, $A, CODE_FOR_$(floor$a2$))",
"set_convert_optab_handler (lfloor_optab, $B, $A, CODE_FOR_$(lfloor$F$a$I$b2$))",
"set_optab_handler (fma_optab, $A, CODE_FOR_$(fma$a4$))",
"set_optab_handler (fms_optab, $A, CODE_FOR_$(fms$a4$))",
"set_optab_handler (fnma_optab, $A, CODE_FOR_$(fnma$a4$))",
"set_optab_handler (fnms_optab, $A, CODE_FOR_$(fnms$a4$))",
"set_optab_handler (ceil_optab, $A, CODE_FOR_$(ceil$a2$))",
"set_convert_optab_handler (lceil_optab, $B, $A, CODE_FOR_$(lceil$F$a$I$b2$))",
"set_optab_handler (round_optab, $A, CODE_FOR_$(round$a2$))",
"set_optab_handler (btrunc_optab, $A, CODE_FOR_$(btrunc$a2$))",
"set_optab_handler (nearbyint_optab, $A, CODE_FOR_$(nearbyint$a2$))",
"set_optab_handler (rint_optab, $A, CODE_FOR_$(rint$a2$))",
"set_convert_optab_handler (lrint_optab, $B, $A, CODE_FOR_$(lrint$F$a$I$b2$))",
"set_convert_optab_handler (lround_optab, $B, $A, CODE_FOR_$(lround$F$a$I$b2$))",
"set_optab_handler (sincos_optab, $A, CODE_FOR_$(sincos$a3$))",
"set_optab_handler (sin_optab, $A, CODE_FOR_$(sin$a2$))",
"set_optab_handler (asin_optab, $A, CODE_FOR_$(asin$a2$))",
"set_optab_handler (cos_optab, $A, CODE_FOR_$(cos$a2$))",
"set_optab_handler (acos_optab, $A, CODE_FOR_$(acos$a2$))",
"set_optab_handler (exp_optab, $A, CODE_FOR_$(exp$a2$))",
"set_optab_handler (exp10_optab, $A, CODE_FOR_$(exp10$a2$))",
"set_optab_handler (exp2_optab, $A, CODE_FOR_$(exp2$a2$))",
"set_optab_handler (expm1_optab, $A, CODE_FOR_$(expm1$a2$))",
"set_optab_handler (ldexp_optab, $A, CODE_FOR_$(ldexp$a3$))",
"set_optab_handler (scalb_optab, $A, CODE_FOR_$(scalb$a3$))",
"set_optab_handler (significand_optab, $A, CODE_FOR_$(significand$a2$))",
"set_optab_handler (logb_optab, $A, CODE_FOR_$(logb$a2$))",
"set_optab_handler (ilogb_optab, $A, CODE_FOR_$(ilogb$a2$))",
"set_optab_handler (log_optab, $A, CODE_FOR_$(log$a2$))",
"set_optab_handler (log10_optab, $A, CODE_FOR_$(log10$a2$))",
"set_optab_handler (log2_optab, $A, CODE_FOR_$(log2$a2$))",
"set_optab_handler (log1p_optab, $A, CODE_FOR_$(log1p$a2$))",
"set_optab_handler (tan_optab, $A, CODE_FOR_$(tan$a2$))",
"set_optab_handler (atan_optab, $A, CODE_FOR_$(atan$a2$))",
"set_optab_handler (strlen_optab, $A, CODE_FOR_$(strlen$a$))",
"set_optab_handler (one_cmpl_optab, $A, CODE_FOR_$(one_cmpl$a2$))",
"set_optab_handler (bswap_optab, $A, CODE_FOR_$(bswap$a2$))",
"set_optab_handler (ffs_optab, $A, CODE_FOR_$(ffs$a2$))",
"set_optab_handler (clz_optab, $A, CODE_FOR_$(clz$a2$))",
"set_optab_handler (ctz_optab, $A, CODE_FOR_$(ctz$a2$))",
"set_optab_handler (clrsb_optab, $A, CODE_FOR_$(clrsb$a2$))",
"set_optab_handler (popcount_optab, $A, CODE_FOR_$(popcount$a2$))",
"set_optab_handler (parity_optab, $A, CODE_FOR_$(parity$a2$))",
"set_optab_handler (mov_optab, $A, CODE_FOR_$(mov$a$))",
"set_optab_handler (movstrict_optab, $A, CODE_FOR_$(movstrict$a$))",
"set_optab_handler (movmisalign_optab, $A, CODE_FOR_$(movmisalign$a$))",
"set_optab_handler (storent_optab, $A, CODE_FOR_$(storent$a$))",
"set_optab_handler (addcc_optab, $A, CODE_FOR_$(add$acc$))",
"set_direct_optab_handler (movcc_optab, $A, CODE_FOR_$(mov$acc$))",
"set_optab_handler (cbranch_optab, $A, CODE_FOR_$(cbranch$a4$))",
"set_optab_handler (cmov_optab, $A, CODE_FOR_$(cmov$a6$))",
"set_optab_handler (cstore_optab, $A, CODE_FOR_$(cstore$a4$))",
"set_optab_handler (ctrap_optab, $A, CODE_FOR_$(ctrap$a4$))",
"set_optab_handler (push_optab, $A, CODE_FOR_$(push$a1$))",
"set_direct_optab_handler (reload_in_optab, $A, CODE_FOR_$(reload_in$a$))",
"set_direct_optab_handler (reload_out_optab, $A, CODE_FOR_$(reload_out$a$))",
"set_direct_optab_handler (movmem_optab, $A, CODE_FOR_$(movmem$a$))",
"set_direct_optab_handler (cmpstr_optab, $A, CODE_FOR_$(cmpstr$a$))",
"set_direct_optab_handler (cmpstrn_optab, $A, CODE_FOR_$(cmpstrn$a$))",
"set_direct_optab_handler (cmpmem_optab, $A, CODE_FOR_$(cmpmem$a$))",
"set_direct_optab_handler (setmem_optab, $A, CODE_FOR_$(setmem$a$))",
"set_direct_optab_handler (sync_add_optab, $A, CODE_FOR_$(sync_add$I$a$))",
"set_direct_optab_handler (sync_sub_optab, $A, CODE_FOR_$(sync_sub$I$a$))",
"set_direct_optab_handler (sync_ior_optab, $A, CODE_FOR_$(sync_ior$I$a$))",
"set_direct_optab_handler (sync_and_optab, $A, CODE_FOR_$(sync_and$I$a$))",
"set_direct_optab_handler (sync_xor_optab, $A, CODE_FOR_$(sync_xor$I$a$))",
"set_direct_optab_handler (sync_nand_optab, $A, CODE_FOR_$(sync_nand$I$a$))",
"set_optab_handler (sync_old_add_optab, $A, CODE_FOR_$(sync_old_add$I$a$))",
"set_optab_handler (sync_old_sub_optab, $A, CODE_FOR_$(sync_old_sub$I$a$))",
"set_optab_handler (sync_old_ior_optab, $A, CODE_FOR_$(sync_old_ior$I$a$))",
"set_optab_handler (sync_old_and_optab, $A, CODE_FOR_$(sync_old_and$I$a$))",
"set_optab_handler (sync_old_xor_optab, $A, CODE_FOR_$(sync_old_xor$I$a$))",
"set_optab_handler (sync_old_nand_optab, $A, CODE_FOR_$(sync_old_nand$I$a$))",
"set_optab_handler (sync_new_add_optab, $A, CODE_FOR_$(sync_new_add$I$a$))",
"set_optab_handler (sync_new_sub_optab, $A, CODE_FOR_$(sync_new_sub$I$a$))",
"set_optab_handler (sync_new_ior_optab, $A, CODE_FOR_$(sync_new_ior$I$a$))",
"set_optab_handler (sync_new_and_optab, $A, CODE_FOR_$(sync_new_and$I$a$))",
"set_optab_handler (sync_new_xor_optab, $A, CODE_FOR_$(sync_new_xor$I$a$))",
"set_optab_handler (sync_new_nand_optab, $A, CODE_FOR_$(sync_new_nand$I$a$))",
"set_optab_handler (sync_compare_and_swap_optab, $A, CODE_FOR_$(sync_compare_and_swap$I$a$))",
"set_optab_handler (sync_lock_test_and_set_optab, $A, CODE_FOR_$(sync_lock_test_and_set$I$a$))",
"set_direct_optab_handler (sync_lock_release_optab, $A, CODE_FOR_$(sync_lock_release$I$a$))",
"set_direct_optab_handler (atomic_exchange_optab, $A, CODE_FOR_$(atomic_exchange$I$a$))",
"set_direct_optab_handler (atomic_compare_and_swap_optab, $A, CODE_FOR_$(atomic_compare_and_swap$I$a$))",
"set_direct_optab_handler (atomic_load_optab, $A, CODE_FOR_$(atomic_load$I$a$))",
"set_direct_optab_handler (atomic_store_optab, $A, CODE_FOR_$(atomic_store$I$a$))",
"set_direct_optab_handler (atomic_add_fetch_optab, $A, CODE_FOR_$(atomic_add_fetch$I$a$))",
"set_direct_optab_handler (atomic_sub_fetch_optab, $A, CODE_FOR_$(atomic_sub_fetch$I$a$))",
"set_direct_optab_handler (atomic_and_fetch_optab, $A, CODE_FOR_$(atomic_and_fetch$I$a$))",
"set_direct_optab_handler (atomic_nand_fetch_optab, $A, CODE_FOR_$(atomic_nand_fetch$I$a$))",
"set_direct_optab_handler (atomic_xor_fetch_optab, $A, CODE_FOR_$(atomic_xor_fetch$I$a$))",
"set_direct_optab_handler (atomic_or_fetch_optab, $A, CODE_FOR_$(atomic_or_fetch$I$a$))",
"set_direct_optab_handler (atomic_fetch_add_optab, $A, CODE_FOR_$(atomic_fetch_add$I$a$))",
"set_direct_optab_handler (atomic_fetch_sub_optab, $A, CODE_FOR_$(atomic_fetch_sub$I$a$))",
"set_direct_optab_handler (atomic_fetch_and_optab, $A, CODE_FOR_$(atomic_fetch_and$I$a$))",
"set_direct_optab_handler (atomic_fetch_nand_optab, $A, CODE_FOR_$(atomic_fetch_nand$I$a$))",
"set_direct_optab_handler (atomic_fetch_xor_optab, $A, CODE_FOR_$(atomic_fetch_xor$I$a$))",
"set_direct_optab_handler (atomic_fetch_or_optab, $A, CODE_FOR_$(atomic_fetch_or$I$a$))",
"set_direct_optab_handler (atomic_add_optab, $A, CODE_FOR_$(atomic_add$I$a$))",
"set_direct_optab_handler (atomic_sub_optab, $A, CODE_FOR_$(atomic_sub$I$a$))",
"set_direct_optab_handler (atomic_and_optab, $A, CODE_FOR_$(atomic_and$I$a$))",
"set_direct_optab_handler (atomic_nand_optab, $A, CODE_FOR_$(atomic_nand$I$a$))",
"set_direct_optab_handler (atomic_xor_optab, $A, CODE_FOR_$(atomic_xor$I$a$))",
"set_direct_optab_handler (atomic_or_optab, $A, CODE_FOR_$(atomic_or$I$a$))",
"set_optab_handler (vec_set_optab, $A, CODE_FOR_$(vec_set$a$))",
"set_optab_handler (vec_extract_optab, $A, CODE_FOR_$(vec_extract$a$))",
"set_optab_handler (vec_init_optab, $A, CODE_FOR_$(vec_init$a$))",
"set_optab_handler (vec_shl_optab, $A, CODE_FOR_$(vec_shl_$a$))",
"set_optab_handler (vec_shr_optab, $A, CODE_FOR_$(vec_shr_$a$))",
"set_optab_handler (vec_realign_load_optab, $A, CODE_FOR_$(vec_realign_load_$a$))",
"set_direct_optab_handler (vec_perm_optab, $A, CODE_FOR_$(vec_perm$a$))",
"set_direct_optab_handler (vec_perm_const_optab, $A, CODE_FOR_$(vec_perm_const$a$))",
"set_convert_optab_handler (vcond_optab, $A, $B, CODE_FOR_$(vcond$a$b$))",
"set_convert_optab_handler (vcondu_optab, $A, $B, CODE_FOR_$(vcondu$a$b$))",
"set_optab_handler (ssum_widen_optab, $A, CODE_FOR_$(widen_ssum$I$a3$))",
"set_optab_handler (usum_widen_optab, $A, CODE_FOR_$(widen_usum$I$a3$))",
"set_optab_handler (udot_prod_optab, $A, CODE_FOR_$(udot_prod$I$a$))",
"set_optab_handler (sdot_prod_optab, $A, CODE_FOR_$(sdot_prod$I$a$))",
"set_optab_handler (reduc_smax_optab, $A, CODE_FOR_$(reduc_smax_$a$))",
"set_optab_handler (reduc_umax_optab, $A, CODE_FOR_$(reduc_umax_$a$))",
"set_optab_handler (reduc_smin_optab, $A, CODE_FOR_$(reduc_smin_$a$))",
"set_optab_handler (reduc_umin_optab, $A, CODE_FOR_$(reduc_umin_$a$))",
"set_optab_handler (reduc_splus_optab, $A, CODE_FOR_$(reduc_splus_$a$))" ,
"set_optab_handler (reduc_uplus_optab, $A, CODE_FOR_$(reduc_uplus_$a$))",
"set_optab_handler (vec_widen_umult_hi_optab, $A, CODE_FOR_$(vec_widen_umult_hi_$a$))",
"set_optab_handler (vec_widen_umult_lo_optab, $A, CODE_FOR_$(vec_widen_umult_lo_$a$))",
"set_optab_handler (vec_widen_smult_hi_optab, $A, CODE_FOR_$(vec_widen_smult_hi_$a$))",
"set_optab_handler (vec_widen_smult_lo_optab, $A, CODE_FOR_$(vec_widen_smult_lo_$a$))",
"set_optab_handler (vec_widen_umult_even_optab, $A, CODE_FOR_$(vec_widen_umult_even_$a$))",
"set_optab_handler (vec_widen_umult_odd_optab, $A, CODE_FOR_$(vec_widen_umult_odd_$a$))",
"set_optab_handler (vec_widen_smult_even_optab, $A, CODE_FOR_$(vec_widen_smult_even_$a$))",
"set_optab_handler (vec_widen_smult_odd_optab, $A, CODE_FOR_$(vec_widen_smult_odd_$a$))",
"set_optab_handler (vec_widen_ushiftl_hi_optab, $A, CODE_FOR_$(vec_widen_ushiftl_hi_$a$))",
"set_optab_handler (vec_widen_ushiftl_lo_optab, $A, CODE_FOR_$(vec_widen_ushiftl_lo_$a$))",
"set_optab_handler (vec_widen_sshiftl_hi_optab, $A, CODE_FOR_$(vec_widen_sshiftl_hi_$a$))",
"set_optab_handler (vec_widen_sshiftl_lo_optab, $A, CODE_FOR_$(vec_widen_sshiftl_lo_$a$))",
"set_optab_handler (vec_unpacks_hi_optab, $A, CODE_FOR_$(vec_unpacks_hi_$a$))",
"set_optab_handler (vec_unpacks_lo_optab, $A, CODE_FOR_$(vec_unpacks_lo_$a$))",
"set_optab_handler (vec_unpacku_hi_optab, $A, CODE_FOR_$(vec_unpacku_hi_$a$))",
"set_optab_handler (vec_unpacku_lo_optab, $A, CODE_FOR_$(vec_unpacku_lo_$a$))",
"set_optab_handler (vec_unpacks_float_hi_optab, $A, CODE_FOR_$(vec_unpacks_float_hi_$a$))",
"set_optab_handler (vec_unpacks_float_lo_optab, $A, CODE_FOR_$(vec_unpacks_float_lo_$a$))",
"set_optab_handler (vec_unpacku_float_hi_optab, $A, CODE_FOR_$(vec_unpacku_float_hi_$a$))",
"set_optab_handler (vec_unpacku_float_lo_optab, $A, CODE_FOR_$(vec_unpacku_float_lo_$a$))",
"set_optab_handler (vec_pack_trunc_optab, $A, CODE_FOR_$(vec_pack_trunc_$a$))",
"set_optab_handler (vec_pack_ssat_optab, $A, CODE_FOR_$(vec_pack_ssat_$a$))",
"set_optab_handler (vec_pack_usat_optab, $A, CODE_FOR_$(vec_pack_usat_$a$))",
"set_optab_handler (vec_pack_sfix_trunc_optab, $A, CODE_FOR_$(vec_pack_sfix_trunc_$a$))",
"set_optab_handler (vec_pack_ufix_trunc_optab, $A, CODE_FOR_$(vec_pack_ufix_trunc_$a$))"
typedef enum optab_tag {
unknown_optab,
#include "optabs.def"
NUM_OPTABS
} optab;
#undef OPTAB_CL
#undef OPTAB_CX
#undef OPTAB_CD
#undef OPTAB_NL
#undef OPTAB_NC
#undef OPTAB_NX
#undef OPTAB_VL
#undef OPTAB_VC
#undef OPTAB_VX
#undef OPTAB_DC
#undef OPTAB_D
#define NS "NULL"
#define ZS "'\\0'"
#define OPTAB_CL(o, p, c, b, l) { #o, p, #b, ZS, #l, o, c, UNKNOWN, 1 },
#define OPTAB_CX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 1 },
#define OPTAB_CD(o, p) { #o, p, NS, ZS, NS, o, UNKNOWN, UNKNOWN, 2 },
#define OPTAB_NL(o, p, c, b, s, l) { #o, p, #b, #s, #l, o, c, c, 3 },
#define OPTAB_NC(o, p, c) { #o, p, NS, ZS, NS, o, c, c, 3 },
#define OPTAB_NX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 3 },
#define OPTAB_VL(o, p, c, b, s, l) { #o, p, #b, #s, #l, o, c, UNKNOWN, 3 },
#define OPTAB_VC(o, p, c) { #o, p, NS, ZS, NS, o, c, UNKNOWN, 3 },
#define OPTAB_VX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 3 },
#define OPTAB_DC(o, p, c) { #o, p, NS, ZS, NS, o, c, c, 4 },
#define OPTAB_D(o, p) { #o, p, NS, ZS, NS, o, UNKNOWN, UNKNOWN, 4 },
typedef struct optab_def_d
{
const char *name;
const char *pattern;
const char *base;
const char *suffix;
const char *libcall;
unsigned int op;
enum rtx_code fcode;
enum rtx_code rcode;
unsigned int kind;
} optab_def;
static optab_def optabs[] = {
{ "unknown_optab", NULL, NS, ZS, NS, unknown_optab, UNKNOWN, UNKNOWN, 0 },
#include "optabs.def"
};
static void gen_insn (rtx);
#undef OPTAB_CL
#undef OPTAB_CX
#undef OPTAB_CD
#undef OPTAB_NL
#undef OPTAB_NC
#undef OPTAB_NX
#undef OPTAB_VL
#undef OPTAB_VC
#undef OPTAB_VX
#undef OPTAB_DC
#undef OPTAB_D
/* Vector in which to collect insns that match. */
typedef struct pattern_d
{
const char *name;
unsigned int op;
unsigned int m1, m2;
unsigned int sort_num;
} pattern;
DEF_VEC_O(pattern);
DEF_VEC_ALLOC_O(pattern, heap);
static VEC(pattern, heap) *patterns;
static bool
match_pattern (pattern *p, const char *name, const char *pat)
{
bool force_float = false;
bool force_int = false;
bool force_partial_int = false;
bool force_fixed = false;
if (pat == NULL)
return false;
for (; ; ++pat)
{
if (*pat != '$')
{
if (*pat != *name++)
return false;
if (*pat == '\0')
return true;
continue;
}
switch (*++pat)
{
case 'I':
force_int = 1;
break;
case 'P':
force_partial_int = 1;
break;
case 'F':
force_float = 1;
break;
case 'Q':
force_fixed = 1;
break;
case 'a':
case 'b':
{
int i;
/* This loop will stop at the first prefix match, so
look through the modes in reverse order, in case
there are extra CC modes and CC is a prefix of the
CC modes (as it should be). */
for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
{
const char *p, *q;
for (p = GET_MODE_NAME(i), q = name; *p; p++, q++)
if (TOLOWER (*p) != *q)
break;
if (*p == 0
&& (! force_int || mode_class[i] == MODE_INT
|| mode_class[i] == MODE_VECTOR_INT)
&& (! force_partial_int
|| mode_class[i] == MODE_INT
|| mode_class[i] == MODE_PARTIAL_INT
|| mode_class[i] == MODE_VECTOR_INT)
&& (! force_float
|| mode_class[i] == MODE_FLOAT
|| mode_class[i] == MODE_DECIMAL_FLOAT
|| mode_class[i] == MODE_COMPLEX_FLOAT
|| mode_class[i] == MODE_VECTOR_FLOAT)
&& (! force_fixed
|| mode_class[i] == MODE_FRACT
|| mode_class[i] == MODE_UFRACT
|| mode_class[i] == MODE_ACCUM
|| mode_class[i] == MODE_UACCUM
|| mode_class[i] == MODE_VECTOR_FRACT
|| mode_class[i] == MODE_VECTOR_UFRACT
|| mode_class[i] == MODE_VECTOR_ACCUM
|| mode_class[i] == MODE_VECTOR_UACCUM))
break;
}
if (i < 0)
return false;
name += strlen (GET_MODE_NAME (i));
if (*pat == 'a')
p->m1 = i;
else
p->m2 = i;
force_int = false;
force_partial_int = false;
force_float = false;
force_fixed = false;
}
break;
default:
gcc_unreachable ();
}
}
}
static void
gen_insn (rtx insn)
{
const char *name = XSTR (insn, 0);
int m1 = 0, m2 = 0, op = 0;
size_t pindex;
int i;
const char *np, *pp, *p, *q;
pattern p;
unsigned pindex;
/* Don't mention instructions whose names are the null string.
They are in the machine description just to be recognized. */
if (*name == 0)
/* Don't mention "unnamed" instructions. */
if (*name == 0 || *name == '*')
return;
p.name = name;
/* See if NAME matches one of the patterns we have for the optabs we know
about. */
/* See if NAME matches one of the patterns we have for the optabs
we know about. */
for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
{
int force_float = 0, force_int = 0, force_partial_int = 0;
int force_fixed = 0;
int force_wider = 0;
int matches = 1;
for (pp = optabs[pindex]; pp[0] != '$' || pp[1] != '('; pp++)
;
for (pp += 2, np = name; matches && ! (pp[0] == '$' && pp[1] == ')');
pp++)
p.m1 = p.m2 = 0;
if (match_pattern (&p, name, optabs[pindex].pattern))
{
if (*pp != '$')
{
if (*pp != *np++)
break;
}
else
switch (*++pp)
{
case 'N':
force_wider = 1;
break;
case 'I':
force_int = 1;
break;
case 'P':
force_partial_int = 1;
break;
case 'F':
force_float = 1;
break;
case 'Q':
force_fixed = 1;
break;
case 'V':
break;
case 'c':
for (op = 0; op < NUM_RTX_CODE; op++)
{
for (p = GET_RTX_NAME(op), q = np; *p; p++, q++)
if (*p != *q)
break;
/* We have to be concerned about matching "gt" and
missing "gtu", e.g., so verify we have reached the
end of thing we are to match. */
if (*p == 0 && *q == 0
&& (GET_RTX_CLASS (op) == RTX_COMPARE
|| GET_RTX_CLASS (op) == RTX_COMM_COMPARE))
break;
}
if (op == NUM_RTX_CODE)
matches = 0;
else
np += strlen (GET_RTX_NAME(op));
break;
case 'a':
case 'b':
/* This loop will stop at the first prefix match, so
look through the modes in reverse order, in case
there are extra CC modes and CC is a prefix of the
CC modes (as it should be). */
for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
{
for (p = GET_MODE_NAME(i), q = np; *p; p++, q++)
if (TOLOWER (*p) != *q)
break;
if (*p == 0
&& (! force_int || mode_class[i] == MODE_INT
|| mode_class[i] == MODE_VECTOR_INT)
&& (! force_partial_int
|| mode_class[i] == MODE_INT
|| mode_class[i] == MODE_PARTIAL_INT
|| mode_class[i] == MODE_VECTOR_INT)
&& (! force_float
|| mode_class[i] == MODE_FLOAT
|| mode_class[i] == MODE_DECIMAL_FLOAT
|| mode_class[i] == MODE_COMPLEX_FLOAT
|| mode_class[i] == MODE_VECTOR_FLOAT)
&& (! force_fixed
|| mode_class[i] == MODE_FRACT
|| mode_class[i] == MODE_UFRACT
|| mode_class[i] == MODE_ACCUM
|| mode_class[i] == MODE_UACCUM
|| mode_class[i] == MODE_VECTOR_FRACT
|| mode_class[i] == MODE_VECTOR_UFRACT
|| mode_class[i] == MODE_VECTOR_ACCUM
|| mode_class[i] == MODE_VECTOR_UACCUM)
&& (! force_wider
|| *pp == 'a'
|| m1 < i))
break;
}
if (i < 0)
matches = 0;
else if (*pp == 'a')
m1 = i, np += strlen (GET_MODE_NAME(i));
else
m2 = i, np += strlen (GET_MODE_NAME(i));
force_int = force_partial_int = force_float = force_fixed = 0;
break;
default:
gcc_unreachable ();
}
p.op = optabs[pindex].op;
p.sort_num = (p.op << 16) | (p.m2 << 8) | p.m1;
VEC_safe_push (pattern, heap, patterns, &p);
return;
}
if (matches && pp[0] == '$' && pp[1] == ')'
&& *np == 0)
break;
}
if (pindex == ARRAY_SIZE (optabs))
return;
/* We found a match. If this pattern is only conditionally present,
write out the "if" and two extra blanks. */
if (*XSTR (insn, 2) != 0)
printf (" if (HAVE_%s)\n ", name);
printf (" ");
/* Now write out the initialization, making all required substitutions. */
for (pp = optabs[pindex]; *pp; pp++)
{
if (*pp != '$')
putchar (*pp);
else
switch (*++pp)
{
case '(': case ')':
case 'I': case 'F': case 'N':
break;
case 'V':
if (SCALAR_FLOAT_MODE_P (m1))
printf ("v");
break;
case 'a':
for (np = GET_MODE_NAME(m1); *np; np++)
putchar (TOLOWER (*np));
break;
case 'b':
for (np = GET_MODE_NAME(m2); *np; np++)
putchar (TOLOWER (*np));
break;
case 'A':
printf ("%smode", GET_MODE_NAME(m1));
break;
case 'B':
printf ("%smode", GET_MODE_NAME(m2));
break;
case 'c':
printf ("%s", GET_RTX_NAME(op));
break;
case 'C':
for (np = GET_RTX_NAME(op); *np; np++)
putchar (TOUPPER (*np));
break;
}
}
printf (";\n");
}
extern int main (int, char **);
static int
pattern_cmp (const void *va, const void *vb)
{
const pattern *a = (const pattern *)va;
const pattern *b = (const pattern *)vb;
return a->sort_num - b->sort_num;
}
static int
optab_kind_cmp (const void *va, const void *vb)
{
const optab_def *a = (const optab_def *)va;
const optab_def *b = (const optab_def *)vb;
int diff = a->kind - b->kind;
if (diff == 0)
diff = a->op - b->op;
return diff;
}
static int
optab_rcode_cmp (const void *va, const void *vb)
{
const optab_def *a = (const optab_def *)va;
const optab_def *b = (const optab_def *)vb;
return a->rcode - b->rcode;
}
static const char *header_file_name = "init-opinit.h";
static const char *source_file_name = "init-opinit.c";
static bool
handle_arg (const char *arg)
{
switch (arg[1])
{
case 'h':
header_file_name = &arg[2];
return true;
case 'c':
source_file_name = &arg[2];
return true;
default:
return false;
}
}
static FILE *
open_outfile (const char *file_name)
{
FILE *f = fopen (file_name, "w");
if (!f)
fatal ("cannot open file %s: %s", file_name, xstrerror (errno));
fprintf (f,
"/* Generated automatically by the program `genopinit'\n"
" from the machine description file `md'. */\n\n");
return f;
}
int
main (int argc, char **argv)
{
rtx desc;
FILE *h_file, *s_file;
unsigned int i, j, n, last_kind[5];
pattern *p;
progname = "genopinit";
if (!init_rtx_reader_args (argc, argv))
if (NUM_OPTABS > 0xffff || MAX_MACHINE_MODE >= 0xff)
fatal ("genopinit range assumptions invalid");
if (!init_rtx_reader_args_cb (argc, argv, handle_arg))
return (FATAL_EXIT_CODE);
printf ("/* Generated automatically by the program `genopinit'\n\
from the machine description file `md'. */\n\n");
printf ("#include \"config.h\"\n");
printf ("#include \"system.h\"\n");
printf ("#include \"coretypes.h\"\n");
printf ("#include \"tm.h\"\n");
printf ("#include \"rtl.h\"\n");
printf ("#include \"tm_p.h\"\n");
printf ("#include \"flags.h\"\n");
printf ("#include \"insn-config.h\"\n");
printf ("#include \"recog.h\"\n");
printf ("#include \"expr.h\"\n");
printf ("#include \"optabs.h\"\n");
printf ("#include \"reload.h\"\n\n");
printf ("void\ninit_all_optabs (void)\n{\n");
puts ("\
#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
int i, j;\n\
#endif\n");
h_file = open_outfile (header_file_name);
s_file = open_outfile (source_file_name);
/* Read the machine description. */
while (1)
{
int line_no, insn_code_number = 0;
desc = read_md_rtx (&line_no, &insn_code_number);
rtx desc = read_md_rtx (&line_no, &insn_code_number);
if (desc == NULL)
break;
if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
gen_insn (desc);
}
puts ("\
\n\
#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC\n\
/* This flag says the same insns that convert to a signed fixnum\n\
also convert validly to an unsigned one. */\n\
for (i = 0; i < NUM_MACHINE_MODES; i++)\n\
for (j = 0; j < NUM_MACHINE_MODES; j++)\n\
set_convert_optab_handler\n\
(ufixtrunc_optab, (enum machine_mode) i, (enum machine_mode) j,\n\
convert_optab_handler (sfixtrunc_optab, (enum machine_mode) i,\n\
(enum machine_mode) j));\n\
#endif\n\
}");
/* Sort the collected patterns. */
qsort (VEC_address (pattern, patterns), VEC_length (pattern, patterns),
sizeof (pattern), pattern_cmp);
fflush (stdout);
return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
/* Now that we've handled the "extra" patterns, eliminate them from
the optabs array. That way they don't get in the way below. */
n = ARRAY_SIZE (optabs);
for (i = 0; i < n; )
if (optabs[i].base == NULL)
optabs[i] = optabs[--n];
else
++i;
/* Sort the (real) optabs. Better than forcing the optabs.def file to
remain sorted by kind. We also scrogged any real ordering with the
purging of the X patterns above. */
qsort (optabs, n, sizeof(optab_def), optab_kind_cmp);
/* Emit the optab enumeration for the header file. */
fprintf (h_file, "enum optab_tag {\n");
for (i = j = 0; i < n; ++i)
{
optabs[i].op = i;
fprintf (h_file, " %s,\n", optabs[i].name);
if (optabs[i].kind != j)
last_kind[j++] = i - 1;
}
fprintf (h_file, " FIRST_CONV_OPTAB = %s,\n", optabs[last_kind[0]+1].name);
fprintf (h_file, " LAST_CONVLIB_OPTAB = %s,\n", optabs[last_kind[1]].name);
fprintf (h_file, " LAST_CONV_OPTAB = %s,\n", optabs[last_kind[2]].name);
fprintf (h_file, " FIRST_NORM_OPTAB = %s,\n", optabs[last_kind[2]+1].name);
fprintf (h_file, " LAST_NORMLIB_OPTAB = %s,\n", optabs[last_kind[3]].name);
fprintf (h_file, " LAST_NORM_OPTAB = %s\n", optabs[i-1].name);
fprintf (h_file, "};\n\n");
fprintf (h_file, "#define NUM_OPTABS %u\n", n);
fprintf (h_file, "#define NUM_CONVLIB_OPTABS %u\n",
last_kind[1] - last_kind[0]);
fprintf (h_file, "#define NUM_NORMLIB_OPTABS %u\n",
last_kind[3] - last_kind[2]);
fprintf (h_file, "#define NUM_OPTAB_PATTERNS %u\n",
(unsigned) VEC_length (pattern, patterns));
fprintf (s_file,
"#include \"config.h\"\n"
"#include \"system.h\"\n"
"#include \"coretypes.h\"\n"
"#include \"tm.h\"\n"
"#include \"rtl.h\"\n"
"#include \"tm_p.h\"\n"
"#include \"flags.h\"\n"
"#include \"insn-config.h\"\n"
"#include \"expr.h\"\n"
"#include \"optabs.h\"\n"
"\n"
"struct optab_pat {\n"
" unsigned scode;\n"
" enum insn_code icode;\n"
"};\n\n");
fprintf (s_file,
"static const struct optab_pat pats[NUM_OPTAB_PATTERNS] = {\n");
for (i = 0; VEC_iterate (pattern, patterns, i, p); ++i)
fprintf (s_file, " { %#08x, CODE_FOR_%s },\n", p->sort_num, p->name);
fprintf (s_file, "};\n\n");
fprintf (s_file, "void\ninit_all_optabs (void)\n{\n");
fprintf (s_file, " bool *ena = this_target_optabs->pat_enable;\n");
for (i = 0; VEC_iterate (pattern, patterns, i, p); ++i)
fprintf (s_file, " ena[%u] = HAVE_%s;\n", i, p->name);
fprintf (s_file, "}\n\n");
/* Perform a binary search on a pre-encoded optab+mode*2. */
/* ??? Perhaps even better to generate a minimal perfect hash.
Using gperf directly is awkward since it's so geared to working
with strings. Plus we have no visibility into the ordering of
the hash entries, which complicates the pat_enable array. */
fprintf (s_file,
"static int\n"
"lookup_handler (unsigned scode)\n"
"{\n"
" int l = 0, h = ARRAY_SIZE (pats), m;\n"
" while (h > l)\n"
" {\n"
" m = (h + l) / 2;\n"
" if (scode == pats[m].scode)\n"
" return m;\n"
" else if (scode < pats[m].scode)\n"
" h = m;\n"
" else\n"
" l = m + 1;\n"
" }\n"
" return -1;\n"
"}\n\n");
fprintf (s_file,
"enum insn_code\n"
"raw_optab_handler (unsigned scode)\n"
"{\n"
" int i = lookup_handler (scode);\n"
" return (i >= 0 && this_target_optabs->pat_enable[i]\n"
" ? pats[i].icode : CODE_FOR_nothing);\n"
"}\n\n");
fprintf (s_file,
"bool\n"
"swap_optab_enable (optab op, enum machine_mode m, bool set)\n"
"{\n"
" unsigned scode = (op << 16) | m;\n"
" int i = lookup_handler (scode);\n"
" if (i >= 0)\n"
" {\n"
" bool ret = this_target_optabs->pat_enable[i];\n"
" this_target_optabs->pat_enable[i] = set;\n"
" return ret;\n"
" }\n"
" else\n"
" {\n"
" gcc_assert (!set);\n"
" return false;\n"
" }\n"
"}\n\n");
/* C++ (even G++) does not support (non-trivial) designated initializers.
To work around that, generate these arrays programatically rather than
by our traditional multiple inclusion of def files. */
fprintf (s_file,
"const struct convert_optab_libcall_d "
"convlib_def[NUM_CONVLIB_OPTABS] = {\n");
for (i = last_kind[0] + 1; i <= last_kind[1]; ++i)
fprintf (s_file, " { %s, %s },\n", optabs[i].base, optabs[i].libcall);
fprintf (s_file, "};\n\n");
fprintf (s_file,
"const struct optab_libcall_d "
"normlib_def[NUM_NORMLIB_OPTABS] = {\n");
for (i = last_kind[2] + 1; i <= last_kind[3]; ++i)
fprintf (s_file, " { %s, %s, %s },\n",
optabs[i].suffix, optabs[i].base, optabs[i].libcall);
fprintf (s_file, "};\n\n");
fprintf (s_file, "enum rtx_code const optab_to_code_[NUM_OPTABS] = {\n");
for (i = 0; i < n; ++i)
fprintf (s_file, " %s,\n", rtx_upname[optabs[i].fcode]);
fprintf (s_file, "};\n\n");
qsort (optabs, n, sizeof (optab_def), optab_rcode_cmp);
fprintf (s_file, "const optab code_to_optab_[NUM_RTX_CODE] = {\n");
for (j = 0; optabs[j].rcode == UNKNOWN; ++j)
continue;
for (i = 0; i < NON_GENERATOR_NUM_RTX_CODE; ++i)
{
if (j < n && optabs[j].rcode == i)
fprintf (s_file, " %s,\n", optabs[j++].name);
else
fprintf (s_file, " unknown_optab,\n");
}
fprintf (s_file, "};\n\n");
return (fclose (h_file) == 0 && fclose (s_file) == 0
? SUCCESS_EXIT_CODE : FATAL_EXIT_CODE);
}

View File

@ -52,7 +52,7 @@ enum libfunc_index
for normal optabs and conversion optabs. In the first case mode2
is unused. */
struct GTY(()) libfunc_entry {
size_t optab;
optab op;
enum machine_mode mode1, mode2;
rtx libfunc;
};

View File

@ -54,9 +54,6 @@ struct target_libfuncs *this_target_libfuncs = &default_target_libfuncs;
#define libfunc_hash \
(this_target_libfuncs->x_libfunc_hash)
/* Contains the optab used for each rtx code. */
optab code_to_optab_[NUM_RTX_CODE + 1];
static void prepare_float_lib_cmp (rtx, rtx, enum rtx_code, rtx *,
enum machine_mode *);
static rtx expand_unop_direct (enum machine_mode, optab, rtx, rtx, int);
@ -78,9 +75,7 @@ static hashval_t
hash_libfunc (const void *p)
{
const struct libfunc_entry *const e = (const struct libfunc_entry *) p;
return (((int) e->mode1 + (int) e->mode2 * NUM_MACHINE_MODES)
^ e->optab);
return (((int) e->mode1 + (int) e->mode2 * NUM_MACHINE_MODES) ^ e->op);
}
/* Used for libfunc_hash. */
@ -90,10 +85,7 @@ eq_libfunc (const void *p, const void *q)
{
const struct libfunc_entry *const e1 = (const struct libfunc_entry *) p;
const struct libfunc_entry *const e2 = (const struct libfunc_entry *) q;
return (e1->optab == e2->optab
&& e1->mode1 == e2->mode1
&& e1->mode2 == e2->mode2);
return e1->op == e2->op && e1->mode1 == e2->mode1 && e1->mode2 == e2->mode2;
}
/* Return libfunc corresponding operation defined by OPTAB converting
@ -106,22 +98,30 @@ convert_optab_libfunc (convert_optab optab, enum machine_mode mode1,
struct libfunc_entry e;
struct libfunc_entry **slot;
e.optab = (size_t) (optab - &convert_optab_table[0]);
/* ??? This ought to be an assert, but not all of the places
that we expand optabs know about the optabs that got moved
to being direct. */
if (!(optab >= FIRST_CONV_OPTAB && optab <= LAST_CONVLIB_OPTAB))
return NULL_RTX;
e.op = optab;
e.mode1 = mode1;
e.mode2 = mode2;
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, NO_INSERT);
slot = (struct libfunc_entry **)
htab_find_slot (libfunc_hash, &e, NO_INSERT);
if (!slot)
{
if (optab->libcall_gen)
{
optab->libcall_gen (optab, optab->libcall_basename, mode1, mode2);
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, NO_INSERT);
if (slot)
return (*slot)->libfunc;
else
return NULL;
}
return NULL;
const struct convert_optab_libcall_d *d
= &convlib_def[optab - FIRST_CONV_OPTAB];
if (d->libcall_gen == NULL)
return NULL;
d->libcall_gen (optab, d->libcall_basename, mode1, mode2);
slot = (struct libfunc_entry **)
htab_find_slot (libfunc_hash, &e, NO_INSERT);
if (!slot)
return NULL;
}
return (*slot)->libfunc;
}
@ -135,24 +135,30 @@ optab_libfunc (optab optab, enum machine_mode mode)
struct libfunc_entry e;
struct libfunc_entry **slot;
e.optab = (size_t) (optab - &optab_table[0]);
/* ??? This ought to be an assert, but not all of the places
that we expand optabs know about the optabs that got moved
to being direct. */
if (!(optab >= FIRST_NORM_OPTAB && optab <= LAST_NORMLIB_OPTAB))
return NULL_RTX;
e.op = optab;
e.mode1 = mode;
e.mode2 = VOIDmode;
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, NO_INSERT);
slot = (struct libfunc_entry **)
htab_find_slot (libfunc_hash, &e, NO_INSERT);
if (!slot)
{
if (optab->libcall_gen)
{
optab->libcall_gen (optab, optab->libcall_basename,
optab->libcall_suffix, mode);
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash,
&e, NO_INSERT);
if (slot)
return (*slot)->libfunc;
else
return NULL;
}
return NULL;
const struct optab_libcall_d *d
= &normlib_def[optab - FIRST_NORM_OPTAB];
if (d->libcall_gen == NULL)
return NULL;
d->libcall_gen (optab, d->libcall_basename, d->libcall_suffix, mode);
slot = (struct libfunc_entry **)
htab_find_slot (libfunc_hash, &e, NO_INSERT);
if (!slot)
return NULL;
}
return (*slot)->libfunc;
}
@ -2227,7 +2233,7 @@ sign_expand_binop (enum machine_mode mode, optab uoptab, optab soptab,
{
rtx temp;
optab direct_optab = unsignedp ? uoptab : soptab;
struct optab_d wide_soptab;
bool save_enable;
/* Do it without widening, if possible. */
temp = expand_binop (mode, direct_optab, op0, op1, target,
@ -2235,38 +2241,38 @@ sign_expand_binop (enum machine_mode mode, optab uoptab, optab soptab,
if (temp || methods == OPTAB_DIRECT)
return temp;
/* Try widening to a signed int. Make a fake signed optab that
hides any signed insn for direct use. */
wide_soptab = *soptab;
set_optab_handler (&wide_soptab, mode, CODE_FOR_nothing);
/* We don't want to generate new hash table entries from this fake
optab. */
wide_soptab.libcall_gen = NULL;
/* Try widening to a signed int. Disable any direct use of any
signed insn in the current mode. */
save_enable = swap_optab_enable (soptab, mode, false);
temp = expand_binop (mode, &wide_soptab, op0, op1, target,
temp = expand_binop (mode, soptab, op0, op1, target,
unsignedp, OPTAB_WIDEN);
/* For unsigned operands, try widening to an unsigned int. */
if (temp == 0 && unsignedp)
if (!temp && unsignedp)
temp = expand_binop (mode, uoptab, op0, op1, target,
unsignedp, OPTAB_WIDEN);
if (temp || methods == OPTAB_WIDEN)
return temp;
goto egress;
/* Use the right width libcall if that exists. */
temp = expand_binop (mode, direct_optab, op0, op1, target, unsignedp, OPTAB_LIB);
temp = expand_binop (mode, direct_optab, op0, op1, target,
unsignedp, OPTAB_LIB);
if (temp || methods == OPTAB_LIB)
return temp;
goto egress;
/* Must widen and use a libcall, use either signed or unsigned. */
temp = expand_binop (mode, &wide_soptab, op0, op1, target,
temp = expand_binop (mode, soptab, op0, op1, target,
unsignedp, methods);
if (temp != 0)
return temp;
if (unsignedp)
return expand_binop (mode, uoptab, op0, op1, target,
if (!temp && unsignedp)
temp = expand_binop (mode, uoptab, op0, op1, target,
unsignedp, methods);
return 0;
egress:
/* Undo the fiddling above. */
if (save_enable)
swap_optab_enable (soptab, mode, true);
return temp;
}
/* Generate code to perform an operation specified by UNOPPTAB
@ -5415,39 +5421,6 @@ have_insn_for (enum rtx_code code, enum machine_mode mode)
!= CODE_FOR_nothing));
}
/* Set all insn_code fields to CODE_FOR_nothing. */
static void
init_insn_codes (void)
{
memset (optab_table, 0, sizeof (optab_table));
memset (convert_optab_table, 0, sizeof (convert_optab_table));
memset (direct_optab_table, 0, sizeof (direct_optab_table));
}
/* Initialize OP's code to CODE, and write it into the code_to_optab table. */
static inline void
init_optab (optab op, enum rtx_code code)
{
op->code_ = code;
code_to_optab_[(int) code] = op;
}
/* Same, but fill in its code as CODE, and do _not_ write it into
the code_to_optab table. */
static inline void
init_optabv (optab op, enum rtx_code code)
{
op->code_ = code;
}
/* Conversion optabs never go in the code_to_optab table. */
static void
init_convert_optab (convert_optab op, enum rtx_code code)
{
op->code_ = code;
}
/* Initialize the libfunc fields of an entire group of entries in some
optab. Each entry is set equal to a string consisting of a leading
pair of underscores followed by a generic operation name followed by
@ -5463,7 +5436,8 @@ init_convert_optab (convert_optab op, enum rtx_code code)
*/
static void
gen_libfunc (optab optable, const char *opname, int suffix, enum machine_mode mode)
gen_libfunc (optab optable, const char *opname, int suffix,
enum machine_mode mode)
{
unsigned opname_len = strlen (opname);
const char *mname = GET_MODE_NAME (mode);
@ -5497,7 +5471,7 @@ gen_libfunc (optab optable, const char *opname, int suffix, enum machine_mode mo
/* Like gen_libfunc, but verify that integer operation is involved. */
static void
void
gen_int_libfunc (optab optable, const char *opname, char suffix,
enum machine_mode mode)
{
@ -5515,7 +5489,7 @@ gen_int_libfunc (optab optable, const char *opname, char suffix,
/* Like gen_libfunc, but verify that FP and set decimal prefix if needed. */
static void
void
gen_fp_libfunc (optab optable, const char *opname, char suffix,
enum machine_mode mode)
{
@ -5536,7 +5510,7 @@ gen_fp_libfunc (optab optable, const char *opname, char suffix,
/* Like gen_libfunc, but verify that fixed-point operation is involved. */
static void
void
gen_fixed_libfunc (optab optable, const char *opname, char suffix,
enum machine_mode mode)
{
@ -5548,7 +5522,7 @@ gen_fixed_libfunc (optab optable, const char *opname, char suffix,
/* Like gen_libfunc, but verify that signed fixed-point operation is
involved. */
static void
void
gen_signed_fixed_libfunc (optab optable, const char *opname, char suffix,
enum machine_mode mode)
{
@ -5560,7 +5534,7 @@ gen_signed_fixed_libfunc (optab optable, const char *opname, char suffix,
/* Like gen_libfunc, but verify that unsigned fixed-point operation is
involved. */
static void
void
gen_unsigned_fixed_libfunc (optab optable, const char *opname, char suffix,
enum machine_mode mode)
{
@ -5571,7 +5545,7 @@ gen_unsigned_fixed_libfunc (optab optable, const char *opname, char suffix,
/* Like gen_libfunc, but verify that FP or INT operation is involved. */
static void
void
gen_int_fp_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5584,7 +5558,7 @@ gen_int_fp_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that FP or INT operation is involved
and add 'v' suffix for integer operation. */
static void
void
gen_intv_fp_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5604,7 +5578,7 @@ gen_intv_fp_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that FP or INT or FIXED operation is
involved. */
static void
void
gen_int_fp_fixed_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5619,7 +5593,7 @@ gen_int_fp_fixed_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that FP or INT or signed FIXED operation is
involved. */
static void
void
gen_int_fp_signed_fixed_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5634,7 +5608,7 @@ gen_int_fp_signed_fixed_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that INT or FIXED operation is
involved. */
static void
void
gen_int_fixed_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5647,7 +5621,7 @@ gen_int_fixed_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that INT or signed FIXED operation is
involved. */
static void
void
gen_int_signed_fixed_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5660,7 +5634,7 @@ gen_int_signed_fixed_libfunc (optab optable, const char *name, char suffix,
/* Like gen_libfunc, but verify that INT or unsigned FIXED operation is
involved. */
static void
void
gen_int_unsigned_fixed_libfunc (optab optable, const char *name, char suffix,
enum machine_mode mode)
{
@ -5676,7 +5650,7 @@ gen_int_unsigned_fixed_libfunc (optab optable, const char *name, char suffix,
a mode name and an operand count these functions have two mode names
and no operand count. */
static void
void
gen_interclass_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5748,7 +5722,7 @@ gen_interclass_conv_libfunc (convert_optab tab,
/* Same as gen_interclass_conv_libfunc but verify that we are producing
int->fp conversion. */
static void
void
gen_int_to_fp_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5764,7 +5738,7 @@ gen_int_to_fp_conv_libfunc (convert_optab tab,
/* ufloat_optab is special by using floatun for FP and floatuns decimal fp
naming scheme. */
static void
void
gen_ufloat_conv_libfunc (convert_optab tab,
const char *opname ATTRIBUTE_UNUSED,
enum machine_mode tmode,
@ -5779,7 +5753,7 @@ gen_ufloat_conv_libfunc (convert_optab tab,
/* Same as gen_interclass_conv_libfunc but verify that we are producing
fp->int conversion. */
static void
void
gen_int_to_fp_nondecimal_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5795,7 +5769,7 @@ gen_int_to_fp_nondecimal_conv_libfunc (convert_optab tab,
/* Same as gen_interclass_conv_libfunc but verify that we are producing
fp->int conversion with no decimal floating point involved. */
static void
void
gen_fp_to_int_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5812,7 +5786,7 @@ gen_fp_to_int_conv_libfunc (convert_optab tab,
The string formation rules are
similar to the ones for init_libfunc, above. */
static void
void
gen_intraclass_conv_libfunc (convert_optab tab, const char *opname,
enum machine_mode tmode, enum machine_mode fmode)
{
@ -5882,7 +5856,7 @@ gen_intraclass_conv_libfunc (convert_optab tab, const char *opname,
/* Pick proper libcall for trunc_optab. We need to chose if we do
truncation or extension and interclass or intraclass. */
static void
void
gen_trunc_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5911,7 +5885,7 @@ gen_trunc_conv_libfunc (convert_optab tab,
/* Pick proper libcall for extend_optab. We need to chose if we do
truncation or extension and interclass or intraclass. */
static void
void
gen_extend_conv_libfunc (convert_optab tab,
const char *opname ATTRIBUTE_UNUSED,
enum machine_mode tmode,
@ -5940,7 +5914,7 @@ gen_extend_conv_libfunc (convert_optab tab,
/* Pick proper libcall for fract_optab. We need to chose if we do
interclass or intraclass. */
static void
void
gen_fract_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5959,7 +5933,7 @@ gen_fract_conv_libfunc (convert_optab tab,
/* Pick proper libcall for fractuns_optab. */
static void
void
gen_fractuns_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -5980,7 +5954,7 @@ gen_fractuns_conv_libfunc (convert_optab tab,
/* Pick proper libcall for satfract_optab. We need to chose if we do
interclass or intraclass. */
static void
void
gen_satfract_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -6000,7 +5974,7 @@ gen_satfract_conv_libfunc (convert_optab tab,
/* Pick proper libcall for satfractuns_optab. */
static void
void
gen_satfractuns_conv_libfunc (convert_optab tab,
const char *opname,
enum machine_mode tmode,
@ -6101,12 +6075,13 @@ set_user_assembler_libfunc (const char *name, const char *asmspec)
/* Call this to reset the function entry for one optab (OPTABLE) in mode
MODE to NAME, which should be either 0 or a string constant. */
void
set_optab_libfunc (optab optable, enum machine_mode mode, const char *name)
set_optab_libfunc (optab op, enum machine_mode mode, const char *name)
{
rtx val;
struct libfunc_entry e;
struct libfunc_entry **slot;
e.optab = (size_t) (optable - &optab_table[0]);
e.op = op;
e.mode1 = mode;
e.mode2 = VOIDmode;
@ -6117,7 +6092,7 @@ set_optab_libfunc (optab optable, enum machine_mode mode, const char *name)
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, INSERT);
if (*slot == NULL)
*slot = ggc_alloc_libfunc_entry ();
(*slot)->optab = (size_t) (optable - &optab_table[0]);
(*slot)->op = op;
(*slot)->mode1 = mode;
(*slot)->mode2 = VOIDmode;
(*slot)->libfunc = val;
@ -6127,13 +6102,14 @@ set_optab_libfunc (optab optable, enum machine_mode mode, const char *name)
(OPTABLE) from mode FMODE to mode TMODE to NAME, which should be
either 0 or a string constant. */
void
set_conv_libfunc (convert_optab optable, enum machine_mode tmode,
set_conv_libfunc (convert_optab optab, enum machine_mode tmode,
enum machine_mode fmode, const char *name)
{
rtx val;
struct libfunc_entry e;
struct libfunc_entry **slot;
e.optab = (size_t) (optable - &convert_optab_table[0]);
e.op = optab;
e.mode1 = tmode;
e.mode2 = fmode;
@ -6144,7 +6120,7 @@ set_conv_libfunc (convert_optab optable, enum machine_mode tmode,
slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, INSERT);
if (*slot == NULL)
*slot = ggc_alloc_libfunc_entry ();
(*slot)->optab = (size_t) (optable - &convert_optab_table[0]);
(*slot)->op = optab;
(*slot)->mode1 = tmode;
(*slot)->mode2 = fmode;
(*slot)->libfunc = val;
@ -6157,421 +6133,13 @@ void
init_optabs (void)
{
if (libfunc_hash)
{
htab_empty (libfunc_hash);
/* We statically initialize the insn_codes with the equivalent of
CODE_FOR_nothing. Repeat the process if reinitialising. */
init_insn_codes ();
}
htab_empty (libfunc_hash);
else
libfunc_hash = htab_create_ggc (10, hash_libfunc, eq_libfunc, NULL);
init_optab (add_optab, PLUS);
init_optabv (addv_optab, PLUS);
init_optab (sub_optab, MINUS);
init_optabv (subv_optab, MINUS);
init_optab (ssadd_optab, SS_PLUS);
init_optab (usadd_optab, US_PLUS);
init_optab (sssub_optab, SS_MINUS);
init_optab (ussub_optab, US_MINUS);
init_optab (smul_optab, MULT);
init_optab (ssmul_optab, SS_MULT);
init_optab (usmul_optab, US_MULT);
init_optabv (smulv_optab, MULT);
init_optab (smul_highpart_optab, UNKNOWN);
init_optab (umul_highpart_optab, UNKNOWN);
init_optab (smul_widen_optab, UNKNOWN);
init_optab (umul_widen_optab, UNKNOWN);
init_optab (usmul_widen_optab, UNKNOWN);
init_optab (smadd_widen_optab, UNKNOWN);
init_optab (umadd_widen_optab, UNKNOWN);
init_optab (ssmadd_widen_optab, UNKNOWN);
init_optab (usmadd_widen_optab, UNKNOWN);
init_optab (smsub_widen_optab, UNKNOWN);
init_optab (umsub_widen_optab, UNKNOWN);
init_optab (ssmsub_widen_optab, UNKNOWN);
init_optab (usmsub_widen_optab, UNKNOWN);
init_optab (sdiv_optab, DIV);
init_optab (ssdiv_optab, SS_DIV);
init_optab (usdiv_optab, US_DIV);
init_optabv (sdivv_optab, DIV);
init_optab (sdivmod_optab, UNKNOWN);
init_optab (udiv_optab, UDIV);
init_optab (udivmod_optab, UNKNOWN);
init_optab (smod_optab, MOD);
init_optab (umod_optab, UMOD);
init_optab (fmod_optab, UNKNOWN);
init_optab (remainder_optab, UNKNOWN);
init_optab (ftrunc_optab, UNKNOWN);
init_optab (and_optab, AND);
init_optab (ior_optab, IOR);
init_optab (xor_optab, XOR);
init_optab (ashl_optab, ASHIFT);
init_optab (ssashl_optab, SS_ASHIFT);
init_optab (usashl_optab, US_ASHIFT);
init_optab (ashr_optab, ASHIFTRT);
init_optab (lshr_optab, LSHIFTRT);
init_optabv (vashl_optab, ASHIFT);
init_optabv (vashr_optab, ASHIFTRT);
init_optabv (vlshr_optab, LSHIFTRT);
init_optab (rotl_optab, ROTATE);
init_optab (rotr_optab, ROTATERT);
init_optab (smin_optab, SMIN);
init_optab (smax_optab, SMAX);
init_optab (umin_optab, UMIN);
init_optab (umax_optab, UMAX);
init_optab (pow_optab, UNKNOWN);
init_optab (atan2_optab, UNKNOWN);
init_optab (fma_optab, FMA);
init_optab (fms_optab, UNKNOWN);
init_optab (fnma_optab, UNKNOWN);
init_optab (fnms_optab, UNKNOWN);
/* These three have codes assigned exclusively for the sake of
have_insn_for. */
init_optab (mov_optab, SET);
init_optab (movstrict_optab, STRICT_LOW_PART);
init_optab (cbranch_optab, COMPARE);
init_optab (cmov_optab, UNKNOWN);
init_optab (cstore_optab, UNKNOWN);
init_optab (ctrap_optab, UNKNOWN);
init_optab (storent_optab, UNKNOWN);
init_optab (cmp_optab, UNKNOWN);
init_optab (ucmp_optab, UNKNOWN);
init_optab (eq_optab, EQ);
init_optab (ne_optab, NE);
init_optab (gt_optab, GT);
init_optab (ge_optab, GE);
init_optab (lt_optab, LT);
init_optab (le_optab, LE);
init_optab (unord_optab, UNORDERED);
init_optab (neg_optab, NEG);
init_optab (ssneg_optab, SS_NEG);
init_optab (usneg_optab, US_NEG);
init_optabv (negv_optab, NEG);
init_optab (abs_optab, ABS);
init_optabv (absv_optab, ABS);
init_optab (addcc_optab, UNKNOWN);
init_optab (one_cmpl_optab, NOT);
init_optab (bswap_optab, BSWAP);
init_optab (ffs_optab, FFS);
init_optab (clz_optab, CLZ);
init_optab (ctz_optab, CTZ);
init_optab (clrsb_optab, CLRSB);
init_optab (popcount_optab, POPCOUNT);
init_optab (parity_optab, PARITY);
init_optab (sqrt_optab, SQRT);
init_optab (floor_optab, UNKNOWN);
init_optab (ceil_optab, UNKNOWN);
init_optab (round_optab, UNKNOWN);
init_optab (btrunc_optab, UNKNOWN);
init_optab (nearbyint_optab, UNKNOWN);
init_optab (rint_optab, UNKNOWN);
init_optab (sincos_optab, UNKNOWN);
init_optab (sin_optab, UNKNOWN);
init_optab (asin_optab, UNKNOWN);
init_optab (cos_optab, UNKNOWN);
init_optab (acos_optab, UNKNOWN);
init_optab (exp_optab, UNKNOWN);
init_optab (exp10_optab, UNKNOWN);
init_optab (exp2_optab, UNKNOWN);
init_optab (expm1_optab, UNKNOWN);
init_optab (ldexp_optab, UNKNOWN);
init_optab (scalb_optab, UNKNOWN);
init_optab (significand_optab, UNKNOWN);
init_optab (logb_optab, UNKNOWN);
init_optab (ilogb_optab, UNKNOWN);
init_optab (log_optab, UNKNOWN);
init_optab (log10_optab, UNKNOWN);
init_optab (log2_optab, UNKNOWN);
init_optab (log1p_optab, UNKNOWN);
init_optab (tan_optab, UNKNOWN);
init_optab (atan_optab, UNKNOWN);
init_optab (copysign_optab, UNKNOWN);
init_optab (signbit_optab, UNKNOWN);
init_optab (isinf_optab, UNKNOWN);
init_optab (strlen_optab, UNKNOWN);
init_optab (push_optab, UNKNOWN);
init_optab (reduc_smax_optab, UNKNOWN);
init_optab (reduc_umax_optab, UNKNOWN);
init_optab (reduc_smin_optab, UNKNOWN);
init_optab (reduc_umin_optab, UNKNOWN);
init_optab (reduc_splus_optab, UNKNOWN);
init_optab (reduc_uplus_optab, UNKNOWN);
init_optab (ssum_widen_optab, UNKNOWN);
init_optab (usum_widen_optab, UNKNOWN);
init_optab (sdot_prod_optab, UNKNOWN);
init_optab (udot_prod_optab, UNKNOWN);
init_optab (vec_extract_optab, UNKNOWN);
init_optab (vec_set_optab, UNKNOWN);
init_optab (vec_init_optab, UNKNOWN);
init_optab (vec_shl_optab, UNKNOWN);
init_optab (vec_shr_optab, UNKNOWN);
init_optab (vec_realign_load_optab, UNKNOWN);
init_optab (movmisalign_optab, UNKNOWN);
init_optab (vec_widen_umult_hi_optab, UNKNOWN);
init_optab (vec_widen_umult_lo_optab, UNKNOWN);
init_optab (vec_widen_smult_hi_optab, UNKNOWN);
init_optab (vec_widen_smult_lo_optab, UNKNOWN);
init_optab (vec_widen_ushiftl_hi_optab, UNKNOWN);
init_optab (vec_widen_ushiftl_lo_optab, UNKNOWN);
init_optab (vec_widen_sshiftl_hi_optab, UNKNOWN);
init_optab (vec_widen_sshiftl_lo_optab, UNKNOWN);
init_optab (vec_unpacks_hi_optab, UNKNOWN);
init_optab (vec_unpacks_lo_optab, UNKNOWN);
init_optab (vec_unpacku_hi_optab, UNKNOWN);
init_optab (vec_unpacku_lo_optab, UNKNOWN);
init_optab (vec_unpacks_float_hi_optab, UNKNOWN);
init_optab (vec_unpacks_float_lo_optab, UNKNOWN);
init_optab (vec_unpacku_float_hi_optab, UNKNOWN);
init_optab (vec_unpacku_float_lo_optab, UNKNOWN);
init_optab (vec_pack_trunc_optab, UNKNOWN);
init_optab (vec_pack_usat_optab, UNKNOWN);
init_optab (vec_pack_ssat_optab, UNKNOWN);
init_optab (vec_pack_ufix_trunc_optab, UNKNOWN);
init_optab (vec_pack_sfix_trunc_optab, UNKNOWN);
init_optab (powi_optab, UNKNOWN);
/* Conversions. */
init_convert_optab (sext_optab, SIGN_EXTEND);
init_convert_optab (zext_optab, ZERO_EXTEND);
init_convert_optab (trunc_optab, TRUNCATE);
init_convert_optab (sfix_optab, FIX);
init_convert_optab (ufix_optab, UNSIGNED_FIX);
init_convert_optab (sfixtrunc_optab, UNKNOWN);
init_convert_optab (ufixtrunc_optab, UNKNOWN);
init_convert_optab (sfloat_optab, FLOAT);
init_convert_optab (ufloat_optab, UNSIGNED_FLOAT);
init_convert_optab (lrint_optab, UNKNOWN);
init_convert_optab (lround_optab, UNKNOWN);
init_convert_optab (lfloor_optab, UNKNOWN);
init_convert_optab (lceil_optab, UNKNOWN);
init_convert_optab (fract_optab, FRACT_CONVERT);
init_convert_optab (fractuns_optab, UNSIGNED_FRACT_CONVERT);
init_convert_optab (satfract_optab, SAT_FRACT);
init_convert_optab (satfractuns_optab, UNSIGNED_SAT_FRACT);
/* Fill in the optabs with the insns we support. */
init_all_optabs ();
/* Initialize the optabs with the names of the library functions. */
add_optab->libcall_basename = "add";
add_optab->libcall_suffix = '3';
add_optab->libcall_gen = gen_int_fp_fixed_libfunc;
addv_optab->libcall_basename = "add";
addv_optab->libcall_suffix = '3';
addv_optab->libcall_gen = gen_intv_fp_libfunc;
ssadd_optab->libcall_basename = "ssadd";
ssadd_optab->libcall_suffix = '3';
ssadd_optab->libcall_gen = gen_signed_fixed_libfunc;
usadd_optab->libcall_basename = "usadd";
usadd_optab->libcall_suffix = '3';
usadd_optab->libcall_gen = gen_unsigned_fixed_libfunc;
sub_optab->libcall_basename = "sub";
sub_optab->libcall_suffix = '3';
sub_optab->libcall_gen = gen_int_fp_fixed_libfunc;
subv_optab->libcall_basename = "sub";
subv_optab->libcall_suffix = '3';
subv_optab->libcall_gen = gen_intv_fp_libfunc;
sssub_optab->libcall_basename = "sssub";
sssub_optab->libcall_suffix = '3';
sssub_optab->libcall_gen = gen_signed_fixed_libfunc;
ussub_optab->libcall_basename = "ussub";
ussub_optab->libcall_suffix = '3';
ussub_optab->libcall_gen = gen_unsigned_fixed_libfunc;
smul_optab->libcall_basename = "mul";
smul_optab->libcall_suffix = '3';
smul_optab->libcall_gen = gen_int_fp_fixed_libfunc;
smulv_optab->libcall_basename = "mul";
smulv_optab->libcall_suffix = '3';
smulv_optab->libcall_gen = gen_intv_fp_libfunc;
ssmul_optab->libcall_basename = "ssmul";
ssmul_optab->libcall_suffix = '3';
ssmul_optab->libcall_gen = gen_signed_fixed_libfunc;
usmul_optab->libcall_basename = "usmul";
usmul_optab->libcall_suffix = '3';
usmul_optab->libcall_gen = gen_unsigned_fixed_libfunc;
sdiv_optab->libcall_basename = "div";
sdiv_optab->libcall_suffix = '3';
sdiv_optab->libcall_gen = gen_int_fp_signed_fixed_libfunc;
sdivv_optab->libcall_basename = "divv";
sdivv_optab->libcall_suffix = '3';
sdivv_optab->libcall_gen = gen_int_libfunc;
ssdiv_optab->libcall_basename = "ssdiv";
ssdiv_optab->libcall_suffix = '3';
ssdiv_optab->libcall_gen = gen_signed_fixed_libfunc;
udiv_optab->libcall_basename = "udiv";
udiv_optab->libcall_suffix = '3';
udiv_optab->libcall_gen = gen_int_unsigned_fixed_libfunc;
usdiv_optab->libcall_basename = "usdiv";
usdiv_optab->libcall_suffix = '3';
usdiv_optab->libcall_gen = gen_unsigned_fixed_libfunc;
sdivmod_optab->libcall_basename = "divmod";
sdivmod_optab->libcall_suffix = '4';
sdivmod_optab->libcall_gen = gen_int_libfunc;
udivmod_optab->libcall_basename = "udivmod";
udivmod_optab->libcall_suffix = '4';
udivmod_optab->libcall_gen = gen_int_libfunc;
smod_optab->libcall_basename = "mod";
smod_optab->libcall_suffix = '3';
smod_optab->libcall_gen = gen_int_libfunc;
umod_optab->libcall_basename = "umod";
umod_optab->libcall_suffix = '3';
umod_optab->libcall_gen = gen_int_libfunc;
ftrunc_optab->libcall_basename = "ftrunc";
ftrunc_optab->libcall_suffix = '2';
ftrunc_optab->libcall_gen = gen_fp_libfunc;
and_optab->libcall_basename = "and";
and_optab->libcall_suffix = '3';
and_optab->libcall_gen = gen_int_libfunc;
ior_optab->libcall_basename = "ior";
ior_optab->libcall_suffix = '3';
ior_optab->libcall_gen = gen_int_libfunc;
xor_optab->libcall_basename = "xor";
xor_optab->libcall_suffix = '3';
xor_optab->libcall_gen = gen_int_libfunc;
ashl_optab->libcall_basename = "ashl";
ashl_optab->libcall_suffix = '3';
ashl_optab->libcall_gen = gen_int_fixed_libfunc;
ssashl_optab->libcall_basename = "ssashl";
ssashl_optab->libcall_suffix = '3';
ssashl_optab->libcall_gen = gen_signed_fixed_libfunc;
usashl_optab->libcall_basename = "usashl";
usashl_optab->libcall_suffix = '3';
usashl_optab->libcall_gen = gen_unsigned_fixed_libfunc;
ashr_optab->libcall_basename = "ashr";
ashr_optab->libcall_suffix = '3';
ashr_optab->libcall_gen = gen_int_signed_fixed_libfunc;
lshr_optab->libcall_basename = "lshr";
lshr_optab->libcall_suffix = '3';
lshr_optab->libcall_gen = gen_int_unsigned_fixed_libfunc;
smin_optab->libcall_basename = "min";
smin_optab->libcall_suffix = '3';
smin_optab->libcall_gen = gen_int_fp_libfunc;
smax_optab->libcall_basename = "max";
smax_optab->libcall_suffix = '3';
smax_optab->libcall_gen = gen_int_fp_libfunc;
umin_optab->libcall_basename = "umin";
umin_optab->libcall_suffix = '3';
umin_optab->libcall_gen = gen_int_libfunc;
umax_optab->libcall_basename = "umax";
umax_optab->libcall_suffix = '3';
umax_optab->libcall_gen = gen_int_libfunc;
neg_optab->libcall_basename = "neg";
neg_optab->libcall_suffix = '2';
neg_optab->libcall_gen = gen_int_fp_fixed_libfunc;
ssneg_optab->libcall_basename = "ssneg";
ssneg_optab->libcall_suffix = '2';
ssneg_optab->libcall_gen = gen_signed_fixed_libfunc;
usneg_optab->libcall_basename = "usneg";
usneg_optab->libcall_suffix = '2';
usneg_optab->libcall_gen = gen_unsigned_fixed_libfunc;
negv_optab->libcall_basename = "neg";
negv_optab->libcall_suffix = '2';
negv_optab->libcall_gen = gen_intv_fp_libfunc;
one_cmpl_optab->libcall_basename = "one_cmpl";
one_cmpl_optab->libcall_suffix = '2';
one_cmpl_optab->libcall_gen = gen_int_libfunc;
ffs_optab->libcall_basename = "ffs";
ffs_optab->libcall_suffix = '2';
ffs_optab->libcall_gen = gen_int_libfunc;
clz_optab->libcall_basename = "clz";
clz_optab->libcall_suffix = '2';
clz_optab->libcall_gen = gen_int_libfunc;
ctz_optab->libcall_basename = "ctz";
ctz_optab->libcall_suffix = '2';
ctz_optab->libcall_gen = gen_int_libfunc;
clrsb_optab->libcall_basename = "clrsb";
clrsb_optab->libcall_suffix = '2';
clrsb_optab->libcall_gen = gen_int_libfunc;
popcount_optab->libcall_basename = "popcount";
popcount_optab->libcall_suffix = '2';
popcount_optab->libcall_gen = gen_int_libfunc;
parity_optab->libcall_basename = "parity";
parity_optab->libcall_suffix = '2';
parity_optab->libcall_gen = gen_int_libfunc;
/* Comparison libcalls for integers MUST come in pairs,
signed/unsigned. */
cmp_optab->libcall_basename = "cmp";
cmp_optab->libcall_suffix = '2';
cmp_optab->libcall_gen = gen_int_fp_fixed_libfunc;
ucmp_optab->libcall_basename = "ucmp";
ucmp_optab->libcall_suffix = '2';
ucmp_optab->libcall_gen = gen_int_libfunc;
/* EQ etc are floating point only. */
eq_optab->libcall_basename = "eq";
eq_optab->libcall_suffix = '2';
eq_optab->libcall_gen = gen_fp_libfunc;
ne_optab->libcall_basename = "ne";
ne_optab->libcall_suffix = '2';
ne_optab->libcall_gen = gen_fp_libfunc;
gt_optab->libcall_basename = "gt";
gt_optab->libcall_suffix = '2';
gt_optab->libcall_gen = gen_fp_libfunc;
ge_optab->libcall_basename = "ge";
ge_optab->libcall_suffix = '2';
ge_optab->libcall_gen = gen_fp_libfunc;
lt_optab->libcall_basename = "lt";
lt_optab->libcall_suffix = '2';
lt_optab->libcall_gen = gen_fp_libfunc;
le_optab->libcall_basename = "le";
le_optab->libcall_suffix = '2';
le_optab->libcall_gen = gen_fp_libfunc;
unord_optab->libcall_basename = "unord";
unord_optab->libcall_suffix = '2';
unord_optab->libcall_gen = gen_fp_libfunc;
powi_optab->libcall_basename = "powi";
powi_optab->libcall_suffix = '2';
powi_optab->libcall_gen = gen_fp_libfunc;
/* Conversions. */
sfloat_optab->libcall_basename = "float";
sfloat_optab->libcall_gen = gen_int_to_fp_conv_libfunc;
ufloat_optab->libcall_gen = gen_ufloat_conv_libfunc;
sfix_optab->libcall_basename = "fix";
sfix_optab->libcall_gen = gen_fp_to_int_conv_libfunc;
ufix_optab->libcall_basename = "fixuns";
ufix_optab->libcall_gen = gen_fp_to_int_conv_libfunc;
lrint_optab->libcall_basename = "lrint";
lrint_optab->libcall_gen = gen_int_to_fp_nondecimal_conv_libfunc;
lround_optab->libcall_basename = "lround";
lround_optab->libcall_gen = gen_int_to_fp_nondecimal_conv_libfunc;
lfloor_optab->libcall_basename = "lfloor";
lfloor_optab->libcall_gen = gen_int_to_fp_nondecimal_conv_libfunc;
lceil_optab->libcall_basename = "lceil";
lceil_optab->libcall_gen = gen_int_to_fp_nondecimal_conv_libfunc;
/* trunc_optab is also used for FLOAT_EXTEND. */
sext_optab->libcall_basename = "extend";
sext_optab->libcall_gen = gen_extend_conv_libfunc;
trunc_optab->libcall_basename = "trunc";
trunc_optab->libcall_gen = gen_trunc_conv_libfunc;
/* Conversions for fixed-point modes and other modes. */
fract_optab->libcall_basename = "fract";
fract_optab->libcall_gen = gen_fract_conv_libfunc;
satfract_optab->libcall_basename = "satfract";
satfract_optab->libcall_gen = gen_satfract_conv_libfunc;
fractuns_optab->libcall_basename = "fractuns";
fractuns_optab->libcall_gen = gen_fractuns_conv_libfunc;
satfractuns_optab->libcall_basename = "satfractuns";
satfractuns_optab->libcall_gen = gen_satfractuns_conv_libfunc;
/* The ffs function operates on `int'. Fall back on it if we do not
have a libgcc2 function for that width. */
if (INT_TYPE_SIZE < BITS_PER_WORD)
@ -6594,7 +6162,8 @@ init_optabs (void)
/* Use cabs for double complex abs, since systems generally have cabs.
Don't define any libcall for float complex, so that cabs will be used. */
if (complex_double_type_node)
set_optab_libfunc (abs_optab, TYPE_MODE (complex_double_type_node), "cabs");
set_optab_libfunc (abs_optab, TYPE_MODE (complex_double_type_node),
"cabs");
abort_libfunc = init_one_libfunc ("abort");
memcpy_libfunc = init_one_libfunc ("memcpy");
@ -6686,45 +6255,35 @@ init_sync_libfuncs (int max)
DEBUG_FUNCTION void
debug_optab_libfuncs (void)
{
int i;
int j;
int k;
int i, j, k;
/* Dump the arithmetic optabs. */
for (i = 0; i != (int) OTI_MAX; i++)
for (i = FIRST_NORM_OPTAB; i <= LAST_NORMLIB_OPTAB; ++i)
for (j = 0; j < NUM_MACHINE_MODES; ++j)
{
optab o;
rtx l;
o = &optab_table[i];
l = optab_libfunc (o, (enum machine_mode) j);
rtx l = optab_libfunc ((optab) i, (enum machine_mode) j);
if (l)
{
gcc_assert (GET_CODE (l) == SYMBOL_REF);
fprintf (stderr, "%s\t%s:\t%s\n",
GET_RTX_NAME (optab_to_code (o)),
GET_RTX_NAME (optab_to_code ((optab) i)),
GET_MODE_NAME (j),
XSTR (l, 0));
}
}
/* Dump the conversion optabs. */
for (i = 0; i < (int) COI_MAX; ++i)
for (i = FIRST_CONV_OPTAB; i <= LAST_CONVLIB_OPTAB; ++i)
for (j = 0; j < NUM_MACHINE_MODES; ++j)
for (k = 0; k < NUM_MACHINE_MODES; ++k)
{
convert_optab o;
rtx l;
o = &convert_optab_table[i];
l = convert_optab_libfunc (o, (enum machine_mode) j,
(enum machine_mode) k);
rtx l = convert_optab_libfunc ((optab) i, (enum machine_mode) j,
(enum machine_mode) k);
if (l)
{
gcc_assert (GET_CODE (l) == SYMBOL_REF);
fprintf (stderr, "%s\t%s\t%s:\t%s\n",
GET_RTX_NAME (optab_to_code (o)),
GET_RTX_NAME (optab_to_code ((optab) i)),
GET_MODE_NAME (j),
GET_MODE_NAME (k),
XSTR (l, 0));

308
gcc/optabs.def Normal file
View File

@ -0,0 +1,308 @@
/* Definitions for operation tables, or "optabs".
Copyright (C) 1987-2012 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the 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 COPYING3. If not see
<http://www.gnu.org/licenses/>. */
/* Entries here are categorized C, D, N, V. See genopinit.c for details
on the meaning of the categories and for the pattern dollar codes. */
/* The extension libcalls are used for float extension. */
OPTAB_CL(sext_optab, "extend$b$a2", SIGN_EXTEND, "extend", gen_extend_conv_libfunc)
OPTAB_CL(trunc_optab, "trunc$b$a2", TRUNCATE, "trunc", gen_trunc_conv_libfunc)
OPTAB_CL(zext_optab, "zero_extend$b$a2", ZERO_EXTEND, NULL, NULL)
OPTAB_CL(sfix_optab, "fix$F$b$I$a2", FIX, "fix", gen_fp_to_int_conv_libfunc)
OPTAB_CL(ufix_optab, "fixuns$F$b$a2", UNSIGNED_FIX, "fixuns", gen_fp_to_int_conv_libfunc)
OPTAB_CL(sfloat_optab, "float$I$b$F$a2", FLOAT, "float", gen_int_to_fp_conv_libfunc)
OPTAB_CL(ufloat_optab, "floatuns$I$b$F$a2", UNSIGNED_FLOAT, NULL, gen_ufloat_conv_libfunc)
OPTAB_CL(lrint_optab, "lrint$F$b$I$a2", UNKNOWN, "lrint", gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lround_optab, "lround$F$b$I$a2", UNKNOWN, "lround", gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lfloor_optab, "lfloor$F$b$I$a2", UNKNOWN, "lfloor", gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lceil_optab, "lceil$F$b$I$a2", UNKNOWN, "lceil", gen_int_to_fp_nondecimal_conv_libfunc)
/* Conversions for fixed-point modes and other modes. */
OPTAB_CL(fract_optab, "fract$b$a2", FRACT_CONVERT, "fract", gen_fract_conv_libfunc)
OPTAB_CL(fractuns_optab, "fractuns$I$b$Q$a2", UNSIGNED_FRACT_CONVERT, "fractuns", gen_fractuns_conv_libfunc)
OPTAB_CX(fractuns_optab, "fractuns$Q$b$I$a2")
OPTAB_CL(satfract_optab, "satfract$b$Q$a2", SAT_FRACT, "satfract", gen_satfract_conv_libfunc)
OPTAB_CL(satfractuns_optab, "satfractuns$I$b$Q$a2", UNSIGNED_SAT_FRACT, "satfractuns", gen_satfractuns_conv_libfunc)
OPTAB_CD(sfixtrunc_optab, "fix_trunc$F$b$I$a2")
OPTAB_CD(ufixtrunc_optab, "fixuns_trunc$F$b$I$a2")
/* Misc optabs that use two modes; model them as "conversions". */
OPTAB_CD(smul_widen_optab, "mul$b$a3")
OPTAB_CD(umul_widen_optab, "umul$b$a3")
OPTAB_CD(usmul_widen_optab, "usmul$b$a3")
OPTAB_CD(smadd_widen_optab, "madd$b$a4")
OPTAB_CD(umadd_widen_optab, "umadd$b$a4")
OPTAB_CD(ssmadd_widen_optab, "ssmadd$b$a4")
OPTAB_CD(usmadd_widen_optab, "usmadd$b$a4")
OPTAB_CD(smsub_widen_optab, "msub$b$a4")
OPTAB_CD(umsub_widen_optab, "umsub$b$a4")
OPTAB_CD(ssmsub_widen_optab, "ssmsub$b$a4")
OPTAB_CD(usmsub_widen_optab, "usmsub$a$b4")
OPTAB_CD(vec_load_lanes_optab, "vec_load_lanes$a$b")
OPTAB_CD(vec_store_lanes_optab, "vec_store_lanes$a$b")
OPTAB_CD(vcond_optab, "vcond$a$b")
OPTAB_CD(vcondu_optab, "vcondu$a$b")
OPTAB_NL(add_optab, "add$P$a3", PLUS, "add", '3', gen_int_fp_fixed_libfunc)
OPTAB_NX(add_optab, "add$F$a3")
OPTAB_NX(add_optab, "add$Q$a3")
OPTAB_VL(addv_optab, "addv$I$a3", PLUS, "add", '3', gen_intv_fp_libfunc)
OPTAB_VX(addv_optab, "add$F$a3")
OPTAB_NL(ssadd_optab, "ssadd$Q$a3", SS_PLUS, "ssadd", '3', gen_signed_fixed_libfunc)
OPTAB_NL(usadd_optab, "usadd$Q$a3", US_PLUS, "usadd", '3', gen_unsigned_fixed_libfunc)
OPTAB_NL(sub_optab, "sub$P$a3", MINUS, "sub", '3', gen_int_fp_fixed_libfunc)
OPTAB_NX(sub_optab, "sub$F$a3")
OPTAB_NX(sub_optab, "sub$Q$a3")
OPTAB_VL(subv_optab, "subv$I$a3", MINUS, "sub", '3', gen_intv_fp_libfunc)
OPTAB_VX(subv_optab, "sub$F$a3")
OPTAB_NL(sssub_optab, "sssub$Q$a3", SS_MINUS, "sssub", '3', gen_signed_fixed_libfunc)
OPTAB_NL(ussub_optab, "ussub$Q$a3", US_MINUS, "ussub", '3', gen_unsigned_fixed_libfunc)
OPTAB_NL(smul_optab, "mul$Q$a3", MULT, "mul", '3', gen_int_fp_fixed_libfunc)
OPTAB_NX(smul_optab, "mul$P$a3")
OPTAB_NX(smul_optab, "mul$F$a3")
OPTAB_VL(smulv_optab, "mulv$I$a3", MULT, "mul", '3', gen_intv_fp_libfunc)
OPTAB_VX(smulv_optab, "mul$F$a3")
OPTAB_NL(ssmul_optab, "ssmul$Q$a3", SS_MULT, "ssmul", '3', gen_signed_fixed_libfunc)
OPTAB_NL(usmul_optab, "usmul$Q$a3", US_MULT, "usmul", '3', gen_unsigned_fixed_libfunc)
OPTAB_NL(sdiv_optab, "div$a3", DIV, "div", '3', gen_int_fp_signed_fixed_libfunc)
OPTAB_VL(sdivv_optab, "divv$I$a3", DIV, "divv", '3', gen_int_libfunc)
OPTAB_VX(sdivv_optab, "div$F$a3")
OPTAB_NL(ssdiv_optab, "ssdiv$Q$a3", SS_DIV, "ssdiv", '3', gen_signed_fixed_libfunc)
OPTAB_NL(udiv_optab, "udiv$I$a3", UDIV, "udiv", '3', gen_int_unsigned_fixed_libfunc)
OPTAB_NX(udiv_optab, "udiv$Q$a3")
OPTAB_NL(usdiv_optab, "usdiv$Q$a3", US_DIV, "usdiv", '3', gen_unsigned_fixed_libfunc)
OPTAB_NL(sdivmod_optab, "divmod$a4", UNKNOWN, "divmod", '4', gen_int_libfunc)
OPTAB_NL(udivmod_optab, "udivmod$a4", UNKNOWN, "udivmod", '4', gen_int_libfunc)
OPTAB_NL(smod_optab, "mod$a3", MOD, "mod", '3', gen_int_libfunc)
OPTAB_NL(umod_optab, "umod$a3", UMOD, "umod", '3', gen_int_libfunc)
OPTAB_NL(ftrunc_optab, "ftrunc$F$a2", UNKNOWN, "ftrunc", '2', gen_fp_libfunc)
OPTAB_NL(and_optab, "and$a3", AND, "and", '3', gen_int_libfunc)
OPTAB_NL(ior_optab, "ior$a3", IOR, "ior", '3', gen_int_libfunc)
OPTAB_NL(xor_optab, "xor$a3", XOR, "xor", '3', gen_int_libfunc)
OPTAB_NL(ashl_optab, "ashl$a3", ASHIFT, "ashl", '3', gen_int_fixed_libfunc)
OPTAB_NL(ssashl_optab, "ssashl$Q$a3", SS_ASHIFT, "ssashl", '3', gen_signed_fixed_libfunc)
OPTAB_NL(usashl_optab, "usashl$Q$a3", US_ASHIFT, "usashl", '3', gen_unsigned_fixed_libfunc)
OPTAB_NL(ashr_optab, "ashr$a3", ASHIFTRT, "ashr", '3', gen_int_signed_fixed_libfunc)
OPTAB_NL(lshr_optab, "lshr$a3", LSHIFTRT, "lshr", '3', gen_int_unsigned_fixed_libfunc)
OPTAB_NC(rotl_optab, "rotl$a3", ROTATE)
OPTAB_NC(rotr_optab, "rotr$a3", ROTATERT)
OPTAB_VC(vashl_optab, "vashl$a3", ASHIFT)
OPTAB_VC(vashr_optab, "vashr$a3", ASHIFTRT)
OPTAB_VC(vlshr_optab, "vlshr$a3", LSHIFTRT)
OPTAB_VC(vrotl_optab, "vrotl$a3", ROTATE)
OPTAB_VC(vrotr_optab, "vrotr$a3", ROTATERT)
OPTAB_NL(smin_optab, "smin$a3", SMIN, "min", '3', gen_int_fp_libfunc)
OPTAB_NL(smax_optab, "smax$a3", SMAX, "max", '3', gen_int_fp_libfunc)
OPTAB_NL(umin_optab, "umin$I$a3", UMIN, "umin", '3', gen_int_libfunc)
OPTAB_NL(umax_optab, "umax$I$a3", UMAX, "umax", '3', gen_int_libfunc)
OPTAB_NL(neg_optab, "neg$P$a2", NEG, "neg", '2', gen_int_fp_fixed_libfunc)
OPTAB_NX(neg_optab, "neg$F$a2")
OPTAB_NX(neg_optab, "neg$Q$a2")
OPTAB_VL(negv_optab, "negv$I$a2", NEG, "neg", '2', gen_intv_fp_libfunc)
OPTAB_VX(negv_optab, "neg$F$a2")
OPTAB_NL(ssneg_optab, "ssneg$Q$a2", SS_NEG, "ssneg", '2', gen_signed_fixed_libfunc)
OPTAB_NL(usneg_optab, "usneg$Q$a2", US_NEG, "usneg", '2', gen_unsigned_fixed_libfunc)
OPTAB_NC(abs_optab, "abs$P$a2", ABS)
OPTAB_NX(abs_optab, "abs$F$a2")
OPTAB_VC(absv_optab, "absv$I$a2", ABS)
OPTAB_VX(absv_optab, "abs$F$a2")
OPTAB_NL(one_cmpl_optab, "one_cmpl$a2", NOT, "one_cmpl", '2', gen_int_libfunc)
OPTAB_NC(bswap_optab, "bswap$a2", BSWAP)
OPTAB_NL(ffs_optab, "ffs$a2", FFS, "ffs", '2', gen_int_libfunc)
OPTAB_NL(clz_optab, "clz$a2", CLZ, "clz", '2', gen_int_libfunc)
OPTAB_NL(ctz_optab, "ctz$a2", CTZ, "ctz", '2', gen_int_libfunc)
OPTAB_NL(clrsb_optab, "clrsb$a2", CLRSB, "clrsb", '2', gen_int_libfunc)
OPTAB_NL(popcount_optab, "popcount$a2", POPCOUNT, "popcount", '2', gen_int_libfunc)
OPTAB_NL(parity_optab, "parity$a2", PARITY, "parity", '2', gen_int_libfunc)
/* Comparison libcalls for integers MUST come in pairs, signed/unsigned. */
OPTAB_NL(cmp_optab, NULL, UNKNOWN, "cmp", '2', gen_int_fp_fixed_libfunc)
OPTAB_NL(ucmp_optab, NULL, UNKNOWN, "ucmp", '2', gen_int_libfunc)
/* EQ etc are floating point comparisons. */
OPTAB_NL(eq_optab, NULL, EQ, "eq", '2', gen_fp_libfunc)
OPTAB_NL(ne_optab, NULL, NE, "ne", '2', gen_fp_libfunc)
OPTAB_NL(gt_optab, NULL, GT, "gt", '2', gen_fp_libfunc)
OPTAB_NL(ge_optab, NULL, GE, "ge", '2', gen_fp_libfunc)
OPTAB_NL(lt_optab, NULL, LT, "lt", '2', gen_fp_libfunc)
OPTAB_NL(le_optab, NULL, LE, "le", '2', gen_fp_libfunc)
OPTAB_NL(unord_optab, NULL, UNORDERED, "unord", '2', gen_fp_libfunc)
OPTAB_NL(powi_optab, NULL, UNKNOWN, "powi", '2', gen_fp_libfunc)
/* These are all initialized individually, on a per-host basis. */
OPTAB_NC(sqrt_optab, "sqrt$a2", SQRT)
OPTAB_NC(sync_old_add_optab, "sync_old_add$I$a", UNKNOWN)
OPTAB_NC(sync_old_sub_optab, "sync_old_sub$I$a", UNKNOWN)
OPTAB_NC(sync_old_ior_optab, "sync_old_ior$I$a", UNKNOWN)
OPTAB_NC(sync_old_and_optab, "sync_old_and$I$a", UNKNOWN)
OPTAB_NC(sync_old_xor_optab, "sync_old_xor$I$a", UNKNOWN)
OPTAB_NC(sync_old_nand_optab, "sync_old_nand$I$a", UNKNOWN)
OPTAB_NC(sync_new_add_optab, "sync_new_add$I$a", UNKNOWN)
OPTAB_NC(sync_new_sub_optab, "sync_new_sub$I$a", UNKNOWN)
OPTAB_NC(sync_new_ior_optab, "sync_new_ior$I$a", UNKNOWN)
OPTAB_NC(sync_new_and_optab, "sync_new_and$I$a", UNKNOWN)
OPTAB_NC(sync_new_xor_optab, "sync_new_xor$I$a", UNKNOWN)
OPTAB_NC(sync_new_nand_optab, "sync_new_nand$I$a", UNKNOWN)
OPTAB_NC(sync_compare_and_swap_optab, "sync_compare_and_swap$I$a", UNKNOWN)
OPTAB_NC(sync_lock_test_and_set_optab, "sync_lock_test_and_set$I$a", UNKNOWN)
OPTAB_DC(mov_optab, "mov$a", SET)
OPTAB_DC(movstrict_optab, "movstrict$a", STRICT_LOW_PART)
OPTAB_D (movmisalign_optab, "movmisalign$a")
OPTAB_D (storent_optab, "storent$a")
OPTAB_D (push_optab, "push$a1")
OPTAB_D (reload_in_optab, "reload_in$a")
OPTAB_D (reload_out_optab, "reload_out$a")
OPTAB_DC(cbranch_optab, "cbranch$a4", COMPARE)
OPTAB_D (addcc_optab, "add$acc")
OPTAB_D (movcc_optab, "mov$acc")
OPTAB_D (cmov_optab, "cmov$a6")
OPTAB_D (cstore_optab, "cstore$a4")
OPTAB_D (ctrap_optab, "ctrap$a4")
OPTAB_D (smul_highpart_optab, "smul$a3_highpart")
OPTAB_D (umul_highpart_optab, "umul$a3_highpart")
OPTAB_D (cmpmem_optab, "cmpmem$a")
OPTAB_D (cmpstr_optab, "cmpstr$a")
OPTAB_D (cmpstrn_optab, "cmpstrn$a")
OPTAB_D (movmem_optab, "movmem$a")
OPTAB_D (setmem_optab, "setmem$a")
OPTAB_D (strlen_optab, "strlen$a")
OPTAB_DC(fma_optab, "fma$a4", FMA)
OPTAB_D (fms_optab, "fms$a4")
OPTAB_D (fnma_optab, "fnma$a4")
OPTAB_D (fnms_optab, "fnms$a4")
OPTAB_D (rint_optab, "rint$a2")
OPTAB_D (round_optab, "round$a2")
OPTAB_D (floor_optab, "floor$a2")
OPTAB_D (ceil_optab, "ceil$a2")
OPTAB_D (btrunc_optab, "btrunc$a2")
OPTAB_D (nearbyint_optab, "nearbyint$a2")
OPTAB_D (acos_optab, "acos$a2")
OPTAB_D (asin_optab, "asin$a2")
OPTAB_D (atan2_optab, "atan2$a3")
OPTAB_D (atan_optab, "atan$a2")
OPTAB_D (copysign_optab, "copysign$F$a3")
OPTAB_D (cos_optab, "cos$a2")
OPTAB_D (exp10_optab, "exp10$a2")
OPTAB_D (exp2_optab, "exp2$a2")
OPTAB_D (exp_optab, "exp$a2")
OPTAB_D (expm1_optab, "expm1$a2")
OPTAB_D (fmod_optab, "fmod$a3")
OPTAB_D (ilogb_optab, "ilogb$a2")
OPTAB_D (isinf_optab, "isinf$a2")
OPTAB_D (ldexp_optab, "ldexp$a3")
OPTAB_D (log10_optab, "log10$a2")
OPTAB_D (log1p_optab, "log1p$a2")
OPTAB_D (log2_optab, "log2$a2")
OPTAB_D (log_optab, "log$a2")
OPTAB_D (logb_optab, "logb$a2")
OPTAB_D (pow_optab, "pow$a3")
OPTAB_D (remainder_optab, "remainder$a3")
OPTAB_D (scalb_optab, "scalb$a3")
OPTAB_D (signbit_optab, "signbit$F$a2")
OPTAB_D (significand_optab, "significand$a2")
OPTAB_D (sin_optab, "sin$a2")
OPTAB_D (sincos_optab, "sincos$a3")
OPTAB_D (tan_optab, "tan$a2")
OPTAB_D (reduc_smax_optab, "reduc_smax_$a")
OPTAB_D (reduc_smin_optab, "reduc_smin_$a")
OPTAB_D (reduc_splus_optab, "reduc_splus_$a")
OPTAB_D (reduc_umax_optab, "reduc_umax_$a")
OPTAB_D (reduc_umin_optab, "reduc_umin_$a")
OPTAB_D (reduc_uplus_optab, "reduc_uplus_$a")
OPTAB_D (sdot_prod_optab, "sdot_prod$I$a")
OPTAB_D (ssum_widen_optab, "widen_ssum$I$a3")
OPTAB_D (udot_prod_optab, "udot_prod$I$a")
OPTAB_D (usum_widen_optab, "widen_usum$I$a3")
OPTAB_D (vec_extract_optab, "vec_extract$a")
OPTAB_D (vec_init_optab, "vec_init$a")
OPTAB_D (vec_pack_sfix_trunc_optab, "vec_pack_sfix_trunc_$a")
OPTAB_D (vec_pack_ssat_optab, "vec_pack_ssat_$a")
OPTAB_D (vec_pack_trunc_optab, "vec_pack_trunc_$a")
OPTAB_D (vec_pack_ufix_trunc_optab, "vec_pack_ufix_trunc_$a")
OPTAB_D (vec_pack_usat_optab, "vec_pack_usat_$a")
OPTAB_D (vec_perm_const_optab, "vec_perm_const$a")
OPTAB_D (vec_perm_optab, "vec_perm$a")
OPTAB_D (vec_realign_load_optab, "vec_realign_load_$a")
OPTAB_D (vec_set_optab, "vec_set$a")
OPTAB_D (vec_shl_optab, "vec_shl_$a")
OPTAB_D (vec_shr_optab, "vec_shr_$a")
OPTAB_D (vec_unpacks_float_hi_optab, "vec_unpacks_float_hi_$a")
OPTAB_D (vec_unpacks_float_lo_optab, "vec_unpacks_float_lo_$a")
OPTAB_D (vec_unpacks_hi_optab, "vec_unpacks_hi_$a")
OPTAB_D (vec_unpacks_lo_optab, "vec_unpacks_lo_$a")
OPTAB_D (vec_unpacku_float_hi_optab, "vec_unpacku_float_hi_$a")
OPTAB_D (vec_unpacku_float_lo_optab, "vec_unpacku_float_lo_$a")
OPTAB_D (vec_unpacku_hi_optab, "vec_unpacku_hi_$a")
OPTAB_D (vec_unpacku_lo_optab, "vec_unpacku_lo_$a")
OPTAB_D (vec_widen_smult_even_optab, "vec_widen_smult_even_$a")
OPTAB_D (vec_widen_smult_hi_optab, "vec_widen_smult_hi_$a")
OPTAB_D (vec_widen_smult_lo_optab, "vec_widen_smult_lo_$a")
OPTAB_D (vec_widen_smult_odd_optab, "vec_widen_smult_odd_$a")
OPTAB_D (vec_widen_sshiftl_hi_optab, "vec_widen_sshiftl_hi_$a")
OPTAB_D (vec_widen_sshiftl_lo_optab, "vec_widen_sshiftl_lo_$a")
OPTAB_D (vec_widen_umult_even_optab, "vec_widen_umult_even_$a")
OPTAB_D (vec_widen_umult_hi_optab, "vec_widen_umult_hi_$a")
OPTAB_D (vec_widen_umult_lo_optab, "vec_widen_umult_lo_$a")
OPTAB_D (vec_widen_umult_odd_optab, "vec_widen_umult_odd_$a")
OPTAB_D (vec_widen_ushiftl_hi_optab, "vec_widen_ushiftl_hi_$a")
OPTAB_D (vec_widen_ushiftl_lo_optab, "vec_widen_ushiftl_lo_$a")
OPTAB_D (sync_add_optab, "sync_add$I$a")
OPTAB_D (sync_and_optab, "sync_and$I$a")
OPTAB_D (sync_ior_optab, "sync_ior$I$a")
OPTAB_D (sync_lock_release_optab, "sync_lock_release$I$a")
OPTAB_D (sync_nand_optab, "sync_nand$I$a")
OPTAB_D (sync_sub_optab, "sync_sub$I$a")
OPTAB_D (sync_xor_optab, "sync_xor$I$a")
OPTAB_D (atomic_add_fetch_optab, "atomic_add_fetch$I$a")
OPTAB_D (atomic_add_optab, "atomic_add$I$a")
OPTAB_D (atomic_and_fetch_optab, "atomic_and_fetch$I$a")
OPTAB_D (atomic_and_optab, "atomic_and$I$a")
OPTAB_D (atomic_compare_and_swap_optab, "atomic_compare_and_swap$I$a")
OPTAB_D (atomic_exchange_optab, "atomic_exchange$I$a")
OPTAB_D (atomic_fetch_add_optab, "atomic_fetch_add$I$a")
OPTAB_D (atomic_fetch_and_optab, "atomic_fetch_and$I$a")
OPTAB_D (atomic_fetch_nand_optab, "atomic_fetch_nand$I$a")
OPTAB_D (atomic_fetch_or_optab, "atomic_fetch_or$I$a")
OPTAB_D (atomic_fetch_sub_optab, "atomic_fetch_sub$I$a")
OPTAB_D (atomic_fetch_xor_optab, "atomic_fetch_xor$I$a")
OPTAB_D (atomic_load_optab, "atomic_load$I$a")
OPTAB_D (atomic_nand_fetch_optab, "atomic_nand_fetch$I$a")
OPTAB_D (atomic_nand_optab, "atomic_nand$I$a")
OPTAB_D (atomic_or_fetch_optab, "atomic_or_fetch$I$a")
OPTAB_D (atomic_or_optab, "atomic_or$I$a")
OPTAB_D (atomic_store_optab, "atomic_store$I$a")
OPTAB_D (atomic_sub_fetch_optab, "atomic_sub_fetch$I$a")
OPTAB_D (atomic_sub_optab, "atomic_sub$I$a")
OPTAB_D (atomic_xor_fetch_optab, "atomic_xor_fetch$I$a")
OPTAB_D (atomic_xor_optab, "atomic_xor$I$a")

File diff suppressed because it is too large Load Diff

View File

@ -55,8 +55,13 @@ enum rtx_code {
NUM_RTX_CODE.
Assumes default enum value assignment. */
/* The cast here, saves many elsewhere. */
#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
/* The cast here, saves many elsewhere. */
/* Similar, but since generator files get more entries... */
#ifdef GENERATOR_FILE
# define NON_GENERATOR_NUM_RTX_CODE ((int) MATCH_OPERAND)
#endif
/* Register Transfer Language EXPRESSIONS CODE CLASSES */