Use shift directly instead of multiplication in constant optimizer.

This commit is contained in:
chriseth 2019-05-14 15:14:24 +02:00
parent 9d291a86cc
commit 5824f5d42f
2 changed files with 10 additions and 5 deletions

View File

@ -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)

View File

@ -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()");