Commit 8c94f366 by Zack Weinberg Committed by Zack Weinberg

r110127@banpei: zack | 2006-01-22 14:49:27 -0800

 r110127@banpei:  zack | 2006-01-22 14:49:27 -0800
 	* genattrtab.c: Don't include genattrtab.h.  Define ATTR_NONE
 	and ATTR_SPECIAL (from genattrtab.h).  Don't define num_dfa_decls
 	nor any of the random handful of variables that used to be necessary
 	when this program was linked with rtlanal.o.  Prune set of forward
 	function declarations.
 	(struct attr_desc): Remove static_p field.
 	(hash_obstack, temp_obstack, attr_hash_table, attr_printf)
 	(check_attr_test, make_internal_attr, make_numeric_value): Make static.
 	(attr_string): Do not read the character one past the length of
 	the string.
 	(write_attr_get, find_attr, make_internal_attr): Don't touch static_p.
 	(struct insn_reserv, all_insn_reservs, last_insn_reserv_p)
 	(n_insn_reservs, gen_insn_reserv, struct bypass_list, all_bypasses)
 	(n_bypasses, gen_bypass_1, gen_bypass, process_bypasses)
 	(make_automaton_attrs): New.
 	(main): Do not call into genautomata.  Call local gen_bypass
 	and gen_insn_reserv as appropriate.  Call make_automaton_attrs.
 	Remove special case for insn_alts.
 	* genautomata.c: Include gensupport.h; not genattrtab.h nor
 	varray.h (leftover from previous change).  Prune set of forward
 	function declarations.  Remove state_alts fields from all
 	structures.  Remove state_alts_table from struct automaton.
 	Make everything except main static.  Do not maintain num_dfa_decls.
 	Do not maintain state_alts fields of various structures.
 	(process_decls): Don't validate condexp for dm_insn_reserv decls.
 	(add_arc): Remove state_alts argument.  All callers updated.
 	(output_reserved_units_table): Emit #ifdef here...
 	(output_tables): ...not here.  Don't generate state_alts tables.
 	(expand_automata): Don't generate attributes.
 	(write_automata): Don't generate state_alts functions.
 	(main): New function.
 	(it_is_empty_reserv_sets, output_state_alts_full_vect_name)
 	(output_state_alts_comb_vect_name, output_state_alts_check_vect_name)
 	(AUTOMATON_STATE_ALTS_MACRO_NAME, INTERNAL_STATE_ALTS_FUNC_NAME)
 	(STATE_ALTS_FUNC_NAME, INSN_DEFAULT_LATENCY_FUNC_NAME)
 	(BYPASS_P_FUNC_NAME, output_state_alts_table)
 	(output_automata_list_state_alts_code, output_internal_state_alts_func)
 	(output_state_alts_func, make_insn_alts_attr, make_bypass_attr)
 	(make_internal_dfa_insn_code_attr, make_default_insn_latency_attr):
 	Delete.
 	* genattr.c: Declare internal_dfa_insn_code in insn-attr.h.
 	* genattrtab.h: Delete file.
 	* Makefile.in (OBJS-common): Add insn-automata.o.
 	(insn-automata.o): New rule.
 	(simple_generated_c): Add insn-automata.c.
 	(build/genattrtab.o, build/genautomata.o): Update dependencies.
 	(genprogmd): Add automata.
 	(build/genattrtab): Needs no extra objects nor libraries.
 	(build/genautomata): Needs build/vec.o and -lm.

From-SVN: r110123
parent 5f2f0edd
2006-01-22 Zack Weinberg <zackw@panix.com> 2006-01-22 Zack Weinberg <zackw@panix.com>
* genattrtab.c: Don't include genattrtab.h. Define ATTR_NONE
and ATTR_SPECIAL (from genattrtab.h). Don't define num_dfa_decls
nor any of the random handful of variables that used to be necessary
when this program was linked with rtlanal.o. Prune set of forward
function declarations.
(struct attr_desc): Remove static_p field.
(hash_obstack, temp_obstack, attr_hash_table, attr_printf)
(check_attr_test, make_internal_attr, make_numeric_value): Make static.
(attr_string): Do not read the character one past the length of
the string.
(write_attr_get, find_attr, make_internal_attr): Don't touch static_p.
(struct insn_reserv, all_insn_reservs, last_insn_reserv_p)
(n_insn_reservs, gen_insn_reserv, struct bypass_list, all_bypasses)
(n_bypasses, gen_bypass_1, gen_bypass, process_bypasses)
(make_automaton_attrs): New.
(main): Do not call into genautomata. Call local gen_bypass
and gen_insn_reserv as appropriate. Call make_automaton_attrs.
Remove special case for insn_alts.
* genautomata.c: Include gensupport.h; not genattrtab.h nor
varray.h (leftover from previous change). Prune set of forward
function declarations. Remove state_alts fields from all
structures. Remove state_alts_table from struct automaton.
Make everything except main static. Do not maintain num_dfa_decls.
Do not maintain state_alts fields of various structures.
(process_decls): Don't validate condexp for dm_insn_reserv decls.
(add_arc): Remove state_alts argument. All callers updated.
(output_reserved_units_table): Emit #ifdef here...
(output_tables): ...not here. Don't generate state_alts tables.
(expand_automata): Don't generate attributes.
(write_automata): Don't generate state_alts functions.
(main): New function.
(it_is_empty_reserv_sets, output_state_alts_full_vect_name)
(output_state_alts_comb_vect_name, output_state_alts_check_vect_name)
(AUTOMATON_STATE_ALTS_MACRO_NAME, INTERNAL_STATE_ALTS_FUNC_NAME)
(STATE_ALTS_FUNC_NAME, INSN_DEFAULT_LATENCY_FUNC_NAME)
(BYPASS_P_FUNC_NAME, output_state_alts_table)
(output_automata_list_state_alts_code, output_internal_state_alts_func)
(output_state_alts_func, make_insn_alts_attr, make_bypass_attr)
(make_internal_dfa_insn_code_attr, make_default_insn_latency_attr):
Delete.
* genattr.c: Declare internal_dfa_insn_code in insn-attr.h.
* genattrtab.h: Delete file.
* Makefile.in (OBJS-common): Add insn-automata.o.
(insn-automata.o): New rule.
(simple_generated_c): Add insn-automata.c.
(build/genattrtab.o, build/genautomata.o): Update dependencies.
(genprogmd): Add automata.
(build/genattrtab): Needs no extra objects nor libraries.
(build/genautomata): Needs build/vec.o and -lm.
2006-01-22 Zack Weinberg <zackw@panix.com>
* genautomata.c (process_state_longest_path, max_dfa_issue_rate) * genautomata.c (process_state_longest_path, max_dfa_issue_rate)
(output_dfa_max_issue_rate, locked_states_num): Delete. (output_dfa_max_issue_rate, locked_states_num): Delete.
(struct automaton): Add locked_states field. (struct automaton): Add locked_states field.
......
...@@ -981,7 +981,7 @@ OBJS-common = \ ...@@ -981,7 +981,7 @@ OBJS-common = \
integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \ integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \
loop.o mode-switching.o modulo-sched.o optabs.o options.o opts.o \ loop.o mode-switching.o modulo-sched.o optabs.o options.o opts.o \
params.o postreload.o postreload-gcse.o predict.o \ params.o postreload.o postreload-gcse.o predict.o \
insn-preds.o pointer-set.o \ insn-preds.o insn-automata.o pointer-set.o \
print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \ print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \
real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \ real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \
reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \ reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \
...@@ -2639,6 +2639,8 @@ genrtl.o : genrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H)\ ...@@ -2639,6 +2639,8 @@ genrtl.o : genrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H)\
insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(RTL_H) $(REGS_H) real.h output.h $(INSN_ATTR_H) \ $(TM_H) $(RTL_H) $(REGS_H) real.h output.h $(INSN_ATTR_H) \
insn-config.h toplev.h $(RECOG_H) $(TM_P_H) $(FLAGS_H) insn-config.h toplev.h $(RECOG_H) $(TM_P_H) $(FLAGS_H)
insn-automata.o : insn-automata.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(RTL_H) $(INSN_ATTR_H)
insn-emit.o : insn-emit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ insn-emit.o : insn-emit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(EXPR_H) real.h output.h insn-config.h $(OPTABS_H) \ $(RTL_H) $(EXPR_H) real.h output.h insn-config.h $(OPTABS_H) \
reload.h $(RECOG_H) toplev.h $(FUNCTION_H) $(FLAGS_H) hard-reg-set.h \ reload.h $(RECOG_H) toplev.h $(FUNCTION_H) $(FLAGS_H) hard-reg-set.h \
...@@ -2675,9 +2677,9 @@ insn-recog.o : insn-recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ...@@ -2675,9 +2677,9 @@ insn-recog.o : insn-recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
simple_generated_h = insn-attr.h insn-codes.h insn-config.h insn-flags.h simple_generated_h = insn-attr.h insn-codes.h insn-config.h insn-flags.h
simple_generated_c = insn-attrtab.c insn-emit.c insn-extract.c \ simple_generated_c = insn-attrtab.c insn-automata.c insn-emit.c \
insn-opinit.c insn-output.c insn-peep.c \ insn-extract.c insn-opinit.c insn-output.c \
insn-recog.c insn-peep.c insn-recog.c
$(simple_generated_h): insn-%.h: s-%; @true $(simple_generated_h): insn-%.h: s-%; @true
...@@ -2906,10 +2908,10 @@ build/genattr.o : genattr.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \ ...@@ -2906,10 +2908,10 @@ build/genattr.o : genattr.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \
coretypes.h $(GTM_H) errors.h gensupport.h coretypes.h $(GTM_H) errors.h gensupport.h
build/genattrtab.o : genattrtab.c $(RTL_BASE_H) $(OBSTACK_H) \ build/genattrtab.o : genattrtab.c $(RTL_BASE_H) $(OBSTACK_H) \
$(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(GGC_H) \ $(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(GGC_H) \
gensupport.h genattrtab.h gensupport.h
build/genautomata.o : genautomata.c $(RTL_BASE_H) $(OBSTACK_H) \ build/genautomata.o : genautomata.c $(RTL_BASE_H) $(OBSTACK_H) \
$(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h vec.h \ $(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h vec.h \
genattrtab.h $(HASHTAB_H) $(HASHTAB_H) gensupport.h
build/gencheck.o : gencheck.c gencheck.h tree.def $(BCONFIG_H) $(GTM_H) \ build/gencheck.o : gencheck.c gencheck.h tree.def $(BCONFIG_H) $(GTM_H) \
$(SYSTEM_H) coretypes.h $(lang_tree_files) $(SYSTEM_H) coretypes.h $(lang_tree_files)
build/genchecksum.o : genchecksum.c $(BCONFIG_H) $(SYSTEM_H) $(MD5_H) build/genchecksum.o : genchecksum.c $(BCONFIG_H) $(SYSTEM_H) $(MD5_H)
...@@ -2960,14 +2962,15 @@ build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS) ...@@ -2960,14 +2962,15 @@ build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)
$(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)
# All these programs use the MD reader ($(BUILD_RTL)). # All these programs use the MD reader ($(BUILD_RTL)).
genprogmd = attr attrtab codes conditions config constants emit extract \ genprogmd = attr attrtab automata codes conditions config constants emit \
flags mddeps opinit output peep preds recog extract flags mddeps opinit output peep preds recog
$(genprogmd:%=build/gen%$(build_exeext)): $(BUILD_RTL) $(BUILD_ERRORS) $(genprogmd:%=build/gen%$(build_exeext)): $(BUILD_RTL) $(BUILD_ERRORS)
# These programs need files over and above what they get from the above list. # These programs need files over and above what they get from the above list.
build/genextract$(build_exeext) : build/vec.o build/genextract$(build_exeext) : build/vec.o
build/genattrtab$(build_exeext) : build/genautomata.o build/vec.o
build/genattrtab$(build_exeext) : BUILD_LIBS += -lm build/genautomata$(build_exeext) : build/vec.o
build/genautomata$(build_exeext) : BUILD_LIBS += -lm
# These programs are not linked with the MD reader. # These programs are not linked with the MD reader.
build/gengenrtl$(build_exeext) : $(BUILD_ERRORS) build/gengenrtl$(build_exeext) : $(BUILD_ERRORS)
......
...@@ -174,6 +174,8 @@ main (int argc, char **argv) ...@@ -174,6 +174,8 @@ main (int argc, char **argv)
printf ("#define CPU_UNITS_QUERY 0\n"); printf ("#define CPU_UNITS_QUERY 0\n");
printf ("#endif\n\n"); printf ("#endif\n\n");
/* Interface itself: */ /* Interface itself: */
printf ("/* Internal insn code number used by automata. */\n");
printf ("extern int internal_dfa_insn_code (rtx);\n\n");
printf ("/* Insn latency time defined in define_insn_reservation. */\n"); printf ("/* Insn latency time defined in define_insn_reservation. */\n");
printf ("extern int insn_default_latency (rtx);\n\n"); printf ("extern int insn_default_latency (rtx);\n\n");
printf ("/* Return nonzero if there is a bypass for given insn\n"); printf ("/* Return nonzero if there is a bypass for given insn\n");
......
...@@ -109,23 +109,17 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -109,23 +109,17 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "coretypes.h" #include "coretypes.h"
#include "tm.h" #include "tm.h"
#include "rtl.h" #include "rtl.h"
#include "ggc.h"
#include "gensupport.h" #include "gensupport.h"
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
#endif
/* We must include obstack.h after <sys/time.h>, to avoid lossage with
/usr/include/sys/stdtypes.h on Sun OS 4.x. */
#include "obstack.h" #include "obstack.h"
#include "errors.h" #include "errors.h"
#include "genattrtab.h" /* Flags for make_internal_attr's `special' parameter. */
#define ATTR_NONE 0
#define ATTR_SPECIAL (1 << 0)
static struct obstack obstack1, obstack2; static struct obstack obstack1, obstack2;
struct obstack *hash_obstack = &obstack1; static struct obstack *hash_obstack = &obstack1;
struct obstack *temp_obstack = &obstack2; static struct obstack *temp_obstack = &obstack2;
/* enough space to reserve for printing out ints */ /* enough space to reserve for printing out ints */
#define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3) #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
...@@ -183,7 +177,6 @@ struct attr_desc ...@@ -183,7 +177,6 @@ struct attr_desc
unsigned is_numeric : 1; /* Values of this attribute are numeric. */ unsigned is_numeric : 1; /* Values of this attribute are numeric. */
unsigned is_const : 1; /* Attribute value constant for each run. */ unsigned is_const : 1; /* Attribute value constant for each run. */
unsigned is_special : 1; /* Don't call `write_attr_set'. */ unsigned is_special : 1; /* Don't call `write_attr_set'. */
unsigned static_p : 1; /* Make the output function static. */
}; };
/* Structure for each DEFINE_DELAY. */ /* Structure for each DEFINE_DELAY. */
...@@ -217,8 +210,6 @@ static int num_delays; ...@@ -217,8 +210,6 @@ static int num_delays;
static int have_annul_true, have_annul_false; static int have_annul_true, have_annul_false;
static int num_insn_ents; static int num_insn_ents;
int num_dfa_decls;
/* Stores, for each insn code, the number of constraint alternatives. */ /* Stores, for each insn code, the number of constraint alternatives. */
static int *insn_n_alternatives; static int *insn_n_alternatives;
...@@ -240,16 +231,6 @@ static const char *delay_type_str; ...@@ -240,16 +231,6 @@ static const char *delay_type_str;
static const char *delay_1_0_str; static const char *delay_1_0_str;
static const char *num_delay_slots_str; static const char *num_delay_slots_str;
/* Indicate that REG_DEAD notes are valid if dead_or_set_p is ever
called. */
int reload_completed = 0;
/* Some machines test `optimize' in macros called from rtlanal.c, so we need
to define it here. */
int optimize = 0;
/* Simplify an expression. Only call the routine if there is something to /* Simplify an expression. Only call the routine if there is something to
simplify. */ simplify. */
#define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX) \ #define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX) \
...@@ -258,88 +239,44 @@ int optimize = 0; ...@@ -258,88 +239,44 @@ int optimize = 0;
#define DEF_ATTR_STRING(S) (attr_string ((S), strlen (S))) #define DEF_ATTR_STRING(S) (attr_string ((S), strlen (S)))
/* These are referenced by rtlanal.c and hence need to be defined somewhere. /* Forward declarations of functions used before their definitions, only. */
They won't actually be used. */ static char *attr_string (const char *, int);
static char *attr_printf (unsigned int, const char *, ...)
rtx global_rtl[GR_MAX]; ATTRIBUTE_PRINTF_2;
rtx pic_offset_table_rtx; static rtx make_numeric_value (int);
static void attr_hash_add_rtx (int, rtx);
static void attr_hash_add_string (int, char *);
static rtx attr_rtx (enum rtx_code, ...);
static rtx attr_rtx_1 (enum rtx_code, va_list);
static char *attr_string (const char *, int);
static rtx check_attr_value (rtx, struct attr_desc *);
static rtx convert_set_attr_alternative (rtx, struct insn_def *);
static rtx convert_set_attr (rtx, struct insn_def *);
static void check_defs (void);
static rtx make_canonical (struct attr_desc *, rtx);
static struct attr_value *get_attr_value (rtx, struct attr_desc *, int);
static rtx copy_rtx_unchanging (rtx);
static rtx copy_boolean (rtx);
static void expand_delays (void);
static void fill_attr (struct attr_desc *);
static rtx substitute_address (rtx, rtx (*) (rtx), rtx (*) (rtx));
static void make_length_attrs (void);
static rtx identity_fn (rtx);
static rtx zero_fn (rtx);
static rtx one_fn (rtx);
static rtx max_fn (rtx);
static rtx min_fn (rtx);
static void write_length_unit_log (void);
static rtx simplify_cond (rtx, int, int);
static void clear_struct_flag (rtx);
static void remove_insn_ent (struct attr_value *, struct insn_ent *);
static void insert_insn_ent (struct attr_value *, struct insn_ent *);
static rtx insert_right_side (enum rtx_code, rtx, rtx, int, int);
static rtx make_alternative_compare (int);
static int compute_alternative_mask (rtx, enum rtx_code);
static rtx evaluate_eq_attr (rtx, rtx, int, int);
static rtx simplify_and_tree (rtx, rtx *, int, int);
static rtx simplify_or_tree (rtx, rtx *, int, int);
static rtx simplify_test_exp (rtx, int, int);
static rtx simplify_test_exp_in_temp (rtx, int, int);
static void optimize_attrs (void);
static void gen_attr (rtx, int);
static int count_alternatives (rtx);
static int compares_alternatives_p (rtx);
static int contained_in_p (rtx, rtx);
static void gen_insn (rtx, int);
static void gen_delay (rtx, int);
static void write_test_expr (rtx, int);
static int max_attr_value (rtx, int*);
static int min_attr_value (rtx, int*);
static int or_attr_value (rtx, int*);
static void walk_attr_value (rtx);
static void write_attr_get (struct attr_desc *);
static rtx eliminate_known_true (rtx, rtx, int, int);
static void write_attr_set (struct attr_desc *, int, rtx,
const char *, const char *, rtx,
int, int);
static void write_insn_cases (struct insn_ent *, int);
static void write_attr_case (struct attr_desc *, struct attr_value *,
int, const char *, const char *, int, rtx);
static void write_attr_valueq (struct attr_desc *, const char *);
static void write_attr_value (struct attr_desc *, rtx);
static void write_upcase (const char *);
static void write_indent (int);
static void write_eligible_delay (const char *);
static int write_expr_attr_cache (rtx, struct attr_desc *);
static void write_const_num_delay_slots (void);
static char *next_comma_elt (const char **);
static struct attr_desc *find_attr (const char **, int); static struct attr_desc *find_attr (const char **, int);
static struct attr_value *find_most_used (struct attr_desc *); static rtx mk_attr_alt (int);
static rtx attr_eq (const char *, const char *); static char *next_comma_elt (const char **);
static const char *attr_numeral (int); static rtx insert_right_side (enum rtx_code, rtx, rtx, int, int);
static int attr_equal_p (rtx, rtx); static rtx copy_boolean (rtx);
static rtx attr_copy_rtx (rtx); static int compares_alternatives_p (rtx);
static int attr_rtx_cost (rtx); static void make_internal_attr (const char *, rtx, int);
static bool attr_alt_subset_p (rtx, rtx); static void insert_insn_ent (struct attr_value *, struct insn_ent *);
static void walk_attr_value (rtx);
static int max_attr_value (rtx, int*);
static int min_attr_value (rtx, int*);
static int or_attr_value (rtx, int*);
static rtx simplify_test_exp (rtx, int, int);
static rtx simplify_test_exp_in_temp (rtx, int, int);
static rtx copy_rtx_unchanging (rtx);
static bool attr_alt_subset_p (rtx, rtx);
static bool attr_alt_subset_of_compl_p (rtx, rtx); static bool attr_alt_subset_of_compl_p (rtx, rtx);
static rtx attr_alt_intersection (rtx, rtx); static void clear_struct_flag (rtx);
static rtx attr_alt_union (rtx, rtx); static void write_attr_valueq (struct attr_desc *, const char *);
static rtx attr_alt_complement (rtx); static struct attr_value *find_most_used (struct attr_desc *);
static rtx mk_attr_alt (int); static void write_attr_set (struct attr_desc *, int, rtx,
const char *, const char *, rtx,
int, int);
static void write_attr_case (struct attr_desc *, struct attr_value *,
int, const char *, const char *, int, rtx);
static void write_attr_value (struct attr_desc *, rtx);
static void write_upcase (const char *);
static void write_indent (int);
static rtx identity_fn (rtx);
static rtx zero_fn (rtx);
static rtx one_fn (rtx);
static rtx max_fn (rtx);
static rtx min_fn (rtx);
#define oballoc(size) obstack_alloc (hash_obstack, size) #define oballoc(size) obstack_alloc (hash_obstack, size)
...@@ -368,7 +305,7 @@ struct attr_hash ...@@ -368,7 +305,7 @@ struct attr_hash
for each. */ for each. */
#define RTL_HASH_SIZE 4093 #define RTL_HASH_SIZE 4093
struct attr_hash *attr_hash_table[RTL_HASH_SIZE]; static struct attr_hash *attr_hash_table[RTL_HASH_SIZE];
/* Here is how primitive or already-shared RTL's hash /* Here is how primitive or already-shared RTL's hash
codes are made. */ codes are made. */
...@@ -603,7 +540,7 @@ attr_rtx (enum rtx_code code, ...) ...@@ -603,7 +540,7 @@ attr_rtx (enum rtx_code code, ...)
rtx attr_printf (len, format, [arg1, ..., argn]) */ rtx attr_printf (len, format, [arg1, ..., argn]) */
char * static char *
attr_printf (unsigned int len, const char *fmt, ...) attr_printf (unsigned int len, const char *fmt, ...)
{ {
char str[256]; char str[256];
...@@ -644,7 +581,7 @@ attr_string (const char *str, int len) ...@@ -644,7 +581,7 @@ attr_string (const char *str, int len)
/* Compute the hash code. */ /* Compute the hash code. */
hashcode = (len + 1) * 613 + (unsigned) str[0]; hashcode = (len + 1) * 613 + (unsigned) str[0];
for (i = 1; i <= len; i += 2) for (i = 1; i < len; i += 2)
hashcode = ((hashcode * 613) + (unsigned) str[i]); hashcode = ((hashcode * 613) + (unsigned) str[i]);
if (hashcode < 0) if (hashcode < 0)
hashcode = -hashcode; hashcode = -hashcode;
...@@ -773,7 +710,7 @@ attr_copy_rtx (rtx orig) ...@@ -773,7 +710,7 @@ attr_copy_rtx (rtx orig)
Return the new expression, if any. */ Return the new expression, if any. */
rtx static rtx
check_attr_test (rtx exp, int is_const, int lineno) check_attr_test (rtx exp, int is_const, int lineno)
{ {
struct attr_desc *attr; struct attr_desc *attr;
...@@ -3711,8 +3648,6 @@ write_attr_get (struct attr_desc *attr) ...@@ -3711,8 +3648,6 @@ write_attr_get (struct attr_desc *attr)
/* Write out start of function, then all values with explicit `case' lines, /* Write out start of function, then all values with explicit `case' lines,
then a `default', then the value with the most uses. */ then a `default', then the value with the most uses. */
if (attr->static_p)
printf ("static ");
if (!attr->is_numeric) if (!attr->is_numeric)
printf ("enum attr_%s\n", attr->name); printf ("enum attr_%s\n", attr->name);
else else
...@@ -4281,7 +4216,6 @@ find_attr (const char **name_p, int create) ...@@ -4281,7 +4216,6 @@ find_attr (const char **name_p, int create)
attr->name = DEF_ATTR_STRING (name); attr->name = DEF_ATTR_STRING (name);
attr->first_value = attr->default_val = NULL; attr->first_value = attr->default_val = NULL;
attr->is_numeric = attr->is_const = attr->is_special = 0; attr->is_numeric = attr->is_const = attr->is_special = 0;
attr->static_p = 0;
attr->next = attrs[index]; attr->next = attrs[index];
attrs[index] = attr; attrs[index] = attr;
...@@ -4292,7 +4226,7 @@ find_attr (const char **name_p, int create) ...@@ -4292,7 +4226,7 @@ find_attr (const char **name_p, int create)
/* Create internal attribute with the given default value. */ /* Create internal attribute with the given default value. */
void static void
make_internal_attr (const char *name, rtx value, int special) make_internal_attr (const char *name, rtx value, int special)
{ {
struct attr_desc *attr; struct attr_desc *attr;
...@@ -4303,7 +4237,6 @@ make_internal_attr (const char *name, rtx value, int special) ...@@ -4303,7 +4237,6 @@ make_internal_attr (const char *name, rtx value, int special)
attr->is_numeric = 1; attr->is_numeric = 1;
attr->is_const = 0; attr->is_const = 0;
attr->is_special = (special & ATTR_SPECIAL) != 0; attr->is_special = (special & ATTR_SPECIAL) != 0;
attr->static_p = (special & ATTR_STATIC) != 0;
attr->default_val = get_attr_value (value, attr, -2); attr->default_val = get_attr_value (value, attr, -2);
} }
...@@ -4328,7 +4261,7 @@ find_most_used (struct attr_desc *attr) ...@@ -4328,7 +4261,7 @@ find_most_used (struct attr_desc *attr)
/* Return (attr_value "n") */ /* Return (attr_value "n") */
rtx static rtx
make_numeric_value (int n) make_numeric_value (int n)
{ {
static rtx int_values[20]; static rtx int_values[20];
...@@ -4388,6 +4321,168 @@ write_const_num_delay_slots (void) ...@@ -4388,6 +4321,168 @@ write_const_num_delay_slots (void)
printf (" }\n}\n\n"); printf (" }\n}\n\n");
} }
} }
/* Synthetic attributes used by insn-automata.c and the scheduler.
These are primarily concerned with (define_insn_reservation)
patterns. */
struct insn_reserv
{
struct insn_reserv *next;
const char *name;
int default_latency;
rtx condexp;
/* Sequence number of this insn. */
int insn_num;
/* Whether a (define_bypass) construct names this insn in its
output list. */
bool bypassed;
};
static struct insn_reserv *all_insn_reservs = 0;
static struct insn_reserv **last_insn_reserv_p = &all_insn_reservs;
static size_t n_insn_reservs;
/* Store information from a DEFINE_INSN_RESERVATION for future
attribute generation. */
static void
gen_insn_reserv (rtx def)
{
struct insn_reserv *decl = oballoc (sizeof (struct insn_reserv));
decl->name = DEF_ATTR_STRING (XSTR (def, 0));
decl->default_latency = XINT (def, 1);
decl->condexp = check_attr_test (XEXP (def, 2), 0, 0);
decl->insn_num = n_insn_reservs;
decl->bypassed = false;
decl->next = 0;
*last_insn_reserv_p = decl;
last_insn_reserv_p = &decl->next;
n_insn_reservs++;
}
/* Store information from a DEFINE_BYPASS for future attribute
generation. The only thing we care about is the list of output
insns, which will later be used to tag reservation structures with
a 'bypassed' bit. */
struct bypass_list
{
struct bypass_list *next;
const char *insn;
};
static struct bypass_list *all_bypasses;
static size_t n_bypasses;
static void
gen_bypass_1 (const char *s, size_t len)
{
struct bypass_list *b;
if (len == 0)
return;
s = attr_string (s, len);
for (b = all_bypasses; b; b = b->next)
if (s == b->insn)
return; /* already got that one */
b = oballoc (sizeof (struct bypass_list));
b->insn = s;
b->next = all_bypasses;
all_bypasses = b;
n_bypasses++;
}
static void
gen_bypass (rtx def)
{
const char *p, *base;
for (p = base = XSTR (def, 1); *p; p++)
if (*p == ',')
{
gen_bypass_1 (base, p - base);
base = p + 1;
}
gen_bypass_1 (base, p - base);
}
/* Find and mark all of the bypassed insns. */
static void
process_bypasses (void)
{
struct bypass_list *b;
struct insn_reserv *r;
/* The reservation list is likely to be much longer than the bypass
list. */
for (r = all_insn_reservs; r; r = r->next)
for (b = all_bypasses; b; b = b->next)
if (r->name == b->insn)
r->bypassed = true;
}
/* Create all of the attributes that describe automaton properties. */
static void
make_automaton_attrs (void)
{
int i;
struct insn_reserv *decl;
rtx code_exp, lats_exp, byps_exp;
if (n_insn_reservs == 0)
return;
code_exp = rtx_alloc (COND);
lats_exp = rtx_alloc (COND);
XVEC (code_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
XVEC (lats_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
XEXP (code_exp, 1) = make_numeric_value (n_insn_reservs + 1);
XEXP (lats_exp, 1) = make_numeric_value (0);
for (decl = all_insn_reservs, i = 0;
decl;
decl = decl->next, i += 2)
{
XVECEXP (code_exp, 0, i) = decl->condexp;
XVECEXP (lats_exp, 0, i) = decl->condexp;
XVECEXP (code_exp, 0, i+1) = make_numeric_value (decl->insn_num);
XVECEXP (lats_exp, 0, i+1) = make_numeric_value (decl->default_latency);
}
if (n_bypasses == 0)
byps_exp = make_numeric_value (0);
else
{
process_bypasses ();
byps_exp = rtx_alloc (COND);
XVEC (byps_exp, 0) = rtvec_alloc (n_bypasses * 2);
XEXP (byps_exp, 1) = make_numeric_value (0);
for (decl = all_insn_reservs, i = 0;
decl;
decl = decl->next)
if (decl->bypassed)
{
XVECEXP (byps_exp, 0, i) = decl->condexp;
XVECEXP (byps_exp, 0, i+1) = make_numeric_value (1);
i += 2;
}
}
make_internal_attr ("*internal_dfa_insn_code", code_exp, ATTR_NONE);
make_internal_attr ("*insn_default_latency", lats_exp, ATTR_NONE);
make_internal_attr ("*bypass_p", byps_exp, ATTR_NONE);
}
int int
main (int argc, char **argv) main (int argc, char **argv)
...@@ -4425,7 +4520,6 @@ from the machine description file `md'. */\n\n"); ...@@ -4425,7 +4520,6 @@ from the machine description file `md'. */\n\n");
/* Read the machine description. */ /* Read the machine description. */
initiate_automaton_gen (argc, argv);
while (1) while (1)
{ {
int lineno; int lineno;
...@@ -4450,54 +4544,14 @@ from the machine description file `md'. */\n\n"); ...@@ -4450,54 +4544,14 @@ from the machine description file `md'. */\n\n");
gen_delay (desc, lineno); gen_delay (desc, lineno);
break; break;
case DEFINE_CPU_UNIT: case DEFINE_INSN_RESERVATION:
gen_cpu_unit (desc); gen_insn_reserv (desc);
break;
case DEFINE_QUERY_CPU_UNIT:
gen_query_cpu_unit (desc);
break; break;
case DEFINE_BYPASS: case DEFINE_BYPASS:
gen_bypass (desc); gen_bypass (desc);
break; break;
case EXCLUSION_SET:
gen_excl_set (desc);
break;
case PRESENCE_SET:
gen_presence_set (desc);
break;
case FINAL_PRESENCE_SET:
gen_final_presence_set (desc);
break;
case ABSENCE_SET:
gen_absence_set (desc);
break;
case FINAL_ABSENCE_SET:
gen_final_absence_set (desc);
break;
case DEFINE_AUTOMATON:
gen_automaton (desc);
break;
case AUTOMATA_OPTION:
gen_automata_option (desc);
break;
case DEFINE_RESERVATION:
gen_reserv (desc);
break;
case DEFINE_INSN_RESERVATION:
gen_insn_reserv (desc);
break;
default: default:
break; break;
} }
...@@ -4522,11 +4576,6 @@ from the machine description file `md'. */\n\n"); ...@@ -4522,11 +4576,6 @@ from the machine description file `md'. */\n\n");
if (num_delays) if (num_delays)
expand_delays (); expand_delays ();
/* Build DFA, output some functions and expand DFA information
to new attributes. */
if (num_dfa_decls)
expand_automata ();
printf ("#include \"config.h\"\n"); printf ("#include \"config.h\"\n");
printf ("#include \"system.h\"\n"); printf ("#include \"system.h\"\n");
printf ("#include \"coretypes.h\"\n"); printf ("#include \"coretypes.h\"\n");
...@@ -4557,6 +4606,9 @@ from the machine description file `md'. */\n\n"); ...@@ -4557,6 +4606,9 @@ from the machine description file `md'. */\n\n");
if (id->insn_code >= 0) if (id->insn_code >= 0)
insn_n_alternatives[id->insn_code] = id->num_alternatives; insn_n_alternatives[id->insn_code] = id->num_alternatives;
/* Construct extra attributes for automata. */
make_automaton_attrs ();
/* Prepare to write out attribute subroutines by checking everything stored /* Prepare to write out attribute subroutines by checking everything stored
away and building the attribute cases. */ away and building the attribute cases. */
...@@ -4587,18 +4639,7 @@ from the machine description file `md'. */\n\n"); ...@@ -4587,18 +4639,7 @@ from the machine description file `md'. */\n\n");
for (attr = attrs[i]; attr; attr = attr->next) for (attr = attrs[i]; attr; attr = attr->next)
{ {
if (! attr->is_special && ! attr->is_const) if (! attr->is_special && ! attr->is_const)
{ write_attr_get (attr);
int insn_alts_p;
insn_alts_p
= (attr->name [0] == '*'
&& strcmp (&attr->name[1], INSN_ALTS_FUNC_NAME) == 0);
if (insn_alts_p)
printf ("\n#if AUTOMATON_ALTS\n");
write_attr_get (attr);
if (insn_alts_p)
printf ("#endif\n\n");
}
} }
/* Write out delay eligibility information, if DEFINE_DELAY present. /* Write out delay eligibility information, if DEFINE_DELAY present.
...@@ -4613,11 +4654,6 @@ from the machine description file `md'. */\n\n"); ...@@ -4613,11 +4654,6 @@ from the machine description file `md'. */\n\n");
write_eligible_delay ("annul_false"); write_eligible_delay ("annul_false");
} }
/* Output code for pipeline hazards recognition based on DFA
(deterministic finite-state automata). */
if (num_dfa_decls)
write_automata ();
/* Write out constant delay slot info. */ /* Write out constant delay slot info. */
write_const_num_delay_slots (); write_const_num_delay_slots ();
......
/* External definitions of source files of genattrtab.
Copyright (C) 2001, 2003, 2005 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 2, 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 COPYING. If not, write to
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* Name of function (attribute) to translate insn into number of insn
alternatives reservation. */
#define INSN_ALTS_FUNC_NAME "insn_alts"
/* Defined in genattrtab.c: */
extern rtx check_attr_test (rtx, int, int);
extern rtx make_numeric_value (int);
extern void make_internal_attr (const char *, rtx, int);
extern char *attr_printf (unsigned int, const char *, ...)
ATTRIBUTE_PRINTF_2;
extern int num_dfa_decls;
/* Defined in genautomata.c: */
extern void gen_cpu_unit (rtx);
extern void gen_query_cpu_unit (rtx);
extern void gen_bypass (rtx);
extern void gen_excl_set (rtx);
extern void gen_presence_set (rtx);
extern void gen_final_presence_set (rtx);
extern void gen_absence_set (rtx);
extern void gen_final_absence_set (rtx);
extern void gen_automaton (rtx);
extern void gen_automata_option (rtx);
extern void gen_reserv (rtx);
extern void gen_insn_reserv (rtx);
extern void initiate_automaton_gen (int, char **);
extern void expand_automata (void);
extern void write_automata (void);
/* Flags for make_internal_attr's `special' parameter. */
#define ATTR_NONE 0
#define ATTR_SPECIAL (1 << 0)
#define ATTR_STATIC (1 << 1)
...@@ -109,18 +109,16 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -109,18 +109,16 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "rtl.h" #include "rtl.h"
#include "obstack.h" #include "obstack.h"
#include "errors.h" #include "errors.h"
#include "gensupport.h"
#include <math.h> #include <math.h>
#include "hashtab.h" #include "hashtab.h"
#include "varray.h"
#include "vec.h" #include "vec.h"
#ifndef CHAR_BIT #ifndef CHAR_BIT
#define CHAR_BIT 8 #define CHAR_BIT 8
#endif #endif
#include "genattrtab.h"
/* Positions in machine description file. Now they are not used. But /* Positions in machine description file. Now they are not used. But
they could be used in the future for better diagnostic messages. */ they could be used in the future for better diagnostic messages. */
typedef int pos_t; typedef int pos_t;
...@@ -197,316 +195,6 @@ typedef struct automaton *automaton_t; ...@@ -197,316 +195,6 @@ typedef struct automaton *automaton_t;
typedef struct automata_list_el *automata_list_el_t; typedef struct automata_list_el *automata_list_el_t;
typedef struct state_ainsn_table *state_ainsn_table_t; typedef struct state_ainsn_table *state_ainsn_table_t;
/* Prototypes of functions gen_cpu_unit, gen_query_cpu_unit,
gen_bypass, gen_excl_set, gen_presence_set, gen_final_presence_set,
gen_absence_set, gen_final_absence_set, gen_automaton,
gen_automata_option, gen_reserv, gen_insn_reserv,
initiate_automaton_gen, expand_automata, write_automata are
described on the file top because the functions are called from
function `main'. */
static void *create_node (size_t);
static void *copy_node (const void *, size_t);
static const char *check_name (const char *, pos_t);
static char *next_sep_el (const char **, int, int);
static int n_sep_els (const char *, int, int);
static char **get_str_vect (const char *, int *, int, int);
static void gen_presence_absence_set (rtx, int, int);
static regexp_t gen_regexp_el (const char *);
static regexp_t gen_regexp_repeat (const char *);
static regexp_t gen_regexp_allof (const char *);
static regexp_t gen_regexp_oneof (const char *);
static regexp_t gen_regexp_sequence (const char *);
static regexp_t gen_regexp (const char *);
static unsigned string_hash (const char *);
static unsigned automaton_decl_hash (const void *);
static int automaton_decl_eq_p (const void *,
const void *);
static decl_t insert_automaton_decl (decl_t);
static decl_t find_automaton_decl (const char *);
static void initiate_automaton_decl_table (void);
static void finish_automaton_decl_table (void);
static hashval_t insn_decl_hash (const void *);
static int insn_decl_eq_p (const void *,
const void *);
static decl_t insert_insn_decl (decl_t);
static decl_t find_insn_decl (const char *);
static void initiate_insn_decl_table (void);
static void finish_insn_decl_table (void);
static hashval_t decl_hash (const void *);
static int decl_eq_p (const void *,
const void *);
static decl_t insert_decl (decl_t);
static decl_t find_decl (const char *);
static void initiate_decl_table (void);
static void finish_decl_table (void);
static unit_set_el_t process_excls (char **, int, pos_t);
static void add_excls (unit_set_el_t, unit_set_el_t,
pos_t);
static unit_set_el_t process_presence_absence_names
(char **, int, pos_t,
int, int);
static pattern_set_el_t process_presence_absence_patterns
(char ***, int, pos_t,
int, int);
static void add_presence_absence (unit_set_el_t,
pattern_set_el_t,
pos_t, int, int);
static void process_decls (void);
static struct bypass_decl *find_bypass (struct bypass_decl *,
struct insn_reserv_decl *);
static void check_automaton_usage (void);
static regexp_t process_regexp (regexp_t);
static void process_regexp_decls (void);
static void check_usage (void);
static int loop_in_regexp (regexp_t, decl_t);
static void check_loops_in_regexps (void);
static void process_regexp_cycles (regexp_t, int, int,
int *, int *);
static void evaluate_max_reserv_cycles (void);
static void check_all_description (void);
static ticker_t create_ticker (void);
static void ticker_off (ticker_t *);
static void ticker_on (ticker_t *);
static int active_time (ticker_t);
static void print_active_time (FILE *, ticker_t);
static void add_advance_cycle_insn_decl (void);
static alt_state_t get_free_alt_state (void);
static void free_alt_state (alt_state_t);
static void free_alt_states (alt_state_t);
static int alt_state_cmp (const void *alt_state_ptr_1,
const void *alt_state_ptr_2);
static alt_state_t uniq_sort_alt_states (alt_state_t);
static int alt_states_eq (alt_state_t, alt_state_t);
static void initiate_alt_states (void);
static void finish_alt_states (void);
static reserv_sets_t alloc_empty_reserv_sets (void);
static unsigned reserv_sets_hash_value (reserv_sets_t);
static int reserv_sets_cmp (reserv_sets_t, reserv_sets_t);
static int reserv_sets_eq (reserv_sets_t, reserv_sets_t);
static void set_unit_reserv (reserv_sets_t, int, int);
static int test_unit_reserv (reserv_sets_t, int, int);
static int it_is_empty_reserv_sets (reserv_sets_t)
ATTRIBUTE_UNUSED;
static int reserv_sets_are_intersected (reserv_sets_t, reserv_sets_t);
static void reserv_sets_shift (reserv_sets_t, reserv_sets_t);
static void reserv_sets_or (reserv_sets_t, reserv_sets_t,
reserv_sets_t);
static void reserv_sets_and (reserv_sets_t, reserv_sets_t,
reserv_sets_t)
ATTRIBUTE_UNUSED;
static void output_cycle_reservs (FILE *, reserv_sets_t,
int, int);
static void output_reserv_sets (FILE *, reserv_sets_t);
static state_t get_free_state (int, automaton_t);
static void free_state (state_t);
static hashval_t state_hash (const void *);
static int state_eq_p (const void *, const void *);
static state_t insert_state (state_t);
static void set_state_reserv (state_t, int, int);
static int intersected_state_reservs_p (state_t, state_t);
static state_t states_union (state_t, state_t, reserv_sets_t);
static state_t state_shift (state_t, reserv_sets_t);
static void initiate_states (void);
static void finish_states (void);
static void free_arc (arc_t);
static void remove_arc (state_t, arc_t);
static arc_t find_arc (state_t, state_t, ainsn_t);
static arc_t add_arc (state_t, state_t, ainsn_t, int);
static arc_t first_out_arc (state_t);
static arc_t next_out_arc (arc_t);
static void initiate_arcs (void);
static void finish_arcs (void);
static automata_list_el_t get_free_automata_list_el (void);
static void free_automata_list_el (automata_list_el_t);
static void free_automata_list (automata_list_el_t);
static hashval_t automata_list_hash (const void *);
static int automata_list_eq_p (const void *, const void *);
static void initiate_automata_lists (void);
static void automata_list_start (void);
static void automata_list_add (automaton_t);
static automata_list_el_t automata_list_finish (void);
static void finish_automata_lists (void);
static void initiate_excl_sets (void);
static reserv_sets_t get_excl_set (reserv_sets_t);
static pattern_reserv_t form_reserv_sets_list (pattern_set_el_t);
static void initiate_presence_absence_pattern_sets (void);
static int check_presence_pattern_sets (reserv_sets_t,
reserv_sets_t, int);
static int check_absence_pattern_sets (reserv_sets_t, reserv_sets_t,
int);
static regexp_t copy_insn_regexp (regexp_t);
static regexp_t transform_1 (regexp_t);
static regexp_t transform_2 (regexp_t);
static regexp_t transform_3 (regexp_t);
static regexp_t regexp_transform_func
(regexp_t, regexp_t (*) (regexp_t));
static regexp_t transform_regexp (regexp_t);
static void transform_insn_regexps (void);
static void store_alt_unit_usage (regexp_t, regexp_t, int, int);
static void check_regexp_units_distribution (const char *, regexp_t);
static void check_unit_distributions_to_automata (void);
static int process_seq_for_forming_states (regexp_t, automaton_t,
int);
static void finish_forming_alt_state (alt_state_t,
automaton_t);
static void process_alts_for_forming_states (regexp_t,
automaton_t, int);
static void create_alt_states (automaton_t);
static void form_ainsn_with_same_reservs (automaton_t);
static reserv_sets_t form_reservs_matter (automaton_t);
static void make_automaton (automaton_t);
static void form_arcs_marked_by_insn (state_t);
static void NDFA_to_DFA (automaton_t);
static void pass_state_graph (state_t, void (*) (state_t));
static void pass_states (automaton_t,
void (*) (state_t));
static void initiate_pass_states (void);
static void add_achieved_state (state_t);
static int set_out_arc_insns_equiv_num (state_t, int);
static void clear_arc_insns_equiv_num (state_t);
static int first_cycle_unit_presence (state_t, int);
static int state_is_differed (state_t, state_t, int, int);
static void set_new_cycle_flags (state_t);
static void minimize_DFA (automaton_t);
static void incr_states_and_arcs_nums (state_t);
static void count_states_and_arcs (automaton_t, int *, int *);
static void build_automaton (automaton_t);
static void set_order_state_num (state_t);
static void enumerate_states (automaton_t);
static ainsn_t insert_ainsn_into_equiv_class (ainsn_t, ainsn_t);
static void delete_ainsn_from_equiv_class (ainsn_t);
static void process_insn_equiv_class (ainsn_t, arc_t *);
static void process_state_for_insn_equiv_partition (state_t);
static void set_insn_equiv_classes (automaton_t);
static double estimate_one_automaton_bound (void);
static int compare_max_occ_cycle_nums (const void *,
const void *);
static void units_to_automata_heuristic_distr (void);
static ainsn_t create_ainsns (void);
static void units_to_automata_distr (void);
static void create_automata (void);
static void form_regexp (regexp_t);
static const char *regexp_representation (regexp_t);
static void finish_regexp_representation (void);
static void output_range_type (FILE *, long int, long int);
static int longest_path_length (state_t);
static void output_chip_member_name (FILE *, automaton_t);
static void output_temp_chip_member_name (FILE *, automaton_t);
static void output_translate_vect_name (FILE *, automaton_t);
static void output_trans_full_vect_name (FILE *, automaton_t);
static void output_trans_comb_vect_name (FILE *, automaton_t);
static void output_trans_check_vect_name (FILE *, automaton_t);
static void output_trans_base_vect_name (FILE *, automaton_t);
static void output_state_alts_full_vect_name (FILE *, automaton_t);
static void output_state_alts_comb_vect_name (FILE *, automaton_t);
static void output_state_alts_check_vect_name (FILE *, automaton_t);
static void output_state_alts_base_vect_name (FILE *, automaton_t);
static void output_min_issue_delay_vect_name (FILE *, automaton_t);
static void output_dead_lock_vect_name (FILE *, automaton_t);
static void output_reserved_units_table_name (FILE *, automaton_t);
static void output_state_member_type (FILE *, automaton_t);
static void output_chip_definitions (void);
static void output_translate_vect (automaton_t);
static int comb_vect_p (state_ainsn_table_t);
static state_ainsn_table_t create_state_ainsn_table (automaton_t);
static void output_state_ainsn_table
(state_ainsn_table_t, const char *, void (*) (FILE *, automaton_t),
void (*) (FILE *, automaton_t), void (*) (FILE *, automaton_t),
void (*) (FILE *, automaton_t));
static int out_state_arcs_num (state_t);
static int compare_transition_els_num (const void *, const void *);
static void add_states_vect_el (state_t);
static void output_trans_table (automaton_t);
static void output_state_alts_table (automaton_t);
static int min_issue_delay_pass_states (state_t, ainsn_t);
static int min_issue_delay (state_t, ainsn_t);
static void initiate_min_issue_delay_pass_states (void);
static void output_min_issue_delay_table (automaton_t);
static void output_dead_lock_vect (automaton_t);
static void output_reserved_units_table (automaton_t);
static void output_tables (void);
static void output_max_insn_queue_index_def (void);
static void output_insn_code_cases (void (*) (automata_list_el_t));
static void output_automata_list_min_issue_delay_code (automata_list_el_t);
static void output_internal_min_issue_delay_func (void);
static void output_automata_list_transition_code (automata_list_el_t);
static void output_internal_trans_func (void);
static void output_internal_insn_code_evaluation (const char *,
const char *, int);
static void output_dfa_insn_code_func (void);
static void output_trans_func (void);
static void output_automata_list_state_alts_code (automata_list_el_t);
static void output_internal_state_alts_func (void);
static void output_state_alts_func (void);
static void output_min_issue_delay_func (void);
static void output_internal_dead_lock_func (void);
static void output_dead_lock_func (void);
static void output_internal_reset_func (void);
static void output_size_func (void);
static void output_reset_func (void);
static void output_min_insn_conflict_delay_func (void);
static void output_internal_insn_latency_func (void);
static void output_insn_latency_func (void);
static void output_print_reservation_func (void);
static int units_cmp (const void *,
const void *);
static void output_get_cpu_unit_code_func (void);
static void output_cpu_unit_reservation_p (void);
static void output_dfa_clean_insn_cache_func (void);
static void output_dfa_start_func (void);
static void output_dfa_finish_func (void);
static void output_regexp (regexp_t );
static void output_unit_set_el_list (unit_set_el_t);
static void output_pattern_set_el_list (pattern_set_el_t);
static void output_description (void);
static void output_automaton_name (FILE *, automaton_t);
static void output_automaton_units (automaton_t);
static void add_state_reservs (state_t);
static void output_state_arcs (state_t);
static int state_reservs_cmp (const void *,
const void *);
static void remove_state_duplicate_reservs (void);
static void output_state (state_t);
static void output_automaton_descriptions (void);
static void output_statistics (FILE *);
static void output_time_statistics (FILE *);
static void generate (void);
static void make_insn_alts_attr (void);
static void make_internal_dfa_insn_code_attr (void);
static void make_default_insn_latency_attr (void);
static void make_bypass_attr (void);
static const char *file_name_suffix (const char *);
static const char *base_file_name (const char *);
static void check_automata_insn_issues (void);
static void add_automaton_state (state_t);
static void form_important_insn_automata_lists (void);
/* Undefined position. */ /* Undefined position. */
static pos_t no_pos = 0; static pos_t no_pos = 0;
...@@ -531,6 +219,19 @@ DEF_VEC_I(vect_el_t); ...@@ -531,6 +219,19 @@ DEF_VEC_I(vect_el_t);
DEF_VEC_ALLOC_I(vect_el_t, heap); DEF_VEC_ALLOC_I(vect_el_t, heap);
typedef VEC(vect_el_t,heap) *vla_hwint_t; typedef VEC(vect_el_t,heap) *vla_hwint_t;
/* Forward declarations of functions used before their definitions, only. */
static regexp_t gen_regexp_sequence (const char *);
static void reserv_sets_or (reserv_sets_t, reserv_sets_t,
reserv_sets_t);
static reserv_sets_t get_excl_set (reserv_sets_t);
static int check_presence_pattern_sets (reserv_sets_t,
reserv_sets_t, int);
static int check_absence_pattern_sets (reserv_sets_t, reserv_sets_t,
int);
static arc_t first_out_arc (state_t);
static arc_t next_out_arc (arc_t);
/* Options with the following names can be set up in automata_option /* Options with the following names can be set up in automata_option
construction. Because the strings occur more one time we use the construction. Because the strings occur more one time we use the
...@@ -780,10 +481,6 @@ struct insn_reserv_decl ...@@ -780,10 +481,6 @@ struct insn_reserv_decl
which arc marked by given insn enters from a state (fixed during which arc marked by given insn enters from a state (fixed during
an automaton minimization). */ an automaton minimization). */
int equiv_class_num; int equiv_class_num;
/* The field value is state_alts of arc leaving a state (fixed
during an automaton minimization) and marked by given insn
enters. */
int state_alts;
/* The following member value is the list to automata which can be /* The following member value is the list to automata which can be
changed by the insn issue. */ changed by the insn issue. */
automata_list_el_t important_automata_list; automata_list_el_t important_automata_list;
...@@ -1041,10 +738,6 @@ struct arc ...@@ -1041,10 +738,6 @@ struct arc
/* List of arcs marked given insn is formed with the following /* List of arcs marked given insn is formed with the following
field. The field is used in transformation NDFA -> DFA. */ field. The field is used in transformation NDFA -> DFA. */
arc_t next_arc_marked_by_insn; arc_t next_arc_marked_by_insn;
/* The following field is defined if NDFA_FLAG is zero. The member
value is number of alternative reservations which can be used for
transition for given state by given insn. */
int state_alts;
}; };
/* The following node type describes a deterministic alternative in /* The following node type describes a deterministic alternative in
...@@ -1142,10 +835,9 @@ struct automaton ...@@ -1142,10 +835,9 @@ struct automaton
/* The following field value is defined only if minimization of DFA /* The following field value is defined only if minimization of DFA
is used. */ is used. */
int minimal_DFA_arcs_num; int minimal_DFA_arcs_num;
/* The following two members refer for two table state x ainsn -> /* The following member refers for two table state x ainsn -> int.
int. */ ??? Above sentence is incomprehensible. */
state_ainsn_table_t trans_table; state_ainsn_table_t trans_table;
state_ainsn_table_t state_alts_table;
/* The following member value is maximal value of min issue delay /* The following member value is maximal value of min issue delay
for insns of the automaton. */ for insns of the automaton. */
int max_min_delay; int max_min_delay;
...@@ -1541,7 +1233,7 @@ get_str_vect (const char *str, int *els_num, int sep, int paren_p) ...@@ -1541,7 +1233,7 @@ get_str_vect (const char *str, int *els_num, int sep, int paren_p)
This gives information about a unit contained in CPU. We fill a This gives information about a unit contained in CPU. We fill a
struct unit_decl with information used later by `expand_automata'. */ struct unit_decl with information used later by `expand_automata'. */
void static void
gen_cpu_unit (rtx def) gen_cpu_unit (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -1563,7 +1255,6 @@ gen_cpu_unit (rtx def) ...@@ -1563,7 +1255,6 @@ gen_cpu_unit (rtx def)
DECL_UNIT (decl)->min_occ_cycle_num = -1; DECL_UNIT (decl)->min_occ_cycle_num = -1;
DECL_UNIT (decl)->in_set_p = 0; DECL_UNIT (decl)->in_set_p = 0;
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
} }
...@@ -1571,7 +1262,7 @@ gen_cpu_unit (rtx def) ...@@ -1571,7 +1262,7 @@ gen_cpu_unit (rtx def)
This gives information about a unit contained in CPU. We fill a This gives information about a unit contained in CPU. We fill a
struct unit_decl with information used later by `expand_automata'. */ struct unit_decl with information used later by `expand_automata'. */
void static void
gen_query_cpu_unit (rtx def) gen_query_cpu_unit (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -1592,7 +1283,6 @@ gen_query_cpu_unit (rtx def) ...@@ -1592,7 +1283,6 @@ gen_query_cpu_unit (rtx def)
DECL_UNIT (decl)->automaton_name = XSTR (def, 1); DECL_UNIT (decl)->automaton_name = XSTR (def, 1);
DECL_UNIT (decl)->query_p = 1; DECL_UNIT (decl)->query_p = 1;
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
} }
...@@ -1601,7 +1291,7 @@ gen_query_cpu_unit (rtx def) ...@@ -1601,7 +1291,7 @@ gen_query_cpu_unit (rtx def)
This gives information about a unit contained in the CPU. We fill This gives information about a unit contained in the CPU. We fill
in a struct bypass_decl with information used later by in a struct bypass_decl with information used later by
`expand_automata'. */ `expand_automata'. */
void static void
gen_bypass (rtx def) gen_bypass (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -1628,7 +1318,6 @@ gen_bypass (rtx def) ...@@ -1628,7 +1318,6 @@ gen_bypass (rtx def)
DECL_BYPASS (decl)->in_insn_name = in_insns [j]; DECL_BYPASS (decl)->in_insn_name = in_insns [j];
DECL_BYPASS (decl)->bypass_guard_name = XSTR (def, 3); DECL_BYPASS (decl)->bypass_guard_name = XSTR (def, 3);
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
} }
...@@ -1637,7 +1326,7 @@ gen_bypass (rtx def) ...@@ -1637,7 +1326,7 @@ gen_bypass (rtx def)
This gives information about a cpu unit conflicts. We fill a This gives information about a cpu unit conflicts. We fill a
struct excl_rel_decl (excl) with information used later by struct excl_rel_decl (excl) with information used later by
`expand_automata'. */ `expand_automata'. */
void static void
gen_excl_set (rtx def) gen_excl_set (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -1668,7 +1357,6 @@ gen_excl_set (rtx def) ...@@ -1668,7 +1357,6 @@ gen_excl_set (rtx def)
DECL_EXCL (decl)->names [i] DECL_EXCL (decl)->names [i]
= second_str_cpu_units [i - first_vect_length]; = second_str_cpu_units [i - first_vect_length];
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
/* Process a PRESENCE_SET, a FINAL_PRESENCE_SET, an ABSENCE_SET, /* Process a PRESENCE_SET, a FINAL_PRESENCE_SET, an ABSENCE_SET,
...@@ -1738,7 +1426,6 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1738,7 +1426,6 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
DECL_ABSENCE (decl)->final_p = final_p; DECL_ABSENCE (decl)->final_p = final_p;
} }
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
/* Process a PRESENCE_SET. /* Process a PRESENCE_SET.
...@@ -1746,7 +1433,7 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1746,7 +1433,7 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
This gives information about a cpu unit reservation requirements. This gives information about a cpu unit reservation requirements.
We fill a struct unit_pattern_rel_decl (presence) with information We fill a struct unit_pattern_rel_decl (presence) with information
used later by `expand_automata'. */ used later by `expand_automata'. */
void static void
gen_presence_set (rtx def) gen_presence_set (rtx def)
{ {
gen_presence_absence_set (def, TRUE, FALSE); gen_presence_absence_set (def, TRUE, FALSE);
...@@ -1757,7 +1444,7 @@ gen_presence_set (rtx def) ...@@ -1757,7 +1444,7 @@ gen_presence_set (rtx def)
This gives information about a cpu unit reservation requirements. This gives information about a cpu unit reservation requirements.
We fill a struct unit_pattern_rel_decl (presence) with information We fill a struct unit_pattern_rel_decl (presence) with information
used later by `expand_automata'. */ used later by `expand_automata'. */
void static void
gen_final_presence_set (rtx def) gen_final_presence_set (rtx def)
{ {
gen_presence_absence_set (def, TRUE, TRUE); gen_presence_absence_set (def, TRUE, TRUE);
...@@ -1768,7 +1455,7 @@ gen_final_presence_set (rtx def) ...@@ -1768,7 +1455,7 @@ gen_final_presence_set (rtx def)
This gives information about a cpu unit reservation requirements. This gives information about a cpu unit reservation requirements.
We fill a struct unit_pattern_rel_decl (absence) with information We fill a struct unit_pattern_rel_decl (absence) with information
used later by `expand_automata'. */ used later by `expand_automata'. */
void static void
gen_absence_set (rtx def) gen_absence_set (rtx def)
{ {
gen_presence_absence_set (def, FALSE, FALSE); gen_presence_absence_set (def, FALSE, FALSE);
...@@ -1779,7 +1466,7 @@ gen_absence_set (rtx def) ...@@ -1779,7 +1466,7 @@ gen_absence_set (rtx def)
This gives information about a cpu unit reservation requirements. This gives information about a cpu unit reservation requirements.
We fill a struct unit_pattern_rel_decl (absence) with information We fill a struct unit_pattern_rel_decl (absence) with information
used later by `expand_automata'. */ used later by `expand_automata'. */
void static void
gen_final_absence_set (rtx def) gen_final_absence_set (rtx def)
{ {
gen_presence_absence_set (def, FALSE, TRUE); gen_presence_absence_set (def, FALSE, TRUE);
...@@ -1790,7 +1477,7 @@ gen_final_absence_set (rtx def) ...@@ -1790,7 +1477,7 @@ gen_final_absence_set (rtx def)
This gives information about a finite state automaton used for This gives information about a finite state automaton used for
recognizing pipeline hazards. We fill a struct automaton_decl recognizing pipeline hazards. We fill a struct automaton_decl
with information used later by `expand_automata'. */ with information used later by `expand_automata'. */
void static void
gen_automaton (rtx def) gen_automaton (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -1808,7 +1495,6 @@ gen_automaton (rtx def) ...@@ -1808,7 +1495,6 @@ gen_automaton (rtx def)
decl->pos = 0; decl->pos = 0;
DECL_AUTOMATON (decl)->name = check_name (str_automata [i], decl->pos); DECL_AUTOMATON (decl)->name = check_name (str_automata [i], decl->pos);
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
} }
...@@ -1816,7 +1502,7 @@ gen_automaton (rtx def) ...@@ -1816,7 +1502,7 @@ gen_automaton (rtx def)
This gives information how to generate finite state automaton used This gives information how to generate finite state automaton used
for recognizing pipeline hazards. */ for recognizing pipeline hazards. */
void static void
gen_automata_option (rtx def) gen_automata_option (rtx def)
{ {
if (strcmp (XSTR (def, 0), NO_MINIMIZATION_OPTION + 1) == 0) if (strcmp (XSTR (def, 0), NO_MINIMIZATION_OPTION + 1) == 0)
...@@ -1997,7 +1683,7 @@ gen_regexp (const char *str) ...@@ -1997,7 +1683,7 @@ gen_regexp (const char *str)
This gives information about a reservation of cpu units. We fill This gives information about a reservation of cpu units. We fill
in a struct reserv_decl with information used later by in a struct reserv_decl with information used later by
`expand_automata'. */ `expand_automata'. */
void static void
gen_reserv (rtx def) gen_reserv (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -2008,7 +1694,6 @@ gen_reserv (rtx def) ...@@ -2008,7 +1694,6 @@ gen_reserv (rtx def)
DECL_RESERV (decl)->name = check_name (XSTR (def, 0), decl->pos); DECL_RESERV (decl)->name = check_name (XSTR (def, 0), decl->pos);
DECL_RESERV (decl)->regexp = gen_regexp (XSTR (def, 1)); DECL_RESERV (decl)->regexp = gen_regexp (XSTR (def, 1));
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
/* Process a DEFINE_INSN_RESERVATION. /* Process a DEFINE_INSN_RESERVATION.
...@@ -2016,7 +1701,7 @@ gen_reserv (rtx def) ...@@ -2016,7 +1701,7 @@ gen_reserv (rtx def)
This gives information about the reservation of cpu units by an This gives information about the reservation of cpu units by an
insn. We fill a struct insn_reserv_decl with information used insn. We fill a struct insn_reserv_decl with information used
later by `expand_automata'. */ later by `expand_automata'. */
void static void
gen_insn_reserv (rtx def) gen_insn_reserv (rtx def)
{ {
decl_t decl; decl_t decl;
...@@ -2030,7 +1715,6 @@ gen_insn_reserv (rtx def) ...@@ -2030,7 +1715,6 @@ gen_insn_reserv (rtx def)
DECL_INSN_RESERV (decl)->condexp = XEXP (def, 2); DECL_INSN_RESERV (decl)->condexp = XEXP (def, 2);
DECL_INSN_RESERV (decl)->regexp = gen_regexp (XSTR (def, 3)); DECL_INSN_RESERV (decl)->regexp = gen_regexp (XSTR (def, 3));
VEC_safe_push (decl_t,heap, decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++;
} }
...@@ -2732,8 +2416,6 @@ process_decls (void) ...@@ -2732,8 +2416,6 @@ process_decls (void)
decl = description->decls [i]; decl = description->decls [i];
if (decl->mode == dm_insn_reserv) if (decl->mode == dm_insn_reserv)
{ {
DECL_INSN_RESERV (decl)->condexp
= check_attr_test (DECL_INSN_RESERV (decl)->condexp, 0, 0);
if (DECL_INSN_RESERV (decl)->default_latency < 0) if (DECL_INSN_RESERV (decl)->default_latency < 0)
error ("define_insn_reservation `%s' has negative latency time", error ("define_insn_reservation `%s' has negative latency time",
DECL_INSN_RESERV (decl)->name); DECL_INSN_RESERV (decl)->name);
...@@ -3435,7 +3117,6 @@ add_advance_cycle_insn_decl (void) ...@@ -3435,7 +3117,6 @@ add_advance_cycle_insn_decl (void)
description->decls [description->decls_num] = advance_cycle_insn_decl; description->decls [description->decls_num] = advance_cycle_insn_decl;
description->decls_num++; description->decls_num++;
description->insns_num++; description->insns_num++;
num_dfa_decls++;
} }
...@@ -3752,23 +3433,6 @@ test_unit_reserv (reserv_sets_t reservs, int cycle_num, int unit_num) ...@@ -3752,23 +3433,6 @@ test_unit_reserv (reserv_sets_t reservs, int cycle_num, int unit_num)
* sizeof (set_el_t) * CHAR_BIT + unit_num); * sizeof (set_el_t) * CHAR_BIT + unit_num);
} }
/* The function checks that the reservation set represents no one unit
reservation. */
static int
it_is_empty_reserv_sets (reserv_sets_t operand)
{
set_el_t *reserv_ptr;
int reservs_num;
gcc_assert (operand);
for (reservs_num = els_in_reservs, reserv_ptr = operand;
reservs_num != 0;
reserv_ptr++, reservs_num--)
if (*reserv_ptr != 0)
return 0;
return 1;
}
/* The function checks that the reservation sets are intersected, /* The function checks that the reservation sets are intersected,
i.e. there is a unit reservation on a cycle in both reservation i.e. there is a unit reservation on a cycle in both reservation
sets. */ sets. */
...@@ -4214,12 +3878,10 @@ find_arc (state_t from_state, state_t to_state, ainsn_t insn) ...@@ -4214,12 +3878,10 @@ find_arc (state_t from_state, state_t to_state, ainsn_t insn)
return NULL; return NULL;
} }
/* The function adds arc from FROM_STATE to TO_STATE marked by AINSN /* The function adds arc from FROM_STATE to TO_STATE marked by AINSN.
and with given STATE_ALTS. The function returns added arc (or The function returns added arc (or already existing arc). */
already existing arc). */
static arc_t static arc_t
add_arc (state_t from_state, state_t to_state, ainsn_t ainsn, add_arc (state_t from_state, state_t to_state, ainsn_t ainsn)
int state_alts)
{ {
arc_t new_arc; arc_t new_arc;
...@@ -4247,7 +3909,6 @@ add_arc (state_t from_state, state_t to_state, ainsn_t ainsn, ...@@ -4247,7 +3909,6 @@ add_arc (state_t from_state, state_t to_state, ainsn_t ainsn,
new_arc->next_out_arc = from_state->first_out_arc; new_arc->next_out_arc = from_state->first_out_arc;
from_state->first_out_arc = new_arc; from_state->first_out_arc = new_arc;
new_arc->next_arc_marked_by_insn = NULL; new_arc->next_arc_marked_by_insn = NULL;
new_arc->state_alts = state_alts;
return new_arc; return new_arc;
} }
...@@ -5702,22 +5363,17 @@ make_automaton (automaton_t automaton) ...@@ -5702,22 +5363,17 @@ make_automaton (automaton_t automaton)
if (progress_flag && states_n % 100 == 0) if (progress_flag && states_n % 100 == 0)
fprintf (stderr, "."); fprintf (stderr, ".");
} }
added_arc = add_arc (state, state2, ainsn, 1); added_arc = add_arc (state, state2, ainsn);
if (!ndfa_flag) if (!ndfa_flag)
break; break;
} }
} }
if (!ndfa_flag && added_arc != NULL) if (!ndfa_flag && added_arc != NULL)
{ {
added_arc->state_alts = 0;
for (alt_state = ainsn->alt_states; for (alt_state = ainsn->alt_states;
alt_state != NULL; alt_state != NULL;
alt_state = alt_state->next_alt_state) alt_state = alt_state->next_alt_state)
{ state2 = alt_state->state;
state2 = alt_state->state;
if (!intersected_state_reservs_p (state, state2))
added_arc->state_alts++;
}
} }
} }
else else
...@@ -5734,7 +5390,7 @@ make_automaton (automaton_t automaton) ...@@ -5734,7 +5390,7 @@ make_automaton (automaton_t automaton)
fprintf (stderr, "."); fprintf (stderr, ".");
} }
gcc_assert (advance_cycle_ainsn); gcc_assert (advance_cycle_ainsn);
add_arc (state, state2, advance_cycle_ainsn, 1); add_arc (state, state2, advance_cycle_ainsn);
} }
VEC_free (state_t,heap, state_stack); VEC_free (state_t,heap, state_stack);
} }
...@@ -5842,7 +5498,7 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn, ...@@ -5842,7 +5498,7 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn,
for (curr_arc = first_out_arc (curr_alt_state->state); for (curr_arc = first_out_arc (curr_alt_state->state);
curr_arc != NULL; curr_arc != NULL;
curr_arc = next_out_arc (curr_arc)) curr_arc = next_out_arc (curr_arc))
add_arc (state, curr_arc->to_state, curr_arc->insn, 1); add_arc (state, curr_arc->to_state, curr_arc->insn);
} }
arcs_marked_by_insn->to_state = state; arcs_marked_by_insn->to_state = state;
for (alts_number = 0, for (alts_number = 0,
...@@ -5854,7 +5510,6 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn, ...@@ -5854,7 +5510,6 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn,
remove_arc (original_state, curr_arc); remove_arc (original_state, curr_arc);
alts_number++; alts_number++;
} }
arcs_marked_by_insn->state_alts = alts_number;
} }
} }
if (!state->it_was_placed_in_stack_for_DFA_forming) if (!state->it_was_placed_in_stack_for_DFA_forming)
...@@ -5968,16 +5623,13 @@ set_out_arc_insns_equiv_num (state_t state, int odd_iteration_flag) ...@@ -5968,16 +5623,13 @@ set_out_arc_insns_equiv_num (state_t state, int odd_iteration_flag)
state_out_arcs_num = 0; state_out_arcs_num = 0;
for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc)) for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc))
{ {
gcc_assert (!arc->insn->insn_reserv_decl->equiv_class_num gcc_assert (!arc->insn->insn_reserv_decl->equiv_class_num);
&& !arc->insn->insn_reserv_decl->state_alts);
state_out_arcs_num++; state_out_arcs_num++;
arc->insn->insn_reserv_decl->equiv_class_num arc->insn->insn_reserv_decl->equiv_class_num
= (odd_iteration_flag = (odd_iteration_flag
? arc->to_state->equiv_class_num_1 ? arc->to_state->equiv_class_num_1
: arc->to_state->equiv_class_num_2); : arc->to_state->equiv_class_num_2);
arc->insn->insn_reserv_decl->state_alts = arc->state_alts; gcc_assert (arc->insn->insn_reserv_decl->equiv_class_num);
gcc_assert (arc->insn->insn_reserv_decl->equiv_class_num
&& arc->insn->insn_reserv_decl->state_alts > 0);
} }
return state_out_arcs_num; return state_out_arcs_num;
} }
...@@ -5990,10 +5642,7 @@ clear_arc_insns_equiv_num (state_t state) ...@@ -5990,10 +5642,7 @@ clear_arc_insns_equiv_num (state_t state)
arc_t arc; arc_t arc;
for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc)) for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc))
{ arc->insn->insn_reserv_decl->equiv_class_num = 0;
arc->insn->insn_reserv_decl->equiv_class_num = 0;
arc->insn->insn_reserv_decl->state_alts = 0;
}
} }
...@@ -6037,8 +5686,7 @@ state_is_differed (state_t state, state_t another_state, ...@@ -6037,8 +5686,7 @@ state_is_differed (state_t state, state_t another_state,
if ((odd_iteration_flag if ((odd_iteration_flag
? arc->to_state->equiv_class_num_1 ? arc->to_state->equiv_class_num_1
: arc->to_state->equiv_class_num_2) : arc->to_state->equiv_class_num_2)
!= arc->insn->insn_reserv_decl->equiv_class_num != arc->insn->insn_reserv_decl->equiv_class_num)
|| (arc->insn->insn_reserv_decl->state_alts != arc->state_alts))
return 1; return 1;
} }
if (state_out_arcs_num != another_state_out_arcs_num) if (state_out_arcs_num != another_state_out_arcs_num)
...@@ -6261,7 +5909,7 @@ merge_states (automaton_t automaton, VEC(state_t,heap) *equiv_classes) ...@@ -6261,7 +5909,7 @@ merge_states (automaton_t automaton, VEC(state_t,heap) *equiv_classes)
curr_arc = next_out_arc (curr_arc)) curr_arc = next_out_arc (curr_arc))
add_arc (first_class_state->equiv_class_state, add_arc (first_class_state->equiv_class_state,
curr_arc->to_state->equiv_class_state, curr_arc->to_state->equiv_class_state,
curr_arc->insn, curr_arc->state_alts); curr_arc->insn);
/* Delete output arcs from states of given class equivalence. */ /* Delete output arcs from states of given class equivalence. */
for (curr_state = first_class_state; for (curr_state = first_class_state;
curr_state != NULL; curr_state != NULL;
...@@ -7126,53 +6774,6 @@ output_trans_base_vect_name (FILE *f, automaton_t automaton) ...@@ -7126,53 +6774,6 @@ output_trans_base_vect_name (FILE *f, automaton_t automaton)
fprintf (f, "%s_base", automaton->corresponding_automaton_decl->name); fprintf (f, "%s_base", automaton->corresponding_automaton_decl->name);
} }
/* Output name for simple alternatives number representation. */
static void
output_state_alts_full_vect_name (FILE *f, automaton_t automaton)
{
if (automaton->corresponding_automaton_decl == NULL)
fprintf (f, "state_alts_%d", automaton->automaton_order_num);
else
fprintf (f, "%s_state_alts",
automaton->corresponding_automaton_decl->name);
}
/* Output name of comb vector of the alternatives number table for given
automaton. */
static void
output_state_alts_comb_vect_name (FILE *f, automaton_t automaton)
{
if (automaton->corresponding_automaton_decl == NULL)
fprintf (f, "state_alts_%d", automaton->automaton_order_num);
else
fprintf (f, "%s_state_alts",
automaton->corresponding_automaton_decl->name);
}
/* Output name of check vector of the alternatives number table for given
automaton. */
static void
output_state_alts_check_vect_name (FILE *f, automaton_t automaton)
{
if (automaton->corresponding_automaton_decl == NULL)
fprintf (f, "check_state_alts_%d", automaton->automaton_order_num);
else
fprintf (f, "%s_check_state_alts",
automaton->corresponding_automaton_decl->name);
}
/* Output name of base vector of the alternatives number table for given
automaton. */
static void
output_state_alts_base_vect_name (FILE *f, automaton_t automaton)
{
if (automaton->corresponding_automaton_decl == NULL)
fprintf (f, "base_state_alts_%d", automaton->automaton_order_num);
else
fprintf (f, "%s_base_state_alts",
automaton->corresponding_automaton_decl->name);
}
/* Output name of simple min issue delay table representation. */ /* Output name of simple min issue delay table representation. */
static void static void
output_min_issue_delay_vect_name (FILE *f, automaton_t automaton) output_min_issue_delay_vect_name (FILE *f, automaton_t automaton)
...@@ -7206,9 +6807,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton) ...@@ -7206,9 +6807,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton)
} }
/* Name of the PHR interface macro. */ /* Name of the PHR interface macro. */
#define AUTOMATON_STATE_ALTS_MACRO_NAME "AUTOMATON_STATE_ALTS"
/* Name of the PHR interface macro. */
#define CPU_UNITS_QUERY_MACRO_NAME "CPU_UNITS_QUERY" #define CPU_UNITS_QUERY_MACRO_NAME "CPU_UNITS_QUERY"
/* Names of an internal functions: */ /* Names of an internal functions: */
...@@ -7219,8 +6817,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton) ...@@ -7219,8 +6817,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton)
#define INTERNAL_TRANSITION_FUNC_NAME "internal_state_transition" #define INTERNAL_TRANSITION_FUNC_NAME "internal_state_transition"
#define INTERNAL_STATE_ALTS_FUNC_NAME "internal_state_alts"
#define INTERNAL_RESET_FUNC_NAME "internal_reset" #define INTERNAL_RESET_FUNC_NAME "internal_reset"
#define INTERNAL_DEAD_LOCK_FUNC_NAME "internal_state_dead_lock_p" #define INTERNAL_DEAD_LOCK_FUNC_NAME "internal_state_dead_lock_p"
...@@ -7238,8 +6834,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton) ...@@ -7238,8 +6834,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton)
#define TRANSITION_FUNC_NAME "state_transition" #define TRANSITION_FUNC_NAME "state_transition"
#define STATE_ALTS_FUNC_NAME "state_alts"
#define MIN_ISSUE_DELAY_FUNC_NAME "min_issue_delay" #define MIN_ISSUE_DELAY_FUNC_NAME "min_issue_delay"
#define MIN_INSN_CONFLICT_DELAY_FUNC_NAME "min_insn_conflict_delay" #define MIN_INSN_CONFLICT_DELAY_FUNC_NAME "min_insn_conflict_delay"
...@@ -7299,14 +6893,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton) ...@@ -7299,14 +6893,6 @@ output_reserved_units_table_name (FILE *f, automaton_t automaton)
code with caching. */ code with caching. */
#define DFA_INSN_CODE_FUNC_NAME "dfa_insn_code" #define DFA_INSN_CODE_FUNC_NAME "dfa_insn_code"
/* Name of function (attribute) to translate insn into internal insn
code. */
#define INSN_DEFAULT_LATENCY_FUNC_NAME "insn_default_latency"
/* Name of function (attribute) to translate insn into internal insn
code. */
#define BYPASS_P_FUNC_NAME "bypass_p"
/* Output C type which is used for representation of codes of states /* Output C type which is used for representation of codes of states
of AUTOMATON. */ of AUTOMATON. */
static void static void
...@@ -7738,54 +7324,6 @@ output_trans_table (automaton_t automaton) ...@@ -7738,54 +7324,6 @@ output_trans_table (automaton_t automaton)
VEC_free (vect_el_t,heap, transition_vect); VEC_free (vect_el_t,heap, transition_vect);
} }
/* Form and output vectors (comb, check, base or simple vect)
representing alts number table of AUTOMATON. The table is state x
ainsn -> number of possible alternative reservations by the
ainsn. */
static void
output_state_alts_table (automaton_t automaton)
{
size_t i;
arc_t arc;
vla_hwint_t state_alts_vect;
undefined_vect_el_value = 0; /* no alts when transition is not possible */
automaton->state_alts_table = create_state_ainsn_table (automaton);
/* Create vect of pointers to states ordered by num of transitions
from the state (state with the maximum num is the first). */
output_states_vect = 0;
pass_states (automaton, add_states_vect_el);
qsort (VEC_address (state_t, output_states_vect),
VEC_length (state_t, output_states_vect),
sizeof (state_t), compare_transition_els_num);
/* Create base, comb, and check vectors. */
state_alts_vect = 0;
for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
{
VEC_truncate (vect_el_t, state_alts_vect, 0);
for (arc = first_out_arc (VEC_index (state_t, output_states_vect, i));
arc != NULL;
arc = next_out_arc (arc))
{
gcc_assert (arc->insn);
if (arc->insn->first_ainsn_with_given_equivalence_num)
add_vect_el (&state_alts_vect, arc->insn, arc->state_alts);
}
add_vect (automaton->state_alts_table,
VEC_index (state_t, output_states_vect, i)->order_state_num,
state_alts_vect);
}
output_state_ainsn_table
(automaton->state_alts_table, "state insn alternatives",
output_state_alts_full_vect_name, output_state_alts_comb_vect_name,
output_state_alts_check_vect_name, output_state_alts_base_vect_name);
VEC_free (state_t,heap, output_states_vect);
VEC_free (vect_el_t,heap, state_alts_vect);
}
/* The current number of passing states to find minimal issue delay /* The current number of passing states to find minimal issue delay
value for an ainsn and state. */ value for an ainsn and state. */
static int curr_state_pass_num; static int curr_state_pass_num;
...@@ -8022,6 +7560,7 @@ output_reserved_units_table (automaton_t automaton) ...@@ -8022,6 +7560,7 @@ output_reserved_units_table (automaton_t automaton)
VEC_replace (vect_el_t, reserved_units_table, ri, x); VEC_replace (vect_el_t, reserved_units_table, ri, x);
} }
} }
fprintf (output_file, "\n#if %s\n", CPU_UNITS_QUERY_MACRO_NAME);
fprintf (output_file, "/* Vector for reserved units of states. */\n"); fprintf (output_file, "/* Vector for reserved units of states. */\n");
fprintf (output_file, "static const "); fprintf (output_file, "static const ");
output_range_type (output_file, 0, 255); output_range_type (output_file, 0, 255);
...@@ -8029,7 +7568,9 @@ output_reserved_units_table (automaton_t automaton) ...@@ -8029,7 +7568,9 @@ output_reserved_units_table (automaton_t automaton)
output_reserved_units_table_name (output_file, automaton); output_reserved_units_table_name (output_file, automaton);
fprintf (output_file, "[] = {\n"); fprintf (output_file, "[] = {\n");
output_vect (reserved_units_table); output_vect (reserved_units_table);
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n");
fprintf (output_file, "\n#endif /* #if %s */\n\n",
CPU_UNITS_QUERY_MACRO_NAME);
VEC_free (state_t,heap, output_states_vect); VEC_free (state_t,heap, output_states_vect);
VEC_free (vect_el_t,heap, reserved_units_table); VEC_free (vect_el_t,heap, reserved_units_table);
...@@ -8049,16 +7590,9 @@ output_tables (void) ...@@ -8049,16 +7590,9 @@ output_tables (void)
{ {
output_translate_vect (automaton); output_translate_vect (automaton);
output_trans_table (automaton); output_trans_table (automaton);
fprintf (output_file, "\n#if %s\n", AUTOMATON_STATE_ALTS_MACRO_NAME);
output_state_alts_table (automaton);
fprintf (output_file, "\n#endif /* #if %s */\n\n",
AUTOMATON_STATE_ALTS_MACRO_NAME);
output_min_issue_delay_table (automaton); output_min_issue_delay_table (automaton);
output_dead_lock_vect (automaton); output_dead_lock_vect (automaton);
fprintf (output_file, "\n#if %s\n\n", CPU_UNITS_QUERY_MACRO_NAME);
output_reserved_units_table (automaton); output_reserved_units_table (automaton);
fprintf (output_file, "\n#endif /* #if %s */\n\n",
CPU_UNITS_QUERY_MACRO_NAME);
} }
fprintf (output_file, "\n#define %s %d\n\n", ADVANCE_CYCLE_VALUE_NAME, fprintf (output_file, "\n#define %s %d\n\n", ADVANCE_CYCLE_VALUE_NAME,
DECL_INSN_RESERV (advance_cycle_insn_decl)->insn_num); DECL_INSN_RESERV (advance_cycle_insn_decl)->insn_num);
...@@ -8409,99 +7943,6 @@ output_trans_func (void) ...@@ -8409,99 +7943,6 @@ output_trans_func (void)
INTERNAL_TRANSITION_FUNC_NAME, INTERNAL_INSN_CODE_NAME, STATE_NAME); INTERNAL_TRANSITION_FUNC_NAME, INTERNAL_INSN_CODE_NAME, STATE_NAME);
} }
/* The function outputs a code for evaluation of alternative states
number for insns which have reservations in given AUTOMATA_LIST. */
static void
output_automata_list_state_alts_code (automata_list_el_t automata_list)
{
automata_list_el_t el;
automaton_t automaton;
fprintf (output_file, " {\n");
for (el = automata_list; el != NULL; el = el->next_automata_list_el)
if (comb_vect_p (el->automaton->state_alts_table))
{
fprintf (output_file, " int %s;\n", TEMPORARY_VARIABLE_NAME);
break;
}
for (el = automata_list; el != NULL; el = el->next_automata_list_el)
{
automaton = el->automaton;
if (comb_vect_p (automaton->state_alts_table))
{
fprintf (output_file, "\n %s = ", TEMPORARY_VARIABLE_NAME);
output_state_alts_base_vect_name (output_file, automaton);
fprintf (output_file, " [%s->", CHIP_PARAMETER_NAME);
output_chip_member_name (output_file, automaton);
fprintf (output_file, "] + ");
output_translate_vect_name (output_file, automaton);
fprintf (output_file, " [%s];\n", INTERNAL_INSN_CODE_NAME);
fprintf (output_file, " if (");
output_state_alts_check_vect_name (output_file, automaton);
fprintf (output_file, " [%s] != %s->",
TEMPORARY_VARIABLE_NAME, CHIP_PARAMETER_NAME);
output_chip_member_name (output_file, automaton);
fprintf (output_file, ")\n");
fprintf (output_file, " return 0;\n");
fprintf (output_file, " else\n");
fprintf (output_file,
(el == automata_list
? " %s = " : " %s += "),
RESULT_VARIABLE_NAME);
output_state_alts_comb_vect_name (output_file, automaton);
fprintf (output_file, " [%s];\n", TEMPORARY_VARIABLE_NAME);
}
else
{
fprintf (output_file,
(el == automata_list
? "\n %s = " : " %s += "),
RESULT_VARIABLE_NAME);
output_state_alts_full_vect_name (output_file, automaton);
fprintf (output_file, " [");
output_translate_vect_name (output_file, automaton);
fprintf (output_file, " [%s] + ", INTERNAL_INSN_CODE_NAME);
fprintf (output_file, "%s->", CHIP_PARAMETER_NAME);
output_chip_member_name (output_file, automaton);
fprintf (output_file, " * %d];\n",
automaton->insn_equiv_classes_num);
}
}
fprintf (output_file, " break;\n }\n\n");
}
/* Output function `internal_state_alts'. */
static void
output_internal_state_alts_func (void)
{
fprintf (output_file,
"static int\n%s (int %s, struct %s *%s)\n",
INTERNAL_STATE_ALTS_FUNC_NAME, INTERNAL_INSN_CODE_NAME,
CHIP_NAME, CHIP_PARAMETER_NAME);
fprintf (output_file, "{\n int %s;\n", RESULT_VARIABLE_NAME);
fprintf (output_file, "\n switch (%s)\n {\n", INTERNAL_INSN_CODE_NAME);
output_insn_code_cases (output_automata_list_state_alts_code);
fprintf (output_file,
"\n default:\n %s = 0;\n break;\n }\n",
RESULT_VARIABLE_NAME);
fprintf (output_file, " return %s;\n", RESULT_VARIABLE_NAME);
fprintf (output_file, "}\n\n");
}
/* The function outputs PHR interface function `state_alts'. */
static void
output_state_alts_func (void)
{
fprintf (output_file, "int\n%s (%s, %s)\n\t%s %s;\n\trtx %s;\n",
STATE_ALTS_FUNC_NAME, STATE_NAME, INSN_PARAMETER_NAME,
STATE_TYPE_NAME, STATE_NAME, INSN_PARAMETER_NAME);
fprintf (output_file, "{\n int %s;\n", INTERNAL_INSN_CODE_NAME);
output_internal_insn_code_evaluation (INSN_PARAMETER_NAME,
INTERNAL_INSN_CODE_NAME, 0);
fprintf (output_file, " return %s (%s, %s);\n}\n\n",
INTERNAL_STATE_ALTS_FUNC_NAME, INTERNAL_INSN_CODE_NAME, STATE_NAME);
}
/* Output function `min_issue_delay'. */ /* Output function `min_issue_delay'. */
static void static void
output_min_issue_delay_func (void) output_min_issue_delay_func (void)
...@@ -9168,8 +8609,8 @@ output_state_arcs (state_t state) ...@@ -9168,8 +8609,8 @@ output_state_arcs (state_t state)
ainsn = ainsn->next_same_reservs_insn; ainsn = ainsn->next_same_reservs_insn;
} }
while (ainsn != NULL); while (ainsn != NULL);
fprintf (output_description_file, " %d (%d)\n", fprintf (output_description_file, " %d \n",
arc->to_state->order_state_num, arc->state_alts); arc->to_state->order_state_num);
} }
fprintf (output_description_file, "\n"); fprintf (output_description_file, "\n");
} }
...@@ -9266,8 +8707,6 @@ output_statistics (FILE *f) ...@@ -9266,8 +8707,6 @@ output_statistics (FILE *f)
#ifndef NDEBUG #ifndef NDEBUG
int transition_comb_vect_els = 0; int transition_comb_vect_els = 0;
int transition_full_vect_els = 0; int transition_full_vect_els = 0;
int state_alts_comb_vect_els = 0;
int state_alts_full_vect_els = 0;
int min_issue_delay_vect_els = 0; int min_issue_delay_vect_els = 0;
int locked_states = 0; int locked_states = 0;
#endif #endif
...@@ -9301,12 +8740,6 @@ output_statistics (FILE *f) ...@@ -9301,12 +8740,6 @@ output_statistics (FILE *f)
(comb_vect_p (automaton->trans_table) (comb_vect_p (automaton->trans_table)
? "use comb vect" : "use simple vect")); ? "use comb vect" : "use simple vect"));
fprintf fprintf
(f, "%5ld state alts comb vector els, %5ld state alts table els: %s\n",
(long) VEC_length (vect_el_t, automaton->state_alts_table->comb_vect),
(long) VEC_length (vect_el_t, automaton->state_alts_table->full_vect),
(comb_vect_p (automaton->state_alts_table)
? "use comb vect" : "use simple vect"));
fprintf
(f, "%5ld min delay table els, compression factor %d\n", (f, "%5ld min delay table els, compression factor %d\n",
(long) states_num * automaton->insn_equiv_classes_num, (long) states_num * automaton->insn_equiv_classes_num,
automaton->min_issue_delay_table_compression_factor); automaton->min_issue_delay_table_compression_factor);
...@@ -9314,10 +8747,6 @@ output_statistics (FILE *f) ...@@ -9314,10 +8747,6 @@ output_statistics (FILE *f)
+= VEC_length (vect_el_t, automaton->trans_table->comb_vect); += VEC_length (vect_el_t, automaton->trans_table->comb_vect);
transition_full_vect_els transition_full_vect_els
+= VEC_length (vect_el_t, automaton->trans_table->full_vect); += VEC_length (vect_el_t, automaton->trans_table->full_vect);
state_alts_comb_vect_els
+= VEC_length (vect_el_t, automaton->state_alts_table->comb_vect);
state_alts_full_vect_els
+= VEC_length (vect_el_t, automaton->state_alts_table->full_vect);
min_issue_delay_vect_els min_issue_delay_vect_els
+= states_num * automaton->insn_equiv_classes_num; += states_num * automaton->insn_equiv_classes_num;
locked_states locked_states
...@@ -9331,9 +8760,6 @@ output_statistics (FILE *f) ...@@ -9331,9 +8760,6 @@ output_statistics (FILE *f)
allocated_alt_states_num); allocated_alt_states_num);
fprintf (f, "%5d all transition comb vector els, %5d all trans table els\n", fprintf (f, "%5d all transition comb vector els, %5d all trans table els\n",
transition_comb_vect_els, transition_full_vect_els); transition_comb_vect_els, transition_full_vect_els);
fprintf
(f, "%5d all state alts comb vector els, %5d all state alts table els\n",
state_alts_comb_vect_els, state_alts_full_vect_els);
fprintf (f, "%5d all min delay table els\n", min_issue_delay_vect_els); fprintf (f, "%5d all min delay table els\n", min_issue_delay_vect_els);
fprintf (f, "%5d all locked states\n", locked_states); fprintf (f, "%5d all locked states\n", locked_states);
#endif #endif
...@@ -9386,160 +8812,6 @@ generate (void) ...@@ -9386,160 +8812,6 @@ generate (void)
/* The following function creates insn attribute whose values are
number alternatives in insn reservations. */
static void
make_insn_alts_attr (void)
{
int i, insn_num;
decl_t decl;
rtx condexp;
condexp = rtx_alloc (COND);
XVEC (condexp, 0) = rtvec_alloc ((description->insns_num - 1) * 2);
XEXP (condexp, 1) = make_numeric_value (0);
for (i = insn_num = 0; i < description->decls_num; i++)
{
decl = description->decls [i];
if (decl->mode == dm_insn_reserv && decl != advance_cycle_insn_decl)
{
XVECEXP (condexp, 0, 2 * insn_num)
= DECL_INSN_RESERV (decl)->condexp;
XVECEXP (condexp, 0, 2 * insn_num + 1)
= make_numeric_value
(DECL_INSN_RESERV (decl)->transformed_regexp->mode != rm_oneof
? 1 : REGEXP_ONEOF (DECL_INSN_RESERV (decl)
->transformed_regexp)->regexps_num);
insn_num++;
}
}
gcc_assert (description->insns_num == insn_num + 1);
make_internal_attr (attr_printf (sizeof ("*")
+ strlen (INSN_ALTS_FUNC_NAME) + 1,
"*%s", INSN_ALTS_FUNC_NAME),
condexp, ATTR_NONE);
}
/* The following function creates attribute which is order number of
insn in pipeline hazard description translator. */
static void
make_internal_dfa_insn_code_attr (void)
{
int i, insn_num;
decl_t decl;
rtx condexp;
condexp = rtx_alloc (COND);
XVEC (condexp, 0) = rtvec_alloc ((description->insns_num - 1) * 2);
XEXP (condexp, 1)
= make_numeric_value (DECL_INSN_RESERV (advance_cycle_insn_decl)
->insn_num + 1);
for (i = insn_num = 0; i < description->decls_num; i++)
{
decl = description->decls [i];
if (decl->mode == dm_insn_reserv && decl != advance_cycle_insn_decl)
{
XVECEXP (condexp, 0, 2 * insn_num)
= DECL_INSN_RESERV (decl)->condexp;
XVECEXP (condexp, 0, 2 * insn_num + 1)
= make_numeric_value (DECL_INSN_RESERV (decl)->insn_num);
insn_num++;
}
}
gcc_assert (description->insns_num == insn_num + 1);
make_internal_attr
(attr_printf (sizeof ("*")
+ strlen (INTERNAL_DFA_INSN_CODE_FUNC_NAME) + 1,
"*%s", INTERNAL_DFA_INSN_CODE_FUNC_NAME),
condexp, ATTR_STATIC);
}
/* The following function creates attribute which order number of insn
in pipeline hazard description translator. */
static void
make_default_insn_latency_attr (void)
{
int i, insn_num;
decl_t decl;
rtx condexp;
condexp = rtx_alloc (COND);
XVEC (condexp, 0) = rtvec_alloc ((description->insns_num - 1) * 2);
XEXP (condexp, 1) = make_numeric_value (0);
for (i = insn_num = 0; i < description->decls_num; i++)
{
decl = description->decls [i];
if (decl->mode == dm_insn_reserv && decl != advance_cycle_insn_decl)
{
XVECEXP (condexp, 0, 2 * insn_num)
= DECL_INSN_RESERV (decl)->condexp;
XVECEXP (condexp, 0, 2 * insn_num + 1)
= make_numeric_value (DECL_INSN_RESERV (decl)->default_latency);
insn_num++;
}
}
gcc_assert (description->insns_num == insn_num + 1);
make_internal_attr (attr_printf (sizeof ("*")
+ strlen (INSN_DEFAULT_LATENCY_FUNC_NAME)
+ 1, "*%s", INSN_DEFAULT_LATENCY_FUNC_NAME),
condexp, ATTR_NONE);
}
/* The following function creates attribute which returns 1 if given
output insn has bypassing and 0 otherwise. */
static void
make_bypass_attr (void)
{
int i, bypass_insn;
int bypass_insns_num = 0;
decl_t decl;
rtx result_rtx;
for (i = 0; i < description->decls_num; i++)
{
decl = description->decls [i];
if (decl->mode == dm_insn_reserv
&& DECL_INSN_RESERV (decl)->condexp != NULL
&& DECL_INSN_RESERV (decl)->bypass_list != NULL)
bypass_insns_num++;
}
if (bypass_insns_num == 0)
result_rtx = make_numeric_value (0);
else
{
result_rtx = rtx_alloc (COND);
XVEC (result_rtx, 0) = rtvec_alloc (bypass_insns_num * 2);
XEXP (result_rtx, 1) = make_numeric_value (0);
for (i = bypass_insn = 0; i < description->decls_num; i++)
{
decl = description->decls [i];
if (decl->mode == dm_insn_reserv
&& DECL_INSN_RESERV (decl)->condexp != NULL
&& DECL_INSN_RESERV (decl)->bypass_list != NULL)
{
XVECEXP (result_rtx, 0, 2 * bypass_insn)
= DECL_INSN_RESERV (decl)->condexp;
XVECEXP (result_rtx, 0, 2 * bypass_insn + 1)
= make_numeric_value (1);
bypass_insn++;
}
}
}
make_internal_attr (attr_printf (sizeof ("*")
+ strlen (BYPASS_P_FUNC_NAME) + 1,
"*%s", BYPASS_P_FUNC_NAME),
result_rtx, ATTR_NONE);
}
/* This page mainly contains top level functions of pipeline hazards /* This page mainly contains top level functions of pipeline hazards
description translator. */ description translator. */
...@@ -9582,7 +8854,7 @@ base_file_name (const char *file_name) ...@@ -9582,7 +8854,7 @@ base_file_name (const char *file_name)
/* The following is top level function to initialize the work of /* The following is top level function to initialize the work of
pipeline hazards description translator. */ pipeline hazards description translator. */
void static void
initiate_automaton_gen (int argc, char **argv) initiate_automaton_gen (int argc, char **argv)
{ {
const char *base_name; const char *base_name;
...@@ -9756,7 +9028,7 @@ form_important_insn_automata_lists (void) ...@@ -9756,7 +9028,7 @@ form_important_insn_automata_lists (void)
/* The following is top level function to generate automat(a,on) for /* The following is top level function to generate automat(a,on) for
fast recognition of pipeline hazards. */ fast recognition of pipeline hazards. */
void static void
expand_automata (void) expand_automata (void)
{ {
int i; int i;
...@@ -9796,31 +9068,15 @@ expand_automata (void) ...@@ -9796,31 +9068,15 @@ expand_automata (void)
if (!have_error) if (!have_error)
{ {
form_important_insn_automata_lists (); form_important_insn_automata_lists ();
if (progress_flag)
fprintf (stderr, "Generation of attributes...");
make_internal_dfa_insn_code_attr ();
make_insn_alts_attr ();
make_default_insn_latency_attr ();
make_bypass_attr ();
if (progress_flag)
fprintf (stderr, "done\n");
} }
ticker_off (&generation_time); ticker_off (&generation_time);
ticker_off (&all_time);
if (progress_flag)
fprintf (stderr, "All other genattrtab stuff...");
} }
/* The following is top level function to output PHR and to finish /* The following is top level function to output PHR and to finish
work with pipeline description translator. */ work with pipeline description translator. */
void static void
write_automata (void) write_automata (void)
{ {
if (progress_flag)
fprintf (stderr, "done\n");
if (have_error)
fatal ("Errors in DFA description");
ticker_on (&all_time);
output_time = create_ticker (); output_time = create_ticker ();
if (progress_flag) if (progress_flag)
fprintf (stderr, "Forming and outputting automata tables..."); fprintf (stderr, "Forming and outputting automata tables...");
...@@ -9840,11 +9096,6 @@ write_automata (void) ...@@ -9840,11 +9096,6 @@ write_automata (void)
DFA_INSN_CODES_LENGTH_VARIABLE_NAME); DFA_INSN_CODES_LENGTH_VARIABLE_NAME);
output_dfa_insn_code_func (); output_dfa_insn_code_func ();
output_trans_func (); output_trans_func ();
fprintf (output_file, "\n#if %s\n\n", AUTOMATON_STATE_ALTS_MACRO_NAME);
output_internal_state_alts_func ();
output_state_alts_func ();
fprintf (output_file, "\n#endif /* #if %s */\n\n",
AUTOMATON_STATE_ALTS_MACRO_NAME);
output_min_issue_delay_func (); output_min_issue_delay_func ();
output_internal_dead_lock_func (); output_internal_dead_lock_func ();
output_dead_lock_func (); output_dead_lock_func ();
...@@ -9915,3 +9166,100 @@ write_automata (void) ...@@ -9915,3 +9166,100 @@ write_automata (void)
if (have_error && output_description_file != NULL) if (have_error && output_description_file != NULL)
remove (output_description_file_name); remove (output_description_file_name);
} }
int
main (int argc, char **argv)
{
rtx desc;
progname = "genautomata";
if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
return (FATAL_EXIT_CODE);
initiate_automaton_gen (argc, argv);
while (1)
{
int lineno;
int insn_code_number;
desc = read_md_rtx (&lineno, &insn_code_number);
if (desc == NULL)
break;
switch (GET_CODE (desc))
{
case DEFINE_CPU_UNIT:
gen_cpu_unit (desc);
break;
case DEFINE_QUERY_CPU_UNIT:
gen_query_cpu_unit (desc);
break;
case DEFINE_BYPASS:
gen_bypass (desc);
break;
case EXCLUSION_SET:
gen_excl_set (desc);
break;
case PRESENCE_SET:
gen_presence_set (desc);
break;
case FINAL_PRESENCE_SET:
gen_final_presence_set (desc);
break;
case ABSENCE_SET:
gen_absence_set (desc);
break;
case FINAL_ABSENCE_SET:
gen_final_absence_set (desc);
break;
case DEFINE_AUTOMATON:
gen_automaton (desc);
break;
case AUTOMATA_OPTION:
gen_automata_option (desc);
break;
case DEFINE_RESERVATION:
gen_reserv (desc);
break;
case DEFINE_INSN_RESERVATION:
gen_insn_reserv (desc);
break;
default:
break;
}
}
if (have_error)
return FATAL_EXIT_CODE;
puts ("/* Generated automatically by the program `genautomata'\n"
" from the machine description file `md'. */\n\n"
"#include \"config.h\"\n"
"#include \"system.h\"\n"
"#include \"coretypes.h\"\n"
"#include \"tm.h\"\n"
"#include \"rtl.h\"\n"
"#include \"insn-attr.h\"\n");
if (VEC_length (decl_t, decls) > 0)
{
expand_automata ();
write_automata ();
}
fflush (stdout);
return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment