diff options
author | Orion Hodson <oth@google.com> | 2019-11-04 16:58:26 +0000 |
---|---|---|
committer | Orion Hodson <oth@google.com> | 2019-11-04 16:58:26 +0000 |
commit | cc8b8ca466d56bfb7e10e76e72eeb2bcf76c01ce (patch) | |
tree | 50d05f0b543a16ada876ae82ec8927b364a16bf7 /startop/view_compiler/dex_builder.h | |
parent | 59d07201d90329e4657f89b4107f06aa2b890ab7 (diff) |
Adds ToBits helper method to convert instructon opcode enum to bits
Bug: 142948359
Test: atest dex-builder-test
Change-Id: Ic1c02e74dd787107c08bd34ca861eee89d6d1423
Diffstat (limited to 'startop/view_compiler/dex_builder.h')
-rw-r--r-- | startop/view_compiler/dex_builder.h | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/startop/view_compiler/dex_builder.h b/startop/view_compiler/dex_builder.h index 3ae37ce1f762..eb2dc88835d4 100644 --- a/startop/view_compiler/dex_builder.h +++ b/startop/view_compiler/dex_builder.h @@ -379,15 +379,20 @@ class MethodBuilder { // https://source.android.com/devices/tech/dalvik/instruction-formats for documentation of // formats. + inline uint8_t ToBits(::dex::Opcode opcode) { + static_assert(sizeof(uint8_t) == sizeof(::dex::Opcode)); + return static_cast<uint8_t>(opcode); + } + inline void Encode10x(::dex::Opcode opcode) { // 00|op static_assert(sizeof(uint8_t) == sizeof(::dex::Opcode)); - buffer_.push_back(static_cast<uint8_t>(opcode)); + buffer_.push_back(ToBits(opcode)); } inline void Encode11x(::dex::Opcode opcode, uint8_t a) { // aa|op - buffer_.push_back((a << 8) | opcode); + buffer_.push_back((a << 8) | ToBits(opcode)); } inline void Encode11n(::dex::Opcode opcode, uint8_t a, int8_t b) { @@ -398,12 +403,12 @@ class MethodBuilder { CHECK_LE(-8, b); CHECK_LT(b, 8); - buffer_.push_back(((b & 0xf) << 12) | (a << 8) | opcode); + buffer_.push_back(((b & 0xf) << 12) | (a << 8) | ToBits(opcode)); } inline void Encode21c(::dex::Opcode opcode, uint8_t a, uint16_t b) { // aa|op|bbbb - buffer_.push_back((a << 8) | opcode); + buffer_.push_back((a << 8) | ToBits(opcode)); buffer_.push_back(b); } @@ -411,12 +416,12 @@ class MethodBuilder { // b|a|op|bbbb CHECK(IsShortRegister(a)); CHECK(IsShortRegister(b)); - buffer_.push_back((b << 12) | (a << 8) | opcode); + buffer_.push_back((b << 12) | (a << 8) | ToBits(opcode)); buffer_.push_back(c); } inline void Encode32x(::dex::Opcode opcode, uint16_t a, uint16_t b) { - buffer_.push_back(opcode); + buffer_.push_back(ToBits(opcode)); buffer_.push_back(a); buffer_.push_back(b); } @@ -431,14 +436,14 @@ class MethodBuilder { CHECK(IsShortRegister(e)); CHECK(IsShortRegister(f)); CHECK(IsShortRegister(g)); - buffer_.push_back((a << 12) | (g << 8) | opcode); + buffer_.push_back((a << 12) | (g << 8) | ToBits(opcode)); buffer_.push_back(b); buffer_.push_back((f << 12) | (e << 8) | (d << 4) | c); } inline void Encode3rc(::dex::Opcode opcode, size_t a, uint16_t b, uint16_t c) { CHECK_LE(a, 255); - buffer_.push_back((a << 8) | opcode); + buffer_.push_back((a << 8) | ToBits(opcode)); buffer_.push_back(b); buffer_.push_back(c); } |