daily update
[deliverable/binutils-gdb.git] / opcodes / cgen-bitset.c
CommitLineData
3609e0fe 1/* CGEN generic opcode support.
ac1e9eca 2 Copyright 2002, 2005, 2007, 2009
3609e0fe
DB
3 Free Software Foundation, Inc.
4
9b201bb5 5 This file is part of libopcodes.
3609e0fe 6
9b201bb5 7 This library is free software; you can redistribute it and/or modify
3609e0fe 8 it under the terms of the GNU General Public License as published by
9b201bb5 9 the Free Software Foundation; either version 3, or (at your option)
3609e0fe
DB
10 any later version.
11
9b201bb5
NC
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
3609e0fe
DB
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
20
21/* Functions for manipulating CGEN_BITSET. */
22
23#include "libiberty.h"
ac1e9eca 24#include "cgen/bitset.h"
3609e0fe
DB
25#include <string.h>
26
27/* Create a bit mask. */
ac1e9eca 28
3609e0fe
DB
29CGEN_BITSET *
30cgen_bitset_create (unsigned bit_count)
31{
32 CGEN_BITSET * mask = xmalloc (sizeof (* mask));
33 cgen_bitset_init (mask, bit_count);
34 return mask;
35}
36
37/* Initialize an existing bit mask. */
38
39void
40cgen_bitset_init (CGEN_BITSET * mask, unsigned bit_count)
41{
42 if (! mask)
43 return;
44 mask->length = (bit_count / 8) + 1;
45 mask->bits = xmalloc (mask->length);
46 cgen_bitset_clear (mask);
47}
48
49/* Clear the bits of a bit mask. */
50
51void
52cgen_bitset_clear (CGEN_BITSET * mask)
53{
54 unsigned i;
55
56 if (! mask)
57 return;
58
59 for (i = 0; i < mask->length; ++i)
60 mask->bits[i] = 0;
61}
62
63/* Add a bit to a bit mask. */
64
65void
66cgen_bitset_add (CGEN_BITSET * mask, unsigned bit_num)
67{
68 int byte_ix, bit_ix;
69 int bit_mask;
70
71 if (! mask)
72 return;
73 byte_ix = bit_num / 8;
74 bit_ix = bit_num % 8;
75 bit_mask = 1 << (7 - bit_ix);
76 mask->bits[byte_ix] |= bit_mask;
77}
78
79/* Set a bit mask. */
80
81void
82cgen_bitset_set (CGEN_BITSET * mask, unsigned bit_num)
83{
84 if (! mask)
85 return;
86 cgen_bitset_clear (mask);
87 cgen_bitset_add (mask, bit_num);
88}
89
90/* Test for a bit in a bit mask.
91 Returns 1 if the bit is found */
92
93int
94cgen_bitset_contains (CGEN_BITSET * mask, unsigned bit_num)
95{
96 int byte_ix, bit_ix;
97 int bit_mask;
98
99 if (! mask)
100 return 1; /* No bit restrictions. */
101
102 byte_ix = bit_num / 8;
103 bit_ix = 7 - (bit_num % 8);
104 bit_mask = 1 << bit_ix;
105 return (mask->bits[byte_ix] & bit_mask) >> bit_ix;
106}
107
108/* Compare two bit masks for equality.
109 Returns 0 if they are equal. */
110
111int
112cgen_bitset_compare (CGEN_BITSET * mask1, CGEN_BITSET * mask2)
113{
114 if (mask1 == mask2)
115 return 0;
116 if (! mask1 || ! mask2)
117 return 1;
118 if (mask1->length != mask2->length)
119 return 1;
120 return memcmp (mask1->bits, mask2->bits, mask1->length);
121}
122
123/* Test two bit masks for common bits.
124 Returns 1 if a common bit is found. */
125
126int
127cgen_bitset_intersect_p (CGEN_BITSET * mask1, CGEN_BITSET * mask2)
128{
129 unsigned i, limit;
130
131 if (mask1 == mask2)
132 return 1;
133 if (! mask1 || ! mask2)
134 return 0;
135 limit = mask1->length < mask2->length ? mask1->length : mask2->length;
136
137 for (i = 0; i < limit; ++i)
138 if ((mask1->bits[i] & mask2->bits[i]))
139 return 1;
140
141 return 0;
142}
143
144/* Make a copy of a bit mask. */
145
146CGEN_BITSET *
147cgen_bitset_copy (CGEN_BITSET * mask)
148{
149 CGEN_BITSET* newmask;
150
151 if (! mask)
152 return NULL;
153 newmask = cgen_bitset_create ((mask->length * 8) - 1);
154 memcpy (newmask->bits, mask->bits, mask->length);
155 return newmask;
156}
157
158/* Combine two bit masks. */
159
160void
161cgen_bitset_union (CGEN_BITSET * mask1, CGEN_BITSET * mask2,
162 CGEN_BITSET * result)
163{
164 unsigned i;
165
166 if (! mask1 || ! mask2 || ! result
167 || mask1->length != mask2->length
168 || mask1->length != result->length)
169 return;
170
171 for (i = 0; i < result->length; ++i)
172 result->bits[i] = mask1->bits[i] | mask2->bits[i];
173}
This page took 0.207654 seconds and 4 git commands to generate.