diff options
| author | 2013-12-06 10:07:40 +0000 | |
|---|---|---|
| committer | 2013-12-06 10:07:42 +0000 | |
| commit | 9cefcd7e7b1fdfcd38c35aad36e1c0a0aabfa32c (patch) | |
| tree | fb11800de822ef97c1b9b0df9ac6246286600d3d /compiler/leb128_encoder.h | |
| parent | 29c788da9b75f998c5da8f320cd50351b83a3dff (diff) | |
| parent | 06606b9c4a1c00154ed15f719ad8ea994e54ee8e (diff) | |
Merge "Performance improvement for mapping table creation."
Diffstat (limited to 'compiler/leb128_encoder.h')
| -rw-r--r-- | compiler/leb128_encoder.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/compiler/leb128_encoder.h b/compiler/leb128_encoder.h index fe38c2f5cd..67666831f0 100644 --- a/compiler/leb128_encoder.h +++ b/compiler/leb128_encoder.h @@ -22,6 +22,31 @@ namespace art { +static inline uint8_t* EncodeUnsignedLeb128(uint8_t* dest, uint32_t value) { + uint8_t out = value & 0x7f; + value >>= 7; + while (value != 0) { + *dest++ = out | 0x80; + out = value & 0x7f; + value >>= 7; + } + *dest++ = out; + return dest; +} + +static inline uint8_t* EncodeSignedLeb128(uint8_t* dest, int32_t value) { + uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6; + uint8_t out = value & 0x7f; + while (extra_bits != 0u) { + *dest++ = out | 0x80; + value >>= 7; + out = value & 0x7f; + extra_bits >>= 7; + } + *dest++ = out; + return dest; +} + // An encoder with an API similar to vector<uint32_t> where the data is captured in ULEB128 format. class Leb128EncodingVector { public: |