aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSameera Deshpande <sameera.deshpande@imgtec.com>2018-03-14 11:22:05 +0000
committerSameera Deshpande <sameera.deshpande@imgtec.com>2018-03-14 11:22:05 +0000
commit5fe9342a9c480a3b5fae295e4e99c4dbebf11c92 (patch)
treee78975e8148dca538f3498bdce265fc6faba24fa
parent924298afc0c04c96c1861f823ebd9f4092d6044f (diff)
Add tile generation algorithm fixesunified-autovect
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/unified-autovect@258522 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/config/mips/mips.h4
-rw-r--r--gcc/genvect-inst-tiles.c50
-rw-r--r--gcc/tree-vect-unified.c14
-rw-r--r--gcc/tree-vect-unified.h6
4 files changed, 40 insertions, 34 deletions
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 0e981f4bc35..c29d605082b 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -3482,12 +3482,12 @@ struct GTY(()) machine_function {
\
{2, 8, 8, "HI", (int[8]){0,8,2,10,4,12,6,14}, 1, "ILVEV.H", "RRR", NULL, NULL}, \
{2, 8, 8, "HI", (int[8]){1,9,3,11,5,13,7,15}, 1, "ILVOD.H", "RRR", NULL, NULL}, \
- {2, 8, 8, "HI", (int[8]){0,2,4,6,8,10,12,14}, 1, "PCKEV.H", "RRR", NULL, NULL}, \
+ /*{2, 8, 8, "HI", (int[8]){0,2,4,6,8,10,12,14}, 1, "PCKEV.H", "RRR", NULL, NULL}, \
{2, 8, 8, "HI", (int[8]){1,3,5,7,9,11,13,15}, 1, "PCKOD.H", "RRR", NULL, NULL}, \
{2, 8, 8, "HI", (int[8]){0,8,1,9,2,10,3,11}, 1, "ILVR.H", "RRR", NULL, NULL}, \
{2, 8, 8, "HI", (int[8]){4,12,5,13,6,14,7,15}, 1, "ILVL.H", "RRR", NULL, NULL}, \
\
- /*{2, 16, 16, "QI", (int[16]){0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30}, 1, \
+ {2, 16, 16, "QI", (int[16]){0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30}, 1, \
"ILVEV.Q", "RRR", NULL, NULL}, \
{2, 16, 16, "QI", (int[16]){1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31}, 1, \
"ILVOD.Q", "RRR", NULL, NULL}, \
diff --git a/gcc/genvect-inst-tiles.c b/gcc/genvect-inst-tiles.c
index f887af2f5bd..50a26fb024a 100644
--- a/gcc/genvect-inst-tiles.c
+++ b/gcc/genvect-inst-tiles.c
@@ -762,15 +762,10 @@ create_rule_for_ptree (struct primop_tree *ptree, int spec_idx, int out_vecsize,
if (spec_idx != -1)
{
sprintf (buf, "reg_%s", type_name[type]);
- sprintf (buf1, "mem_%s", type_name[type]);
- sprintf (buf2, "const_%s", type_name[type]);
ruleno = create_rule_NT_to_NT (
- target_type == 'R' ?
- create_non_terminal (buf, type) :
- target_type == 'M' ?
- create_non_terminal (buf1, type) :
- create_non_terminal (buf2, type), nt, -1, 0);
+ create_non_terminal (buf, type),
+ nt, -1, 0);
}
return nt;
}
@@ -1664,10 +1659,10 @@ print_trans_map ()
for (j = 0; j < op_list.length (); j++)
{
if (op_list[j]->pcode == POP_ILV)
- printf (" int %s_%s_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[i]->type],
+ printf (" int %s_%s_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[j]->type],
op_list[j]->arity);
else
- printf (" int %s_%s_%d_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[i]->type],
+ printf (" int %s_%s_%d_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[j]->type],
op_list[j]->arity, op_list[j]->sel);
for (k = 0; k < op_list[j]->act_arity; k++)
@@ -1682,10 +1677,10 @@ print_trans_map ()
for (j = 0; j < op_list.length (); j++)
{
if (op_list[j]->pcode == POP_ILV)
- sprintf (str, " transition.%s__%s_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[i]->type],
+ sprintf (str, " transition.%s_%s_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[j]->type],
op_list[j]->arity);
else
- sprintf (str, " transition.%s_%s_%d_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[i]->type],
+ sprintf (str, " transition.%s_%s_%d_%d", tree_code_name[op_list[j]->pcode], type_name[op_list[j]->type],
op_list[j]->arity, op_list[j]->sel);
for (i = 0; i < op_list[j]->index_map.length (); i++)
@@ -1750,15 +1745,25 @@ print_terminals ()
printf ("}\n\n");
}
- printf ("int get_REG_terminal_state (int vector_size)\n{\n");
- printf (" switch (vector_size)\n {\n");
- for (i = 1; i <= floor_log2 (MAX_VECTOR_SIZE); i++)
+ printf ("int get_REG_terminal_state (int type)\n{\n");
+ printf (" switch (type)\n {\n");
+ for (i = 0; i < type_name.length (); i++)
+ {
+ printf ("case %smode: return get_REG_%s_terminal_state ();\n",type_name[i], type_name[i]);
+ }
+ printf (" default:\n gcc_assert (!\"Type not supported\");\n");
+ printf (" }\n}\n\n");
+
+ printf ("int get_CONST_terminal_state (int type)\n{\n");
+ printf (" switch (type)\n {\n");
+ for (i = 0; i < type_name.length (); i++)
{
- printf ("case %d: return get_REG_%d_terminal_state ();\n",
- (1 << i), (1 << i));
+ printf ("case %smode: return get_CONST_%s_terminal_state ();\n",type_name[i], type_name[i]);
}
- printf (" default:\n gcc_assert (!\"vector size not supported\");\n");
+ printf (" default:\n gcc_assert (!\"Type not supported\");\n");
printf (" }\n}\n\n");
+
+
}
void
@@ -1865,13 +1870,14 @@ print_state_fn_for_ilv ()
int i, j;
char *str = (char *) xcalloc (100, sizeof (char));
printf ("int\ntransition_state_for_ilv");
- printf (" (int act_arity, vec<int> state_idx)\n{\n");
+ printf (" (int act_arity, vec<int> state_idx, int type)\n{\n");
for (i = 0; i < op_list.length (); i++)
{
if (op_list[i]->pcode == POP_ILV)
{
- printf (" if (act_arity == %d)\n {\n", op_list[i]->arity);
+ printf (" if (act_arity == %d && type == %smode)\n {\n", op_list[i]->arity, type_name[op_list[i]->type]);
+ sprintf (str, "");
for (j = 0; j < op_list[i]->act_arity; j++)
{
printf ("\tif (rep_state_map[MAP_OP_ILV_%s_%d_%d]",
@@ -1896,15 +1902,15 @@ print_state_fn_for_extr ()
int i;
printf ("int\ntransition_state_for_extr");
- printf (" (int act_arity, int sel, int state_idx)\n{\n");
+ printf (" (int act_arity, int sel, int state_idx, int type)\n{\n");
for (i = 0; i < op_list.length (); i++)
{
if (op_list[i]->pcode == POP_EXTR)
{
- printf (" if (act_arity == %d && sel == %d)\n {\n",
+ printf (" if (act_arity == %d && sel == %d && type == %smode)\n {\n",
op_list[i]->arity,
- op_list[i]->sel);
+ op_list[i]->sel, type_name[op_list[i]->type]);
printf (" if (rep_state_map[MAP_OP_EXTR_%s_%d_%d]",
type_name[op_list[i]->type], op_list[i]->arity, op_list[i]->sel);
printf ("[state_idx] == -1)\n");
diff --git a/gcc/tree-vect-unified.c b/gcc/tree-vect-unified.c
index 03e26254fd4..f8eeec7b33a 100644
--- a/gcc/tree-vect-unified.c
+++ b/gcc/tree-vect-unified.c
@@ -2415,7 +2415,7 @@ get_transition_state (struct primop_tree *ptree)
registers. */
if (PT_NODE_OP (ptree) < MAX_TREE_CODES)
{
- return get_REG_terminal_state (GET_MODE_SIZE (TYPE_MODE (PT_VEC_TYPE (ptree))));
+ return get_REG_terminal_state (GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree))));
}
/* We need not handle POP_PH as it is only for tile construction. POP_CONCAT
@@ -2434,12 +2434,12 @@ get_transition_state (struct primop_tree *ptree)
PT_AUX (get_child_at_index (ptree, i)));
}
- return transition_state_for_ilv (PT_DIVISION (ptree), idx);
+ return transition_state_for_ilv (PT_DIVISION (ptree), idx, GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree))));
case POP_EXTR:
return transition_state_for_extr (PT_DIVISION (ptree),
PT_OPERAND_SELECTOR (ptree),
- PT_AUX (get_child_at_index (ptree, 0)));
+ PT_AUX (get_child_at_index (ptree, 0)), GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree))));
default:
gcc_assert (!"Operator not handled.");
@@ -2458,11 +2458,11 @@ label_permute_tree (struct primop_tree *ptree)
switch (PT_NODE_OP (ptree))
{
case POP_MEMREF:
- PT_AUX (ptree) = get_REG_terminal_state (GET_MODE_SIZE (TYPE_MODE (PT_VEC_TYPE (ptree))));
+ PT_AUX (ptree) = get_REG_terminal_state (GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree))));
printf ("tree : %d >> state : %d\n", PT_PID (ptree), PT_AUX (ptree));
break;
case POP_CONST:
- PT_AUX (ptree) = get_CONST_terminal_state ();
+ PT_AUX (ptree) = get_CONST_terminal_state (GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree))));
printf ("tree : %d >> state : %d\n", PT_PID (ptree), PT_AUX (ptree));
break;
default:
@@ -2487,7 +2487,7 @@ label_permute_tree (struct primop_tree *ptree)
if (PT_AUX (ptree) == -1)
{
printf ("\n labeled to REG\n");
- PT_AUX (ptree) = (get_REG_terminal_state (GET_MODE_SIZE (TYPE_MODE (PT_VEC_TYPE (ptree)))));
+ PT_AUX (ptree) = (get_REG_terminal_state (GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (ptree)))));
}
else
{
@@ -2538,7 +2538,7 @@ unified_perm_tree_code_generation (struct ITER_node *inode)
reset_aux_field (tmp_tree);
ret = label_permute_tree (tmp_tree);
if (ret == true)
- ret = reduce_permute_tree (tmp_tree, get_REG_terminal_state (GET_MODE_SIZE (TYPE_MODE (PT_VEC_TYPE (tmp_tree)))));
+ ret = reduce_permute_tree (tmp_tree, get_REG_terminal_state (GET_MODE_INNER (TYPE_MODE (PT_VEC_TYPE (tmp_tree)))));
return ret;
}
diff --git a/gcc/tree-vect-unified.h b/gcc/tree-vect-unified.h
index c1523ca1ad5..0b3f3c7f9a1 100644
--- a/gcc/tree-vect-unified.h
+++ b/gcc/tree-vect-unified.h
@@ -364,11 +364,11 @@ extern inline void set_stmt_attr (gimple *, struct stmt_attr *);
extern inline struct stmt_attr *get_stmt_attr (gimple *);
extern struct primop_tree * unity_redundancy_elimination (struct primop_tree *);
extern void unif_vect_init_funct (void);
-extern vec<int> transition_state_for_extr (int, int, int);
-extern vec<int> transition_state_for_ilv (int, vec<int>);
+extern int transition_state_for_extr (int, int, int, int);
+extern int transition_state_for_ilv (int, vec<int>, int);
extern int get_REG_terminal_state (int);
extern bool is_NT2T_rule (int);
-extern int get_CONST_terminal_state ();
+extern int get_CONST_terminal_state (int);
extern int get_MEM_terminal_state ();
//extern int get_goal_nonterminal_state (int);
extern int get_rule_number (struct primop_tree *, int);