00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_BITMAP_H
00023 #define GCC_BITMAP_H
00024
00025
00026
00027 typedef unsigned long BITMAP_WORD;
00028
00029
00030 #define BITMAP_WORD_BITS (CHAR_BIT * SIZEOF_LONG * 1u)
00031
00032
00033
00034 #ifndef BITMAP_ELEMENT_WORDS
00035 #define BITMAP_ELEMENT_WORDS ((128 + BITMAP_WORD_BITS - 1) / BITMAP_WORD_BITS)
00036 #endif
00037
00038
00039
00040 #define BITMAP_ELEMENT_ALL_BITS (BITMAP_ELEMENT_WORDS * BITMAP_WORD_BITS)
00041
00042
00043 typedef struct bitmap_obstack GTY (())
00044 {
00045 struct bitmap_element_def *elements;
00046 struct bitmap_head_def *heads;
00047 struct obstack GTY ((skip)) obstack;
00048 } bitmap_obstack;
00049
00050
00051
00052
00053
00054
00055 typedef struct bitmap_element_def GTY(())
00056 {
00057 struct bitmap_element_def *next;
00058 struct bitmap_element_def *prev;
00059 unsigned int indx;
00060 BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
00061 } bitmap_element;
00062
00063
00064 typedef struct bitmap_head_def GTY(()) {
00065 bitmap_element *first;
00066 bitmap_element *current;
00067 unsigned int indx;
00068 bitmap_obstack *obstack;
00069
00070 } bitmap_head;
00071
00072
00073 typedef struct bitmap_head_def *bitmap;
00074
00075
00076 extern bitmap_element bitmap_zero_bits;
00077 extern bitmap_obstack bitmap_default_obstack;
00078
00079
00080 extern void bitmap_clear (bitmap);
00081
00082
00083 extern void bitmap_copy (bitmap, bitmap);
00084
00085
00086 extern bool bitmap_equal_p (bitmap, bitmap);
00087
00088
00089 extern bool bitmap_intersect_p (bitmap, bitmap);
00090
00091
00092
00093 extern bool bitmap_intersect_compl_p (bitmap, bitmap);
00094
00095
00096 #define bitmap_empty_p(MAP) (!(MAP)->first)
00097
00098
00099
00100
00101
00102 extern void bitmap_and (bitmap, bitmap, bitmap);
00103 extern void bitmap_and_into (bitmap, bitmap);
00104 extern void bitmap_and_compl (bitmap, bitmap, bitmap);
00105 extern bool bitmap_and_compl_into (bitmap, bitmap);
00106 extern bool bitmap_ior (bitmap, bitmap, bitmap);
00107 extern bool bitmap_ior_into (bitmap, bitmap);
00108 extern void bitmap_xor (bitmap, bitmap, bitmap);
00109 extern void bitmap_xor_into (bitmap, bitmap);
00110
00111
00112 extern bool bitmap_ior_and_compl (bitmap DST, bitmap A, bitmap B, bitmap C);
00113
00114 extern bool bitmap_ior_and_compl_into (bitmap DST, bitmap B, bitmap C);
00115
00116
00117 extern void bitmap_clear_bit (bitmap, int);
00118
00119
00120 extern void bitmap_set_bit (bitmap, int);
00121
00122
00123 extern int bitmap_bit_p (bitmap, int);
00124
00125
00126 extern void debug_bitmap (bitmap);
00127 extern void debug_bitmap_file (FILE *, bitmap);
00128
00129
00130 extern void bitmap_print (FILE *, bitmap, const char *, const char *);
00131
00132
00133 extern void bitmap_obstack_initialize (bitmap_obstack *);
00134 extern void bitmap_obstack_release (bitmap_obstack *);
00135
00136
00137
00138
00139 static inline void
00140 bitmap_initialize (bitmap head, bitmap_obstack *obstack)
00141 {
00142 head->first = head->current = NULL;
00143 head->obstack = obstack;
00144 }
00145
00146
00147 extern bitmap bitmap_obstack_alloc (bitmap_obstack *obstack);
00148 extern bitmap bitmap_gc_alloc (void);
00149 extern void bitmap_obstack_free (bitmap);
00150
00151
00152 #define dump_bitmap(file, bitmap) bitmap_print (file, bitmap, "", "\n")
00153 #define bitmap_zero(a) bitmap_clear (a)
00154 extern unsigned bitmap_first_set_bit (bitmap);
00155
00156
00157 #define BITMAP_ALLOC(OBSTACK) bitmap_obstack_alloc (OBSTACK)
00158
00159
00160 #define BITMAP_GGC_ALLOC() bitmap_gc_alloc ()
00161
00162
00163 #define BITMAP_FREE(BITMAP) \
00164 ((void)(bitmap_obstack_free (BITMAP), (BITMAP) = NULL))
00165
00166
00167
00168 typedef struct
00169 {
00170
00171 bitmap_element *elt1;
00172
00173
00174 bitmap_element *elt2;
00175
00176
00177 unsigned word_no;
00178
00179
00180
00181
00182 BITMAP_WORD bits;
00183 } bitmap_iterator;
00184
00185
00186
00187
00188 static inline void
00189 bmp_iter_set_init (bitmap_iterator *bi, bitmap map,
00190 unsigned start_bit, unsigned *bit_no)
00191 {
00192 bi->elt1 = map->first;
00193 bi->elt2 = NULL;
00194
00195
00196 while (1)
00197 {
00198 if (!bi->elt1)
00199 {
00200 bi->elt1 = &bitmap_zero_bits;
00201 break;
00202 }
00203
00204 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00205 break;
00206 bi->elt1 = bi->elt1->next;
00207 }
00208
00209
00210 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00211 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00212
00213
00214 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00215 bi->bits = bi->elt1->bits[bi->word_no];
00216 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00217
00218
00219
00220
00221
00222 start_bit += !bi->bits;
00223
00224 *bit_no = start_bit;
00225 }
00226
00227
00228
00229
00230 static inline void
00231 bmp_iter_and_init (bitmap_iterator *bi, bitmap map1, bitmap map2,
00232 unsigned start_bit, unsigned *bit_no)
00233 {
00234 bi->elt1 = map1->first;
00235 bi->elt2 = map2->first;
00236
00237
00238
00239 while (1)
00240 {
00241 if (!bi->elt1)
00242 {
00243 bi->elt2 = NULL;
00244 break;
00245 }
00246
00247 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00248 break;
00249 bi->elt1 = bi->elt1->next;
00250 }
00251
00252
00253 while (1)
00254 {
00255 if (!bi->elt2)
00256 {
00257 bi->elt1 = bi->elt2 = &bitmap_zero_bits;
00258 break;
00259 }
00260
00261 if (bi->elt2->indx >= bi->elt1->indx)
00262 break;
00263 bi->elt2 = bi->elt2->next;
00264 }
00265
00266
00267 if (bi->elt1->indx == bi->elt2->indx)
00268 {
00269
00270
00271 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00272 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00273
00274 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00275 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
00276 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00277 }
00278 else
00279 {
00280
00281
00282 bi->word_no = BITMAP_ELEMENT_WORDS - 1;
00283 bi->bits = 0;
00284 }
00285
00286
00287
00288
00289
00290 start_bit += !bi->bits;
00291
00292 *bit_no = start_bit;
00293 }
00294
00295
00296
00297
00298 static inline void
00299 bmp_iter_and_compl_init (bitmap_iterator *bi, bitmap map1, bitmap map2,
00300 unsigned start_bit, unsigned *bit_no)
00301 {
00302 bi->elt1 = map1->first;
00303 bi->elt2 = map2->first;
00304
00305
00306 while (1)
00307 {
00308 if (!bi->elt1)
00309 {
00310 bi->elt1 = &bitmap_zero_bits;
00311 break;
00312 }
00313
00314 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00315 break;
00316 bi->elt1 = bi->elt1->next;
00317 }
00318
00319
00320 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
00321 bi->elt2 = bi->elt2->next;
00322
00323
00324
00325 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00326 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00327
00328 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00329 bi->bits = bi->elt1->bits[bi->word_no];
00330 if (bi->elt2 && bi->elt1->indx == bi->elt2->indx)
00331 bi->bits &= ~bi->elt2->bits[bi->word_no];
00332 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00333
00334
00335
00336
00337
00338 start_bit += !bi->bits;
00339
00340 *bit_no = start_bit;
00341 }
00342
00343
00344
00345
00346 static inline void
00347 bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
00348 {
00349 bi->bits >>= 1;
00350 *bit_no += 1;
00351 }
00352
00353
00354
00355
00356
00357 static inline bool
00358 bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
00359 {
00360
00361 if (bi->bits)
00362 {
00363 next_bit:
00364 while (!(bi->bits & 1))
00365 {
00366 bi->bits >>= 1;
00367 *bit_no += 1;
00368 }
00369 return true;
00370 }
00371
00372
00373
00374
00375 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00376 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00377 bi->word_no++;
00378
00379 while (1)
00380 {
00381
00382 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00383 {
00384 bi->bits = bi->elt1->bits[bi->word_no];
00385 if (bi->bits)
00386 goto next_bit;
00387 *bit_no += BITMAP_WORD_BITS;
00388 bi->word_no++;
00389 }
00390
00391
00392 bi->elt1 = bi->elt1->next;
00393 if (!bi->elt1)
00394 return false;
00395 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00396 bi->word_no = 0;
00397 }
00398 }
00399
00400
00401
00402
00403
00404 static inline bool
00405 bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
00406 {
00407
00408 if (bi->bits)
00409 {
00410 next_bit:
00411 while (!(bi->bits & 1))
00412 {
00413 bi->bits >>= 1;
00414 *bit_no += 1;
00415 }
00416 return true;
00417 }
00418
00419
00420
00421
00422 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00423 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00424 bi->word_no++;
00425
00426 while (1)
00427 {
00428
00429 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00430 {
00431 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
00432 if (bi->bits)
00433 goto next_bit;
00434 *bit_no += BITMAP_WORD_BITS;
00435 bi->word_no++;
00436 }
00437
00438
00439 do
00440 {
00441
00442
00443 do
00444 {
00445 bi->elt1 = bi->elt1->next;
00446 if (!bi->elt1)
00447 return false;
00448 }
00449 while (bi->elt1->indx < bi->elt2->indx);
00450
00451
00452
00453 while (bi->elt2->indx < bi->elt1->indx)
00454 {
00455 bi->elt2 = bi->elt2->next;
00456 if (!bi->elt2)
00457 return false;
00458 }
00459 }
00460 while (bi->elt1->indx != bi->elt2->indx);
00461
00462 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00463 bi->word_no = 0;
00464 }
00465 }
00466
00467
00468
00469
00470
00471 static inline bool
00472 bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
00473 {
00474
00475 if (bi->bits)
00476 {
00477 next_bit:
00478 while (!(bi->bits & 1))
00479 {
00480 bi->bits >>= 1;
00481 *bit_no += 1;
00482 }
00483 return true;
00484 }
00485
00486
00487
00488
00489 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00490 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00491 bi->word_no++;
00492
00493 while (1)
00494 {
00495
00496 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00497 {
00498 bi->bits = bi->elt1->bits[bi->word_no];
00499 if (bi->elt2 && bi->elt2->indx == bi->elt1->indx)
00500 bi->bits &= ~bi->elt2->bits[bi->word_no];
00501 if (bi->bits)
00502 goto next_bit;
00503 *bit_no += BITMAP_WORD_BITS;
00504 bi->word_no++;
00505 }
00506
00507
00508 bi->elt1 = bi->elt1->next;
00509 if (!bi->elt1)
00510 return false;
00511
00512
00513 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
00514 bi->elt2 = bi->elt2->next;
00515
00516 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00517 bi->word_no = 0;
00518 }
00519 }
00520
00521
00522
00523
00524
00525
00526 #define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER) \
00527 for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM)); \
00528 bmp_iter_set (&(ITER), &(BITNUM)); \
00529 bmp_iter_next (&(ITER), &(BITNUM)))
00530
00531
00532
00533
00534
00535
00536 #define EXECUTE_IF_AND_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
00537 for (bmp_iter_and_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
00538 &(BITNUM)); \
00539 bmp_iter_and (&(ITER), &(BITNUM)); \
00540 bmp_iter_next (&(ITER), &(BITNUM)))
00541
00542
00543
00544
00545
00546
00547 #define EXECUTE_IF_AND_COMPL_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
00548 for (bmp_iter_and_compl_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
00549 &(BITNUM)); \
00550 bmp_iter_and_compl (&(ITER), &(BITNUM)); \
00551 bmp_iter_next (&(ITER), &(BITNUM)))
00552
00553 #endif