From c30b8dbe99b57dd21db29b79cc47d33b6007068c Mon Sep 17 00:00:00 2001 From: VelocityRa Date: Sat, 22 Sep 2018 21:00:50 +0300 Subject: [PATCH] decoders: Cast to correctly-sized type before shifting Fixes decoding for 64-bit instructions Does not help/apply to any currently supported ARM versions (since all are 32-bit length or below), it's for future-proofing should such an arch be supported. --- src/frontend/decoder/decoder_detail.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/frontend/decoder/decoder_detail.h b/src/frontend/decoder/decoder_detail.h index 7a59820a..4a319ca8 100644 --- a/src/frontend/decoder/decoder_detail.h +++ b/src/frontend/decoder/decoder_detail.h @@ -36,16 +36,17 @@ private: * A '1' in a bitstring indicates that a one must be present at that bit position. */ static auto GetMaskAndExpect(const char* const bitstring) { + const auto one = static_cast(1); opcode_type mask = 0, expect = 0; for (size_t i = 0; i < opcode_bitsize; i++) { const size_t bit_position = opcode_bitsize - i - 1; switch (bitstring[i]) { case '0': - mask |= 1 << bit_position; + mask |= one << bit_position; break; case '1': - expect |= 1 << bit_position; - mask |= 1 << bit_position; + expect |= one << bit_position; + mask |= one << bit_position; break; default: // Ignore @@ -62,6 +63,7 @@ private: */ template static auto GetArgInfo(const char* const bitstring) { + const auto one = static_cast(1); std::array masks = {}; std::array shifts = {}; size_t arg_index = 0; @@ -84,7 +86,7 @@ private: } ASSERT(arg_index < N); - masks[arg_index] |= 1 << bit_position; + masks[arg_index] |= one << bit_position; shifts[arg_index] = bit_position; } }