Browse Source

Fixed implementation of EXP opcode (wrong results when exponent >= 2^32)

cl-refactor
Giacomo Tazzari 11 years ago
parent
commit
e584148ba1
  1. 4
      libevm/VM.h
  2. 2
      liblll/Assembly.cpp

4
libevm/VM.h

@ -241,9 +241,9 @@ template <class Ext> eth::bytesConstRef eth::VM::go(Ext& _ext, OnOpFunc const& _
{
require(2);
auto base = m_stack.back();
unsigned expon = (unsigned)m_stack[m_stack.size() - 2];
auto expon = m_stack[m_stack.size() - 2];
m_stack.pop_back();
m_stack.back() = boost::multiprecision::pow(base, expon);
m_stack.back() = (u256)boost::multiprecision::powm((bigint)base, (bigint)expon, bigint(2) << 256);
break;
}
case Instruction::NEG:

2
liblll/Assembly.cpp

@ -230,7 +230,7 @@ Assembly& Assembly::optimise(bool _enable)
{ Instruction::SDIV, [](u256 a, u256 b)->u256{return s2u(u2s(a) / u2s(b));} },
{ Instruction::MOD, [](u256 a, u256 b)->u256{return a % b;} },
{ Instruction::SMOD, [](u256 a, u256 b)->u256{return s2u(u2s(a) % u2s(b));} },
{ Instruction::EXP, [](u256 a, u256 b)->u256{return boost::multiprecision::pow(a, (unsigned)b);} },
{ Instruction::EXP, [](u256 a, u256 b)->u256{return (u256)boost::multiprecision::powm((bigint)a, (bigint)b, bigint(2) << 256);} },
{ Instruction::LT, [](u256 a, u256 b)->u256{return a < b ? 1 : 0;} },
{ Instruction::GT, [](u256 a, u256 b)->u256{return a > b ? 1 : 0;} },
{ Instruction::SLT, [](u256 a, u256 b)->u256{return u2s(a) < u2s(b) ? 1 : 0;} },

Loading…
Cancel
Save