From 0c96205b561960eae4a92b3b316bb7fdaa9c2d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 19 Oct 2016 17:16:06 +0200 Subject: [PATCH] Optimize EXP --- core/vm/instructions.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 3352877c1f..80344e77dc 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -192,8 +192,18 @@ func opSmod(instr instruction, pc *uint64, env Environment, contract *Contract, } func opExp(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *Stack) { - x, y := stack.pop(), stack.pop() - stack.push(U256(x.Exp(x, y, Pow256))) + base, exponent := stack.pop(), stack.pop() + result := big.NewInt(1) + for exponent.Cmp(common.Big0) != 0 { + if exponent.Bit(0) == 1 { + result.Mul(result, base) + U256(result) + } + base.Mul(base, base) + U256(base) + exponent.Rsh(exponent, 1) + } + stack.push(result) } func opSignExtend(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *Stack) {