From 854d6d4e5cb8783e18397fef655ad79065263cc2 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 21 Aug 2014 19:23:54 +0200
Subject: [PATCH] DUP/SWAP n & ADD/MULMOD

---
 ethvm/types.go | 98 +++++++++++++++++++++++++++++++++++++++++++-------
 ethvm/vm.go    | 30 ++++++++++++++++
 2 files changed, 116 insertions(+), 12 deletions(-)

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:
-- 
GitLab