00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GCC_SBITMAP_H
00022 #define GCC_SBITMAP_H
00023
00024
00025
00026
00027
00028 #define SBITMAP_ELT_BITS ((unsigned) HOST_BITS_PER_WIDE_INT)
00029 #define SBITMAP_ELT_TYPE unsigned HOST_WIDE_INT
00030
00031 typedef struct simple_bitmap_def
00032 {
00033 unsigned int n_bits;
00034 unsigned int size;
00035 unsigned int bytes;
00036 SBITMAP_ELT_TYPE elms[1];
00037 } *sbitmap;
00038
00039 typedef SBITMAP_ELT_TYPE *sbitmap_ptr;
00040
00041
00042 #define SBITMAP_SET_SIZE(N) (((N) + SBITMAP_ELT_BITS - 1) / SBITMAP_ELT_BITS)
00043
00044
00045 #define SET_BIT(BITMAP, BITNO) \
00046 ((BITMAP)->elms [(BITNO) / SBITMAP_ELT_BITS] \
00047 |= (SBITMAP_ELT_TYPE) 1 << (BITNO) % SBITMAP_ELT_BITS)
00048
00049
00050 #define TEST_BIT(BITMAP, BITNO) \
00051 ((BITMAP)->elms [(BITNO) / SBITMAP_ELT_BITS] >> (BITNO) % SBITMAP_ELT_BITS & 1)
00052
00053
00054 #define RESET_BIT(BITMAP, BITNO) \
00055 ((BITMAP)->elms [(BITNO) / SBITMAP_ELT_BITS] \
00056 &= ~((SBITMAP_ELT_TYPE) 1 << (BITNO) % SBITMAP_ELT_BITS))
00057
00058
00059 #define EXECUTE_IF_SET_IN_SBITMAP(SBITMAP, MIN, N, CODE) \
00060 do { \
00061 unsigned int word_num_; \
00062 unsigned int bit_num_ = (MIN) % (unsigned int) SBITMAP_ELT_BITS; \
00063 unsigned int size_ = (SBITMAP)->size; \
00064 SBITMAP_ELT_TYPE *ptr_ = (SBITMAP)->elms; \
00065 \
00066 for (word_num_ = (MIN) / (unsigned int) SBITMAP_ELT_BITS; \
00067 word_num_ < size_; word_num_++, bit_num_ = 0) \
00068 { \
00069 SBITMAP_ELT_TYPE word_ = ptr_[word_num_]; \
00070 \
00071 if (word_ != 0) \
00072 for (; bit_num_ < SBITMAP_ELT_BITS; bit_num_++) \
00073 { \
00074 SBITMAP_ELT_TYPE _mask = (SBITMAP_ELT_TYPE) 1 << bit_num_; \
00075 \
00076 if ((word_ & _mask) != 0) \
00077 { \
00078 word_ &= ~ _mask; \
00079 (N) = word_num_ * SBITMAP_ELT_BITS + bit_num_; \
00080 CODE; \
00081 if (word_ == 0) \
00082 break; \
00083 } \
00084 } \
00085 } \
00086 } while (0)
00087
00088 #define EXECUTE_IF_SET_IN_SBITMAP_REV(SBITMAP, N, CODE) \
00089 do { \
00090 unsigned int word_num_; \
00091 unsigned int bit_num_; \
00092 unsigned int size_ = (SBITMAP)->size; \
00093 SBITMAP_ELT_TYPE *ptr_ = (SBITMAP)->elms; \
00094 \
00095 for (word_num_ = size_; word_num_ > 0; word_num_--) \
00096 { \
00097 SBITMAP_ELT_TYPE word_ = ptr_[word_num_ - 1]; \
00098 \
00099 if (word_ != 0) \
00100 for (bit_num_ = SBITMAP_ELT_BITS; bit_num_ > 0; bit_num_--) \
00101 { \
00102 SBITMAP_ELT_TYPE _mask = (SBITMAP_ELT_TYPE)1 << (bit_num_ - 1);\
00103 \
00104 if ((word_ & _mask) != 0) \
00105 { \
00106 word_ &= ~ _mask; \
00107 (N) = (word_num_ - 1) * SBITMAP_ELT_BITS + bit_num_ - 1;\
00108 CODE; \
00109 if (word_ == 0) \
00110 break; \
00111 } \
00112 } \
00113 } \
00114 } while (0)
00115
00116 #define sbitmap_free(MAP) free(MAP)
00117 #define sbitmap_vector_free(VEC) free(VEC)
00118
00119 struct int_list;
00120
00121 extern void dump_sbitmap PARAMS ((FILE *, sbitmap));
00122 extern void dump_sbitmap_file PARAMS ((FILE *, sbitmap));
00123 extern void dump_sbitmap_vector PARAMS ((FILE *, const char *,
00124 const char *, sbitmap *,
00125 int));
00126 extern sbitmap sbitmap_alloc PARAMS ((unsigned int));
00127 extern sbitmap *sbitmap_vector_alloc PARAMS ((unsigned int, unsigned int));
00128 extern sbitmap sbitmap_resize PARAMS ((sbitmap, unsigned int, int));
00129 extern void sbitmap_copy PARAMS ((sbitmap, sbitmap));
00130 extern int sbitmap_equal PARAMS ((sbitmap, sbitmap));
00131 extern void sbitmap_zero PARAMS ((sbitmap));
00132 extern void sbitmap_ones PARAMS ((sbitmap));
00133 extern void sbitmap_vector_zero PARAMS ((sbitmap *, unsigned int));
00134 extern void sbitmap_vector_ones PARAMS ((sbitmap *, unsigned int));
00135
00136 extern void sbitmap_union_of_diff PARAMS ((sbitmap, sbitmap, sbitmap,
00137 sbitmap));
00138 extern bool sbitmap_union_of_diff_cg PARAMS ((sbitmap, sbitmap, sbitmap,
00139 sbitmap));
00140 extern void sbitmap_difference PARAMS ((sbitmap, sbitmap, sbitmap));
00141 extern void sbitmap_not PARAMS ((sbitmap, sbitmap));
00142 extern void sbitmap_a_or_b_and_c PARAMS ((sbitmap, sbitmap, sbitmap,
00143 sbitmap));
00144 extern bool sbitmap_a_or_b_and_c_cg PARAMS ((sbitmap, sbitmap, sbitmap,
00145 sbitmap));
00146 extern void sbitmap_a_and_b_or_c PARAMS ((sbitmap, sbitmap, sbitmap,
00147 sbitmap));
00148 extern bool sbitmap_a_and_b_or_c_cg PARAMS ((sbitmap, sbitmap, sbitmap,
00149 sbitmap));
00150 extern void sbitmap_a_and_b PARAMS ((sbitmap, sbitmap, sbitmap));
00151 extern bool sbitmap_a_and_b_cg PARAMS ((sbitmap, sbitmap, sbitmap));
00152 extern void sbitmap_a_or_b PARAMS ((sbitmap, sbitmap, sbitmap));
00153 extern bool sbitmap_a_or_b_cg PARAMS ((sbitmap, sbitmap, sbitmap));
00154 extern void sbitmap_a_xor_b PARAMS ((sbitmap, sbitmap, sbitmap));
00155 extern bool sbitmap_a_xor_b_cg PARAMS ((sbitmap, sbitmap, sbitmap));
00156 extern bool sbitmap_a_subset_b_p PARAMS ((sbitmap, sbitmap));
00157
00158 extern int sbitmap_first_set_bit PARAMS ((sbitmap));
00159 extern int sbitmap_last_set_bit PARAMS ((sbitmap));
00160
00161 extern void sbitmap_intersect_of_predsucc PARAMS ((sbitmap, sbitmap *,
00162 int, struct int_list **));
00163 #define sbitmap_intersect_of_predecessors sbitmap_intersect_of_predsucc
00164 #define sbitmap_intersect_of_successors sbitmap_intersect_of_predsucc
00165
00166 extern void sbitmap_union_of_predsucc PARAMS ((sbitmap, sbitmap *, int,
00167 struct int_list **));
00168 #define sbitmap_union_of_predecessors sbitmap_union_of_predsucc
00169 #define sbitmap_union_of_successors sbitmap_union_of_predsucc
00170
00171
00172
00173
00174 extern void sbitmap_intersection_of_succs PARAMS ((sbitmap, sbitmap *, int));
00175 extern void sbitmap_intersection_of_preds PARAMS ((sbitmap, sbitmap *, int));
00176 extern void sbitmap_union_of_succs PARAMS ((sbitmap, sbitmap *, int));
00177 extern void sbitmap_union_of_preds PARAMS ((sbitmap, sbitmap *, int));
00178
00179 extern void debug_sbitmap PARAMS ((sbitmap));
00180 #endif