|
From: <sv...@va...> - 2009-05-09 19:59:52
|
Author: bart
Date: 2009-05-09 20:59:48 +0100 (Sat, 09 May 2009)
New Revision: 9807
Log:
Made behavior of bitmap manipulation functions more consistent for ADDR_IGNORED_BITS > 0. Updated unit test for bitmap manipulation functions.
Modified:
branches/DRDDEV/drd/drd_bitmap.c
branches/DRDDEV/drd/drd_bitmap.h
branches/DRDDEV/drd/tests/drd_bitmap_test.c
Modified: branches/DRDDEV/drd/drd_bitmap.c
===================================================================
--- branches/DRDDEV/drd/drd_bitmap.c 2009-05-09 12:45:37 UTC (rev 9806)
+++ branches/DRDDEV/drd/drd_bitmap.c 2009-05-09 19:59:48 UTC (rev 9807)
@@ -519,7 +519,7 @@
#endif
a1 = first_address_with_same_lsb(a1);
- a2 = first_address_with_higher_lsb(a2 - 1);
+ a2 = first_address_with_same_lsb(a2);
for (b = a1; b < a2; b = b_next)
{
@@ -603,7 +603,7 @@
#endif
a1 = first_address_with_same_lsb(a1);
- a2 = first_address_with_higher_lsb(a2 - 1);
+ a2 = first_address_with_same_lsb(a2);
for (b = a1; b < a2; b = b_next)
{
@@ -691,7 +691,7 @@
#endif
a1 = first_address_with_same_lsb(a1);
- a2 = first_address_with_higher_lsb(a2 - 1);
+ a2 = first_address_with_same_lsb(a2);
for (b = a1; b < a2; b = b_next)
{
Modified: branches/DRDDEV/drd/drd_bitmap.h
===================================================================
--- branches/DRDDEV/drd/drd_bitmap.h 2009-05-09 12:45:37 UTC (rev 9806)
+++ branches/DRDDEV/drd/drd_bitmap.h 2009-05-09 19:59:48 UTC (rev 9807)
@@ -55,6 +55,7 @@
/** Number of least significant address bits that are ignored. */
#define ADDR_IGNORED_BITS 0
#define ADDR_IGNORED_MASK ((1U << ADDR_IGNORED_BITS) - 1U)
+#define ADDR_GRANULARITY (1U << ADDR_IGNORED_BITS)
/** Round argument a up to a multiple of (1 << ADDR_GRANULARITY), and next
* shift it right ADDR_GRANULARITY bits. The expression below is optimized
Modified: branches/DRDDEV/drd/tests/drd_bitmap_test.c
===================================================================
--- branches/DRDDEV/drd/tests/drd_bitmap_test.c 2009-05-09 12:45:37 UTC (rev 9806)
+++ branches/DRDDEV/drd/tests/drd_bitmap_test.c 2009-05-09 19:59:48 UTC (rev 9807)
@@ -8,6 +8,14 @@
#include "drd/pub_drd_bitmap.h"
+#ifndef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#endif
+#ifndef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#endif
+
+
/* Replacements for core functionality. */
void* VG_(malloc)(HChar* cc, SizeT nbytes)
@@ -177,44 +185,46 @@
const Addr ub = make_address(2, 0) + 2 * BITS_PER_UWORD;
assert(outer_loop_step >= 1);
+ assert((outer_loop_step % ADDR_GRANULARITY) == 0);
assert(inner_loop_step >= 1);
+ assert((inner_loop_step % ADDR_GRANULARITY) == 0);
bm1 = DRD_(bm_new)();
bm2 = DRD_(bm_new)();
for (i = lb; i < ub; i += outer_loop_step)
{
- for (j = i + 1; j < ub; j += inner_loop_step)
+ for (j = i + ADDR_GRANULARITY; j < ub; j += inner_loop_step)
{
DRD_(bm_access_range_load)(bm1, i, j);
DRD_(bm_clear_load)(bm1, i, j);
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_1)(bm1, i);
- DRD_(bm_clear_load)(bm1, i, i+1);
+ DRD_(bm_clear_load)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_2)(bm1, i);
- DRD_(bm_clear_load)(bm1, i, i+2);
+ DRD_(bm_clear_load)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_4)(bm1, i);
- DRD_(bm_clear_load)(bm1, i, i+4);
+ DRD_(bm_clear_load)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_8)(bm1, i);
- DRD_(bm_clear_load)(bm1, i, i+8);
+ DRD_(bm_clear_load)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_range_store)(bm1, i, j);
DRD_(bm_clear_store)(bm1, i, j);
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_store_1)(bm1, i);
- DRD_(bm_clear_store)(bm1, i, i + 1);
+ DRD_(bm_clear_store)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_store_2)(bm1, i);
- DRD_(bm_clear_store)(bm1, i, i + 2);
+ DRD_(bm_clear_store)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_store_4)(bm1, i);
- DRD_(bm_clear_store)(bm1, i, i + 4);
+ DRD_(bm_clear_store)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_store_8)(bm1, i);
- DRD_(bm_clear_store)(bm1, i, i + 8);
+ DRD_(bm_clear_store)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_range_load)(bm1, i, j);
@@ -223,19 +233,19 @@
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_1)(bm1, i);
DRD_(bm_access_store_1)(bm1, i);
- DRD_(bm_clear)(bm1, i, i+1);
+ DRD_(bm_clear)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_2)(bm1, i);
DRD_(bm_access_store_2)(bm1, i);
- DRD_(bm_clear)(bm1, i, i+2);
+ DRD_(bm_clear)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_4)(bm1, i);
DRD_(bm_access_store_4)(bm1, i);
- DRD_(bm_clear)(bm1, i, i+4);
+ DRD_(bm_clear)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
DRD_(bm_access_load_8)(bm1, i);
DRD_(bm_access_store_8)(bm1, i);
- DRD_(bm_clear)(bm1, i, i+8);
+ DRD_(bm_clear)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
assert(bm_equal_print_diffs(bm1, bm2));
}
}
@@ -293,8 +303,8 @@
int main(int argc, char** argv)
{
- int outer_loop_step = 1;
- int inner_loop_step = 1;
+ int outer_loop_step = ADDR_GRANULARITY;
+ int inner_loop_step = ADDR_GRANULARITY;
int optchar;
while ((optchar = getopt(argc, argv, "s:t:q")) != EOF)
|