summaryrefslogtreecommitdiffstats
path: root/vm/BitVector.c
diff options
context:
space:
mode:
authorBen Cheng <bccheng@android.com>2010-10-28 11:13:58 -0700
committerBen Cheng <bccheng@android.com>2010-12-13 16:49:33 -0800
commit00603079b8723b32c955513eae63a8f97898074d (patch)
tree3f7b93b0bdb9ac2d64896a9d0bbf5e5c7153cc71 /vm/BitVector.c
parent823a87840e570ad06c4426537477a21243474a1c (diff)
downloadandroid_dalvik-00603079b8723b32c955513eae63a8f97898074d.tar.gz
android_dalvik-00603079b8723b32c955513eae63a8f97898074d.tar.bz2
android_dalvik-00603079b8723b32c955513eae63a8f97898074d.zip
Implement method parser and SSA transformation.
Change-Id: If3fb3a36f33aaee8e5fdded4e9fa607be54f0bfb
Diffstat (limited to 'vm/BitVector.c')
-rw-r--r--vm/BitVector.c87
1 files changed, 84 insertions, 3 deletions
diff --git a/vm/BitVector.c b/vm/BitVector.c
index 68f19b086..04c3d3ff8 100644
--- a/vm/BitVector.c
+++ b/vm/BitVector.c
@@ -143,6 +143,24 @@ void dvmClearAllBits(BitVector* pBits)
}
/*
+ * Mark specified number of bits as "set". Cannot set all bits like ClearAll
+ * since there might be unused bits - setting those to one will confuse the
+ * iterator.
+ */
+void dvmSetInitialBits(BitVector* pBits, int numBits)
+{
+ int i;
+ assert(((numBits + 31) >> 5) <= pBits->storageSize);
+ for (i = 0; i < (numBits >> 5); i++) {
+ pBits->storage[i] = -1;
+ }
+ int remNumBits = numBits & 0x1f;
+ if (remNumBits) {
+ pBits->storage[i] = (1 << remNumBits) - 1;
+ }
+}
+
+/*
* Determine whether or not the specified bit is set.
*/
bool dvmIsBitSet(const BitVector* pBits, int num)
@@ -194,8 +212,7 @@ bool dvmCopyBitVector(BitVector *dest, const BitVector *src)
}
/*
- * Intersect two bit vectores and merge the result on top of the pre-existing
- * value in the dest vector.
+ * Intersect two bit vectors and store the result to the dest vector.
*/
bool dvmIntersectBitVectors(BitVector *dest, const BitVector *src1,
const BitVector *src2)
@@ -208,7 +225,71 @@ bool dvmIntersectBitVectors(BitVector *dest, const BitVector *src1,
int i;
for (i = 0; i < dest->storageSize; i++) {
- dest->storage[i] |= src1->storage[i] & src2->storage[i];
+ dest->storage[i] = src1->storage[i] & src2->storage[i];
}
return true;
}
+
+/*
+ * Unify two bit vectors and store the result to the dest vector.
+ */
+bool dvmUnifyBitVectors(BitVector *dest, const BitVector *src1,
+ const BitVector *src2)
+{
+ if (dest->storageSize != src1->storageSize ||
+ dest->storageSize != src2->storageSize ||
+ dest->expandable != src1->expandable ||
+ dest->expandable != src2->expandable)
+ return false;
+
+ int i;
+ for (i = 0; i < dest->storageSize; i++) {
+ dest->storage[i] = src1->storage[i] | src2->storage[i];
+ }
+ return true;
+}
+
+/*
+ * Compare two bit vectors and return true if difference is seen.
+ */
+bool dvmCompareBitVectors(const BitVector *src1, const BitVector *src2)
+{
+ if (src1->storageSize != src2->storageSize ||
+ src1->expandable != src2->expandable)
+ return true;
+
+ int i;
+ for (i = 0; i < src1->storageSize; i++) {
+ if (src1->storage[i] != src2->storage[i]) return true;
+ }
+ return false;
+}
+
+/* Initialize the iterator structure */
+void dvmBitVectorIteratorInit(BitVector* pBits, BitVectorIterator* iterator)
+{
+ iterator->pBits = pBits;
+ iterator->bitSize = pBits->storageSize * sizeof(u4) * 8;
+ iterator->idx = 0;
+}
+
+/* Return the next position set to 1. -1 means end-of-element reached */
+int dvmBitVectorIteratorNext(BitVectorIterator* iterator)
+{
+ const BitVector* pBits = iterator->pBits;
+ u4 bitIndex = iterator->idx;
+
+ assert(iterator->bitSize == pBits->storageSize * sizeof(u4) * 8);
+ if (bitIndex >= iterator->bitSize) return -1;
+
+ for (; bitIndex < iterator->bitSize; bitIndex++) {
+ int wordIndex = bitIndex >> 5;
+ int mask = 1 << (bitIndex & 0x1f);
+ if (pBits->storage[wordIndex] & mask) {
+ iterator->idx = bitIndex+1;
+ return bitIndex;
+ }
+ }
+ /* No more set bits */
+ return -1;
+}