genautomata.c (add_vect): Speedup by using integers as bit-vectors for walking throug...
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 16 Jul 2004 08:12:11 +0000 (10:12 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 16 Jul 2004 08:12:11 +0000 (10:12 +0200)
        * genautomata.c (add_vect): Speedup by using integers as
        bit-vectors for walking through the comb_vect and finding
        a match.

From-SVN: r84811

gcc/ChangeLog
gcc/genautomata.c

index 52c646fe2efd4e7bbd4bf562499c7cef764443e1..532695d03dd130c5a38e69c3a29e4fe76af936b2 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-16  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * genautomata.c (add_vect): Speedup by using integers as
+       bit-vectors for walking through the comb_vect and finding
+       a match.
+
 2004-07-16  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips.c (mips_zero_if_equal): Only use XORs if the second
index 88f7a91c3cc1a27309d22f897fb9ce8eca0fa928..292a2de14006d37b5a70996e37afe58b6366f478 100644 (file)
@@ -7578,6 +7578,7 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
   int no_state_value;
   vect_el_t vect_el;
   int i;
+  unsigned long vect_mask, comb_vect_mask;
 
   if (vect_length == 0)
     abort ();
@@ -7599,23 +7600,77 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
        first_unempty_vect_index++)
     if (vect [first_unempty_vect_index] != undefined_vect_el_value)
       break;
+
   /* Search for the place in comb vect for the inserted vect.  */
-  for (comb_vect_index = 0;
-       comb_vect_index < comb_vect_els_num;
-       comb_vect_index++)
-    {
-      for (vect_index = first_unempty_vect_index;
-           vect_index < vect_length
-             && vect_index + comb_vect_index < comb_vect_els_num;
-           vect_index++)
-        if (vect [vect_index] != undefined_vect_el_value
-            && (comb_vect_start [vect_index + comb_vect_index]
-               != undefined_vect_el_value))
-          break;
-      if (vect_index >= vect_length
-          || vect_index + comb_vect_index >= comb_vect_els_num)
-        break;
+
+  /* Slow case.  */
+  if (vect_length - first_unempty_vect_index >= SIZEOF_LONG * CHAR_BIT)
+    {
+      for (comb_vect_index = 0;
+           comb_vect_index < comb_vect_els_num;
+           comb_vect_index++)
+        {
+          for (vect_index = first_unempty_vect_index;
+               vect_index < vect_length
+               && vect_index + comb_vect_index < comb_vect_els_num;
+               vect_index++)
+            if (vect [vect_index] != undefined_vect_el_value
+                && (comb_vect_start [vect_index + comb_vect_index]
+                   != undefined_vect_el_value))
+              break;
+          if (vect_index >= vect_length
+              || vect_index + comb_vect_index >= comb_vect_els_num)
+            break;
+        }
+      goto found;
+    }
+
+  /* Fast case.  */
+  vect_mask = 0;
+  for (vect_index = first_unempty_vect_index;
+       vect_index < vect_length;
+       vect_index++)
+    {
+      vect_mask = vect_mask << 1;
+      if (vect [vect_index] != undefined_vect_el_value)
+       vect_mask |= 1;
     }
+
+  /* Search for the place in comb vect for the inserted vect.  */
+  comb_vect_index = 0;
+  if (comb_vect_els_num == 0)
+    goto found;
+
+  comb_vect_mask = 0;
+  for (vect_index = first_unempty_vect_index;
+       vect_index < vect_length && vect_index < comb_vect_els_num;
+       vect_index++)
+    {
+      comb_vect_mask <<= 1;
+      if (vect_index + comb_vect_index < comb_vect_els_num
+         && comb_vect_start [vect_index + comb_vect_index]
+            != undefined_vect_el_value)
+       comb_vect_mask |= 1;
+    }
+  if ((vect_mask & comb_vect_mask) == 0)
+    goto found;
+
+  for (comb_vect_index = 1, i = vect_length; i < comb_vect_els_num;
+       comb_vect_index++, i++)
+    {
+      comb_vect_mask = (comb_vect_mask << 1) | 1;
+      comb_vect_mask ^= comb_vect_start [i] == undefined_vect_el_value;
+      if ((vect_mask & comb_vect_mask) == 0)
+       goto found;
+    }
+  for ( ; comb_vect_index < comb_vect_els_num; comb_vect_index++)
+    {
+      comb_vect_mask <<= 1;
+      if ((vect_mask & comb_vect_mask) == 0)
+       goto found;
+    }
+
+found:
   /* Slot was found.  */
   additional_els_num = comb_vect_index + real_vect_length - comb_vect_els_num;
   if (additional_els_num < 0)