aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-08-22 01:23:54 +0800
committerobscuren <geffobscura@gmail.com>2014-08-22 01:23:54 +0800
commit854d6d4e5cb8783e18397fef655ad79065263cc2 (patch)
tree9482a5ca5b2bea3c0f391ce116d381e1ba19eab9
parenta289a77d5de2a2cfa6b38f294b4ab953ebc1bfb8 (diff)
downloadgo-tangerine-854d6d4e5cb8783e18397fef655ad79065263cc2.tar.gz
go-tangerine-854d6d4e5cb8783e18397fef655ad79065263cc2.tar.zst
go-tangerine-854d6d4e5cb8783e18397fef655ad79065263cc2.zip
DUP/SWAP n & ADD/MULMOD
-rw-r--r--ethvm/types.go98
-rw-r--r--ethvm/vm.go30
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: