summaryrefslogtreecommitdiff
path: root/compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2023-01-26 11:30:47 +0000
committerAsh Wolf <ninji@wuffs.org>2023-01-26 11:30:47 +0000
commit094b96ca1df4a035b5f93c351f773306c0241f3f (patch)
tree95ce05e3ebe816c7ee7996206bb37ea17d8ca33c /compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c
parentfc0c4c0df7b583b55a08317cf1ef6a71d27c0440 (diff)
downloadMWCC-094b96ca1df4a035b5f93c351f773306c0241f3f.tar.gz
MWCC-094b96ca1df4a035b5f93c351f773306c0241f3f.zip
move lots of source files around to match their actual placement in the original treemain
Diffstat (limited to 'compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c')
-rw-r--r--compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c b/compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c
new file mode 100644
index 0000000..873b1ca
--- /dev/null
+++ b/compiler_and_linker/FrontEnd/Optimizer/IroBitVect.c
@@ -0,0 +1,112 @@
+#include "BitVector.h"
+#include "compiler/CompilerTools.h"
+
+void Bv_AllocVector(BitVector **bv, UInt32 size) {
+ UInt32 long_size = (size / 32) + 1;
+ *bv = oalloc(sizeof(BitVector) + sizeof(UInt32) * long_size);
+ (*bv)->size = long_size;
+ Bv_Clear(*bv);
+}
+
+void Bv_AllocVectorLocal(BitVector **bv, UInt32 size) {
+ UInt32 long_size = (size / 32) + 1;
+ *bv = lalloc(sizeof(BitVector) + sizeof(UInt32) * long_size);
+ (*bv)->size = long_size;
+ Bv_Clear(*bv);
+}
+
+void Bv_ClearBit(UInt32 bit, BitVector *bv) {
+ if ((bit / 32) < bv->size)
+ bv->data[bit / 32] &= ~(1 << (bit & 31));
+ else
+ CError_FATAL(73);
+}
+
+void Bv_And(const BitVector *a, BitVector *b) {
+ UInt32 i;
+ for (i = 0; i < b->size; i++)
+ b->data[i] &= a->data[i];
+}
+
+void Bv_Or(const BitVector *a, BitVector *b) {
+ UInt32 i, len;
+
+ len = a->size;
+ if (b->size < len)
+ len = b->size;
+
+ for (i = 0; i < len; i++) {
+ b->data[i] |= a->data[i];
+ }
+}
+
+Boolean Bv_BitsInCommon(const BitVector *a, const BitVector *b) {
+ UInt32 len;
+ UInt32 i;
+
+ len = a->size;
+ if (b->size < len)
+ len = b->size;
+
+ for (i = 0; i < len; i++) {
+ if (a->data[i] & b->data[i])
+ return 1;
+ }
+
+ return 0;
+}
+
+Boolean Bv_Compare(const BitVector *a, const BitVector *b) {
+ UInt32 i;
+ for (i = 0; i < a->size; i++) {
+ if (a->data[i] != b->data[i])
+ return 0;
+ }
+
+ return 1;
+}
+
+void Bv_Minus(const BitVector *a, BitVector *b) {
+ UInt32 i;
+ for (i = 0; i < b->size; i++)
+ b->data[i] &= ~a->data[i];
+}
+
+void Bv_Copy(const BitVector *src, BitVector *dst) {
+ memcpy(dst->data, src->data, sizeof(UInt32) * dst->size);
+}
+
+void Bv_Clear(BitVector *bv) {
+ memset(bv->data, 0, sizeof(UInt32) * bv->size);
+}
+
+void Bv_Set(BitVector *bv) {
+ memset(bv->data, 0xFF, sizeof(UInt32) * bv->size);
+}
+
+Boolean Bv_IsSubset(const BitVector *a, const BitVector *b) {
+ UInt32 i;
+
+ for (i = 0; i < a->size; i++) {
+ if (b->size < i) {
+ if (a->data[i])
+ return 0;
+ } else {
+ if (a->data[i] & ~(b->data[i]))
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+Boolean Bv_IsEmpty(const BitVector *bv) {
+ UInt32 i;
+
+ for (i = 0; i < bv->size; i++) {
+ if (bv->data[i])
+ return 0;
+ }
+
+ return 1;
+}