summaryrefslogtreecommitdiff
path: root/bitfield.c
diff options
context:
space:
mode:
Diffstat (limited to 'bitfield.c')
-rw-r--r--bitfield.c80
1 files changed, 41 insertions, 39 deletions
diff --git a/bitfield.c b/bitfield.c
index fcab172..d87bfe7 100644
--- a/bitfield.c
+++ b/bitfield.c
@@ -14,9 +14,15 @@
** BITFIELD OPERATIONS **
*************************/
-static clock_t DoBitfieldIteration(unsigned long *bitarraybase,
- unsigned long *bitoparraybase,
- long bitoparraysize,
+#ifdef _LP64
+#define ARRAY_SIZE 16384L
+#else
+#define ARRAY_SIZE 32768L
+#endif
+
+static clock_t DoBitfieldIteration(unsigned long *bitarray,
+ unsigned long *bitoparray,
+ long bitop_array_size,
unsigned long *nbitops);
static void ToggleBitRun(unsigned long *bitmap,
unsigned long bit_addr,
@@ -37,32 +43,28 @@ DoBitops(void)
{
const char* context = "CPU:Bitfields";
BitOpStruct* locbitopstruct = &global_bitopstruct;
- unsigned long* bitarraybase = NULL;
- unsigned long* bitoparraybase = NULL;
+ unsigned long* bitarray = NULL;
+ unsigned long* bitoparray = NULL;
clock_t total_time = 0;
int iterations = 0;
unsigned long nbitops;
static int is_adjusted = FALSE;
+ static int bitop_array_size = 30;
if (is_adjusted == FALSE) {
is_adjusted = TRUE;
- bitarraybase = realloc(bitarraybase, locbitopstruct->bitfieldarraysize * sizeof(unsigned long));
- if (!bitarraybase) {
+ bitarray = realloc(bitarray, ARRAY_SIZE * sizeof(unsigned long));
+ if (!bitarray) {
fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
exit(1);
}
- /*
- ** Initialize bitfield operations array to [2,30] elements
- */
- locbitopstruct->bitoparraysize = 30L;
-
while(1) {
- bitoparraybase = malloc(locbitopstruct->bitoparraysize * 2 * sizeof(unsigned long));
- if (!bitoparraybase) {
+ bitoparray = malloc(bitop_array_size * 2 * sizeof(unsigned long));
+ if (!bitoparray) {
fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
- free(bitarraybase);
+ free(bitarray);
exit(1);
}
@@ -72,27 +74,27 @@ DoBitops(void)
** minimum, then de-allocate the array, reallocate a
** larger version, and try again.
*/
- if(DoBitfieldIteration(bitarraybase, bitoparraybase, locbitopstruct->bitoparraysize, &nbitops) > MINIMUM_TICKS) {
+ if(DoBitfieldIteration(bitarray, bitoparray, bitop_array_size, &nbitops) > MINIMUM_TICKS) {
break;
}
- locbitopstruct->bitoparraysize += 100L;
+ bitop_array_size += 100;
}
} else {
/*
** Don't need to do self adjustment, just allocate
** the array space.
*/
- bitarraybase = malloc(locbitopstruct->bitfieldarraysize * sizeof(unsigned long));
- if (!bitarraybase) {
+ bitarray = malloc(ARRAY_SIZE * sizeof(unsigned long));
+ if (!bitarray) {
fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
exit(1);
}
- bitoparraybase = malloc(locbitopstruct->bitoparraysize * 2 * sizeof(unsigned long));
- if (!bitoparraybase) {
+ bitoparray = malloc(bitop_array_size * 2 * sizeof(unsigned long));
+ if (!bitoparray) {
fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
- free(bitarraybase);
+ free(bitarray);
exit(1);
}
}
@@ -102,7 +104,7 @@ DoBitops(void)
** accumulated elapsed time is greater than # of seconds requested.
*/
do {
- total_time += DoBitfieldIteration(bitarraybase, bitoparraybase, locbitopstruct->bitoparraysize,&nbitops);
+ total_time += DoBitfieldIteration(bitarray, bitoparray, bitop_array_size,&nbitops);
iterations += nbitops;
} while (total_time < MINIMUM_SECONDS * CLOCKS_PER_SEC);
@@ -111,8 +113,8 @@ DoBitops(void)
** Also, set adjustment flag to show that we don't have
** to do self adjusting in the future.
*/
- free(bitarraybase);
- free(bitoparraybase);
+ free(bitarray);
+ free(bitoparray);
locbitopstruct->results = (double)(iterations * CLOCKS_PER_SEC) / (double)total_time;
}
@@ -124,7 +126,7 @@ DoBitops(void)
** Return the # of ticks accumulated by the operation.
*/
static clock_t
-DoBitfieldIteration(unsigned long *bitarraybase, unsigned long *bitoparraybase, long bitoparraysize, unsigned long *nbitops)
+DoBitfieldIteration(unsigned long *bitarray, unsigned long *bitoparray, long bitop_array_size, unsigned long *nbitops)
{
clock_t start, stop;
long i;
@@ -152,37 +154,37 @@ DoBitfieldIteration(unsigned long *bitarraybase, unsigned long *bitoparraybase,
*/
randnum(13);
- for (i = 0; i < global_bitopstruct.bitfieldarraysize; i++) {
+ for (i = 0; i < ARRAY_SIZE; i++) {
#ifdef _LP64
- *(bitarraybase+i) = 0x5555555555555555UL;
+ *(bitarray+i) = 0x5555555555555555UL;
#else
- *(bitarraybase+i) = 0x55555555UL;
+ *(bitarray+i) = 0x55555555UL;
#endif
}
randnum(13);
- for (i = 0; i < bitoparraysize; i++) {
+ for (i = 0; i < bitop_array_size; i++) {
/* First item is offset */
- *(bitoparraybase + i + i) = bitoffset = abs_randwc((int32_t)262140);
+ *(bitoparray + i + i) = bitoffset = abs_randwc((int32_t)262140);
/* Next item is run length */
- *nbitops += *(bitoparraybase + i + i + 1L) = abs_randwc((int32_t)262140 - bitoffset);
+ *nbitops += *(bitoparray + i + i + 1L) = abs_randwc((int32_t)262140 - bitoffset);
}
start = clock();
- for(i = 0; i < bitoparraysize; i++) {
+ for(i = 0; i < bitop_array_size; i++) {
switch(i % 3) {
case 2: /* Complement run of bits */
- FlipBitRun(bitarraybase,
- *(bitoparraybase+i+i),
- *(bitoparraybase+i+i+1));
+ FlipBitRun(bitarray,
+ *(bitoparray+i+i),
+ *(bitoparray+i+i+1));
break;
default:
- ToggleBitRun(bitarraybase,
- *(bitoparraybase+i+i),
- *(bitoparraybase+i+i+1),
+ ToggleBitRun(bitarray,
+ *(bitoparray+i+i),
+ *(bitoparray+i+i+1),
!i);
break;
}