From a289a77d5de2a2cfa6b38f294b4ab953ebc1bfb8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 Aug 2014 18:15:09 +0200 Subject: DUP n SWAP n --- ethvm/stack.go | 12 ++++++++++++ ethvm/types.go | 34 ++++++++++++++++++++++++++++++++++ ethvm/vm.go | 20 ++++++++++++-------- 3 files changed, 58 insertions(+), 8 deletions(-) (limited to 'ethvm') diff --git a/ethvm/stack.go b/ethvm/stack.go index f4b0be393..82dd612c2 100644 --- a/ethvm/stack.go +++ b/ethvm/stack.go @@ -64,6 +64,18 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) { return ints[0], ints[1] } +func (st *Stack) Swapn(n int) (*big.Int, *big.Int) { + st.data[n], st.data[0] = st.data[0], st.data[n] + + return st.data[n], st.data[0] +} + +func (st *Stack) Dupn(n int) *big.Int { + st.Push(st.data[n]) + + return st.Peek() +} + func (st *Stack) Push(d *big.Int) { st.data = append(st.data, new(big.Int).Set(d)) } diff --git a/ethvm/types.go b/ethvm/types.go index 1c3f66139..99dc0672d 100644 --- a/ethvm/types.go +++ b/ethvm/types.go @@ -105,6 +105,40 @@ const ( PUSH31 = 0x7e PUSH32 = 0x7f + DUP1 = 0x80 + DUP2 = 0x81 + DUP3 = 0x82 + DUP4 = 0x83 + DUP5 = 0x84 + DUP6 = 0x85 + DUP7 = 0x86 + DUP8 = 0x87 + DUP9 = 0x88 + DUP10 = 0x89 + DUP11 = 0x8a + DUP12 = 0x8b + DUP13 = 0x8c + DUP14 = 0x8d + DUP15 = 0x8e + DUP16 = 0x8f + + SWAP1 = 0x90 + SWAP2 = 0x91 + SWAP3 = 0x92 + SWAP4 = 0x93 + SWAP5 = 0x94 + SWAP6 = 0x95 + SWAP7 = 0x96 + SWAP8 = 0x97 + SWAP9 = 0x98 + SWAP10 = 0x99 + SWAP11 = 0x9a + SWAP12 = 0x9b + SWAP13 = 0x9c + SWAP14 = 0x9d + SWAP15 = 0x9e + SWAP16 = 0x9f + // 0xf0 range - closures CREATE = 0xf0 CALL = 0xf1 diff --git a/ethvm/vm.go b/ethvm/vm.go index ddad0d366..b27417586 100644 --- a/ethvm/vm.go +++ b/ethvm/vm.go @@ -600,16 +600,20 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { case POP: require(1) stack.Pop() - case DUP: - require(1) - stack.Push(stack.Peek()) + case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16: + n := int(op - DUP1 + 1) + stack.Dupn(n) + + self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes()) + case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16: + n := int(op - SWAP1 + 1) + x, y := stack.Swapn(n) - self.Printf(" => 0x%x", stack.Peek().Bytes()) + self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes()) + case DUP: + // NOP case SWAP: - require(2) - x, y := stack.Popn() - stack.Push(y) - stack.Push(x) + // NOP case MLOAD: require(1) offset := stack.Pop() -- cgit From 854d6d4e5cb8783e18397fef655ad79065263cc2 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 Aug 2014 19:23:54 +0200 Subject: DUP/SWAP n & ADD/MULMOD --- ethvm/types.go | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++------- ethvm/vm.go | 30 ++++++++++++++++++ 2 files changed, 116 insertions(+), 12 deletions(-) (limited to 'ethvm') diff --git a/ethvm/types.go b/ethvm/types.go index 99dc0672d..98fd8fba0 100644 --- a/ethvm/types.go +++ b/ethvm/types.go @@ -27,10 +27,12 @@ const ( NOT = 0x0f // 0x10 range - bit ops - AND = 0x10 - OR = 0x11 - XOR = 0x12 - BYTE = 0x13 + AND = 0x10 + OR = 0x11 + XOR = 0x12 + BYTE = 0x13 + ADDMOD = 0x14 + MULMOD = 0x15 // 0x20 range - crypto SHA3 = 0x20 @@ -170,10 +172,12 @@ var opCodeToString = map[OpCode]string{ NOT: "NOT", // 0x10 range - bit ops - AND: "AND", - OR: "OR", - XOR: "XOR", - BYTE: "BYTE", + AND: "AND", + OR: "OR", + XOR: "XOR", + BYTE: "BYTE", + ADDMOD: "ADDMOD", + MULMOD: "MULMOD", // 0x20 range - crypto SHA3: "SHA3", @@ -248,6 +252,40 @@ var opCodeToString = map[OpCode]string{ PUSH31: "PUSH31", PUSH32: "PUSH32", + DUP1: "DUP1", + DUP2: "DUP2", + DUP3: "DUP3", + DUP4: "DUP4", + DUP5: "DUP5", + DUP6: "DUP6", + DUP7: "DUP7", + DUP8: "DUP8", + DUP9: "DUP9", + DUP10: "DUP10", + DUP11: "DUP11", + DUP12: "DUP12", + DUP13: "DUP13", + DUP14: "DUP14", + DUP15: "DUP15", + DUP16: "DUP16", + + SWAP1: "SWAP1", + SWAP2: "SWAP2", + SWAP3: "SWAP3", + SWAP4: "SWAP4", + SWAP5: "SWAP5", + SWAP6: "SWAP6", + SWAP7: "SWAP7", + SWAP8: "SWAP8", + SWAP9: "SWAP9", + SWAP10: "SWAP10", + SWAP11: "SWAP11", + SWAP12: "SWAP12", + SWAP13: "SWAP13", + SWAP14: "SWAP14", + SWAP15: "SWAP15", + SWAP16: "SWAP16", + // 0xf0 range CREATE: "CREATE", CALL: "CALL", @@ -286,10 +324,12 @@ var OpCodes = map[string]byte{ "NOT": 0x0d, // 0x10 range - bit ops - "AND": 0x10, - "OR": 0x11, - "XOR": 0x12, - "BYTE": 0x13, + "AND": 0x10, + "OR": 0x11, + "XOR": 0x12, + "BYTE": 0x13, + "ADDMOD": 0x14, + "MULMOD": 0x15, // 0x20 range - crypto "SHA3": 0x20, @@ -360,6 +400,40 @@ var OpCodes = map[string]byte{ "PUSH31": 0x7e, "PUSH32": 0x7f, + "DUP1": 0x80, + "DUP2": 0x81, + "DUP3": 0x82, + "DUP4": 0x83, + "DUP5": 0x84, + "DUP6": 0x85, + "DUP7": 0x86, + "DUP8": 0x87, + "DUP9": 0x88, + "DUP10": 0x89, + "DUP11": 0x8a, + "DUP12": 0x8b, + "DUP13": 0x8c, + "DUP14": 0x8d, + "DUP15": 0x8e, + "DUP16": 0x8f, + + "SWAP1": 0x90, + "SWAP2": 0x91, + "SWAP3": 0x92, + "SWAP4": 0x93, + "SWAP5": 0x94, + "SWAP6": 0x95, + "SWAP7": 0x96, + "SWAP8": 0x97, + "SWAP9": 0x98, + "SWAP10": 0x99, + "SWAP11": 0x9a, + "SWAP12": 0x9b, + "SWAP13": 0x9c, + "SWAP14": 0x9d, + "SWAP15": 0x9e, + "SWAP16": 0x9f, + // 0xf0 range - closures "CREATE": 0xf0, "CALL": 0xf1, diff --git a/ethvm/vm.go b/ethvm/vm.go index b27417586..29dc2515c 100644 --- a/ethvm/vm.go +++ b/ethvm/vm.go @@ -439,6 +439,36 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { } else { stack.Push(ethutil.BigFalse) } + case ADDMOD: + require(3) + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Add(x, y) + base.Mod(base, z) + + ensure256(base) + + self.Printf(" = %v", base) + + stack.Push(base) + case MULMOD: + require(3) + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Mul(x, y) + base.Mod(base, z) + + ensure256(base) + + self.Printf(" = %v", base) + + stack.Push(base) // 0x20 range case SHA3: -- cgit