diff --git a/libevmasm/ConstantOptimiser.cpp b/libevmasm/ConstantOptimiser.cpp index 267daa5e5..cb5955b3e 100644 --- a/libevmasm/ConstantOptimiser.cpp +++ b/libevmasm/ConstantOptimiser.cpp @@ -211,11 +211,16 @@ AssemblyItems ComputeMethod::findRepresentation(u256 const& _value) if (lowerPart != 0) newRoutine += findRepresentation(u256(abs(lowerPart))); if (m_params.evmVersion.hasBitwiseShifting()) - newRoutine += AssemblyItems{u256(1), u256(bits), Instruction::SHL}; + { + newRoutine += findRepresentation(upperPart); + newRoutine += AssemblyItems{u256(bits), Instruction::SHL}; + } else + { newRoutine += AssemblyItems{u256(bits), u256(2), Instruction::EXP}; - if (upperPart != 1) - newRoutine += findRepresentation(upperPart) + AssemblyItems{Instruction::MUL}; + if (upperPart != 1) + newRoutine += findRepresentation(upperPart) + AssemblyItems{Instruction::MUL}; + } if (lowerPart > 0) newRoutine += AssemblyItems{Instruction::ADD}; else if (lowerPart < 0) diff --git a/test/libsolidity/GasCosts.cpp b/test/libsolidity/GasCosts.cpp index bb8be7807..a255d694d 100644 --- a/test/libsolidity/GasCosts.cpp +++ b/test/libsolidity/GasCosts.cpp @@ -75,12 +75,12 @@ BOOST_AUTO_TEST_CASE(string_storage) else if (Options::get().useABIEncoderV2) { if (Options::get().optimizeYul) - CHECK_GAS(153631, 130633, 100); + CHECK_GAS(153631, 129829, 100); else CHECK_GAS(153631, 138351, 100); } else - CHECK_GAS(129037, 122500, 100); + CHECK_GAS(129037, 121703, 100); if (Options::get().evmVersion() >= EVMVersion::byzantium()) { callContractFunction("f()");