diff options
| author | Ben Cheng <bccheng@android.com> | 2010-10-28 11:13:58 -0700 |
|---|---|---|
| committer | Ben Cheng <bccheng@android.com> | 2010-12-13 16:49:33 -0800 |
| commit | 00603079b8723b32c955513eae63a8f97898074d (patch) | |
| tree | 3f7b93b0bdb9ac2d64896a9d0bbf5e5c7153cc71 /vm/BitVector.c | |
| parent | 823a87840e570ad06c4426537477a21243474a1c (diff) | |
| download | android_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.c | 87 |
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; +} |
