Add tile generation algorithm fixes

From-SVN: r258522
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 0e981f4..c29d605 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -3482,12 +3482,12 @@
 \
   {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 f887af2..50a26fb 100644
--- a/gcc/genvect-inst-tiles.c
+++ b/gcc/genvect-inst-tiles.c
@@ -762,15 +762,10 @@
      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 @@
   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 @@
   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 @@
       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 %d: return get_REG_%d_terminal_state ();\n",
-	(1 << i), (1 << i));
+      printf ("case %smode: return get_REG_%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");
+
+  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 %smode: return get_CONST_%s_terminal_state ();\n",type_name[i], type_name[i]);
+    }
+  printf ("    default:\n      gcc_assert (!\"Type not supported\");\n");
+  printf ("  }\n}\n\n");
+
+
 }
 
 void
@@ -1865,13 +1870,14 @@
   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 @@
   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 03e2625..f8eeec7 100644
--- a/gcc/tree-vect-unified.c
+++ b/gcc/tree-vect-unified.c
@@ -2415,7 +2415,7 @@
      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 @@
 			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 @@
       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 @@
   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 @@
       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 c1523ca..0b3f3c7 100644
--- a/gcc/tree-vect-unified.h
+++ b/gcc/tree-vect-unified.h
@@ -364,11 +364,11 @@
 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);