Split bm_has_any() into bm_has_any_load() and bm_has_any_store().

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7825 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_bitmap.c b/exp-drd/drd_bitmap.c
index 03ed89b..097b43d 100644
--- a/exp-drd/drd_bitmap.c
+++ b/exp-drd/drd_bitmap.c
@@ -280,22 +280,110 @@
   return True;
 }
 
-Bool bm_has_any(const struct bitmap* const bm,
-                const Addr a1, const Addr a2,
-                const BmAccessTypeT access_type)
+Bool bm_has_any_load(const struct bitmap* const bm,
+                     const Addr a1, const Addr a2)
 {
-  Addr b;
+  Addr b, b_next;
 
   tl_assert(bm);
 
-  for (b = a1; b < a2; b++)
+  for (b = a1; b < a2; b = b_next)
   {
-    if (bm_has_1(bm, b, access_type))
+    const struct bitmap2* bm2 = bm2_lookup(bm, b >> ADDR0_BITS);
+
+    b_next = (b & ~ADDR0_MASK) + ADDR0_COUNT;
+    if (b_next > a2)
     {
-      return True;
+      b_next = a2;
+    }
+
+    if (bm2)
+    {
+      Addr b_start;
+      Addr b_end;
+      UWord b0;
+      const struct bitmap1* const p1 = &bm2->bm1;
+
+      if ((bm2->addr << ADDR0_BITS) < a1)
+        b_start = a1;
+      else
+        if ((bm2->addr << ADDR0_BITS) < a2)
+          b_start = (bm2->addr << ADDR0_BITS);
+        else
+          break;
+      tl_assert(a1 <= b_start && b_start <= a2);
+
+      if ((bm2->addr << ADDR0_BITS) + ADDR0_COUNT < a2)
+        b_end = (bm2->addr << ADDR0_BITS) + ADDR0_COUNT;
+      else
+        b_end = a2;
+      tl_assert(a1 <= b_end && b_end <= a2);
+      tl_assert(b_start < b_end);
+      tl_assert((b_start & ADDR0_MASK) <= ((b_end - 1) & ADDR0_MASK));
+      
+      for (b0 = b_start & ADDR0_MASK; b0 <= ((b_end-1) & ADDR0_MASK); b0++)
+      {
+        if (bm0_is_set(p1->bm0_r, b0))
+        {
+          return True;
+        }
+      }
     }
   }
-  return False;
+  return 0;
+}
+
+Bool bm_has_any_store(const struct bitmap* const bm,
+                      const Addr a1, const Addr a2)
+{
+  Addr b, b_next;
+
+  tl_assert(bm);
+
+  for (b = a1; b < a2; b = b_next)
+  {
+    const struct bitmap2* bm2 = bm2_lookup(bm, b >> ADDR0_BITS);
+
+    b_next = (b & ~ADDR0_MASK) + ADDR0_COUNT;
+    if (b_next > a2)
+    {
+      b_next = a2;
+    }
+
+    if (bm2)
+    {
+      Addr b_start;
+      Addr b_end;
+      UWord b0;
+      const struct bitmap1* const p1 = &bm2->bm1;
+
+      if ((bm2->addr << ADDR0_BITS) < a1)
+        b_start = a1;
+      else
+        if ((bm2->addr << ADDR0_BITS) < a2)
+          b_start = (bm2->addr << ADDR0_BITS);
+        else
+          break;
+      tl_assert(a1 <= b_start && b_start <= a2);
+
+      if ((bm2->addr << ADDR0_BITS) + ADDR0_COUNT < a2)
+        b_end = (bm2->addr << ADDR0_BITS) + ADDR0_COUNT;
+      else
+        b_end = a2;
+      tl_assert(a1 <= b_end && b_end <= a2);
+      tl_assert(b_start < b_end);
+      tl_assert((b_start & ADDR0_MASK) <= ((b_end - 1) & ADDR0_MASK));
+      
+      for (b0 = b_start & ADDR0_MASK; b0 <= ((b_end-1) & ADDR0_MASK); b0++)
+      {
+        if (bm0_is_set(p1->bm0_w, b0))
+        {
+          return True;
+        }
+      }
+    }
+  }
+  return 0;
 }
 
 /* Return a non-zero value if there is a read access, write access or both */