core/vm: add shortcuts for trivial exp cases

This commit is contained in:
Martin Holst Swende 2018-10-05 13:04:36 +02:00
parent 5d3b7bb023
commit 49b0b7f49c
No known key found for this signature in database
GPG key ID: 683B438C05A5DDF0

View file

@ -124,10 +124,22 @@ func opSmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory
func opExp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { func opExp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
base, exponent := stack.pop(), stack.pop() base, exponent := stack.pop(), stack.pop()
// some shortcuts
cmpToOne := exponent.Cmp(big1)
if cmpToOne < 0 { // Exponent is zero
// x ^ 0 == 1
stack.push(base.SetUint64(1))
} else if base.Sign() == 0 {
// 0 ^ y, if y != 0, == 0
stack.push(base.SetUint64(0))
} else if cmpToOne == 0 { // Exponent is one
// x ^ 1 == x
stack.push(base)
} else {
stack.push(math.Exp(base, exponent)) stack.push(math.Exp(base, exponent))
interpreter.intPool.put(base)
interpreter.intPool.put(base, exponent) }
interpreter.intPool.put(exponent)
return nil, nil return nil, nil
} }