aboutsummaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-11-01 08:18:03 +0800
committerobscuren <geffobscura@gmail.com>2014-11-01 08:18:03 +0800
commit141d3caabbfbebbbecac455462a40b6056aa3821 (patch)
tree367b81236d56c9ec21d9d2e0e8b29e261a668f11 /vm
parent5af4ff985dc43b648bdc96394a3bd96d9658ae0a (diff)
downloadgo-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar.gz
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar.bz2
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar.lz
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar.xz
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.tar.zst
go-tangerine-141d3caabbfbebbbecac455462a40b6056aa3821.zip
Re-org op codes
Diffstat (limited to 'vm')
-rw-r--r--vm/types.go306
-rw-r--r--vm/vm.go4
-rw-r--r--vm/vm_debug.go6
3 files changed, 163 insertions, 153 deletions
diff --git a/vm/types.go b/vm/types.go
index 53178fa43..580c517d6 100644
--- a/vm/types.go
+++ b/vm/types.go
@@ -9,152 +9,162 @@ type OpCode byte
// Op codes
const (
// 0x0 range - arithmetic ops
- STOP = 0x00
- ADD = 0x01
- MUL = 0x02
- SUB = 0x03
- DIV = 0x04
- SDIV = 0x05
- MOD = 0x06
- SMOD = 0x07
- EXP = 0x08
- BNOT = 0x09
- LT = 0x0a
- GT = 0x0b
- SLT = 0x0c
- SGT = 0x0d
- EQ = 0x0e
- NOT = 0x0f
+ STOP OpCode = iota
+ ADD
+ MUL
+ SUB
+ DIV
+ SDIV
+ MOD
+ SMOD
+ ADDMOD
+ MULMOD
+ EXP
+ SIGNEXTEND
+)
- // 0x10 range - bit ops
- AND = 0x10
- OR = 0x11
- XOR = 0x12
- BYTE = 0x13
- ADDMOD = 0x14
- MULMOD = 0x15
+const (
+ LT OpCode = iota + 0x10
+ GT
+ SLT
+ SGT
+ EQ
+ ISZERO
+ AND
+ OR
+ XOR
+ NOT
+ BYTE
- // 0x20 range - crypto
SHA3 = 0x20
+)
+const (
// 0x30 range - closure state
- ADDRESS = 0x30
- BALANCE = 0x31
- ORIGIN = 0x32
- CALLER = 0x33
- CALLVALUE = 0x34
- CALLDATALOAD = 0x35
- CALLDATASIZE = 0x36
- CALLDATACOPY = 0x37
- CODESIZE = 0x38
- CODECOPY = 0x39
- GASPRICE = 0x3a
- EXTCODESIZE = 0x3b
- EXTCODECOPY = 0x3c
+ ADDRESS OpCode = 0x30 + iota
+ BALANCE
+ ORIGIN
+ CALLER
+ CALLVALUE
+ CALLDATALOAD
+ CALLDATASIZE
+ CALLDATACOPY
+ CODESIZE
+ CODECOPY
+ GASPRICE
+ EXTCODESIZE
+ EXTCODECOPY
+)
+
+const (
// 0x40 range - block operations
- PREVHASH = 0x40
- COINBASE = 0x41
- TIMESTAMP = 0x42
- NUMBER = 0x43
- DIFFICULTY = 0x44
- GASLIMIT = 0x45
+ PREVHASH OpCode = 0x40 + iota
+ COINBASE
+ TIMESTAMP
+ NUMBER
+ DIFFICULTY
+ GASLIMIT
+)
+const (
// 0x50 range - 'storage' and execution
- POP = 0x50
- //DUP = 0x51
- //SWAP = 0x52
- MLOAD = 0x53
- MSTORE = 0x54
- MSTORE8 = 0x55
- SLOAD = 0x56
- SSTORE = 0x57
- JUMP = 0x58
- JUMPI = 0x59
- PC = 0x5a
- MSIZE = 0x5b
- GAS = 0x5c
- JUMPDEST = 0x5d
+ POP OpCode = 0x50 + iota
+ MLOAD
+ MSTORE
+ MSTORE8
+ SLOAD
+ SSTORE
+ JUMP
+ JUMPI
+ PC
+ MSIZE
+ GAS
+ JUMPDEST
+)
+const (
// 0x60 range
- PUSH1 = 0x60
- PUSH2 = 0x61
- PUSH3 = 0x62
- PUSH4 = 0x63
- PUSH5 = 0x64
- PUSH6 = 0x65
- PUSH7 = 0x66
- PUSH8 = 0x67
- PUSH9 = 0x68
- PUSH10 = 0x69
- PUSH11 = 0x6a
- PUSH12 = 0x6b
- PUSH13 = 0x6c
- PUSH14 = 0x6d
- PUSH15 = 0x6e
- PUSH16 = 0x6f
- PUSH17 = 0x70
- PUSH18 = 0x71
- PUSH19 = 0x72
- PUSH20 = 0x73
- PUSH21 = 0x74
- PUSH22 = 0x75
- PUSH23 = 0x76
- PUSH24 = 0x77
- PUSH25 = 0x78
- PUSH26 = 0x79
- PUSH27 = 0x7a
- PUSH28 = 0x7b
- PUSH29 = 0x7c
- PUSH30 = 0x7d
- 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
+ PUSH1 OpCode = 0x60 + iota
+ PUSH2
+ PUSH3
+ PUSH4
+ PUSH5
+ PUSH6
+ PUSH7
+ PUSH8
+ PUSH9
+ PUSH10
+ PUSH11
+ PUSH12
+ PUSH13
+ PUSH14
+ PUSH15
+ PUSH16
+ PUSH17
+ PUSH18
+ PUSH19
+ PUSH20
+ PUSH21
+ PUSH22
+ PUSH23
+ PUSH24
+ PUSH25
+ PUSH26
+ PUSH27
+ PUSH28
+ PUSH29
+ PUSH30
+ PUSH31
+ PUSH32
+ DUP1
+ DUP2
+ DUP3
+ DUP4
+ DUP5
+ DUP6
+ DUP7
+ DUP8
+ DUP9
+ DUP10
+ DUP11
+ DUP12
+ DUP13
+ DUP14
+ DUP15
+ DUP16
+ SWAP1
+ SWAP2
+ SWAP3
+ SWAP4
+ SWAP5
+ SWAP6
+ SWAP7
+ SWAP8
+ SWAP9
+ SWAP10
+ SWAP11
+ SWAP12
+ SWAP13
+ SWAP14
+ SWAP15
+ SWAP16
+)
- LOG0 = 0xa0
- LOG1 = 0xa1
- LOG2 = 0xa2
- LOG3 = 0xa3
- LOG4 = 0xa4
+const (
+ LOG0 OpCode = 0xa0 + iota
+ LOG1
+ LOG2
+ LOG3
+ LOG4
+)
+const (
// 0xf0 range - closures
- CREATE = 0xf0
- CALL = 0xf1
- RETURN = 0xf2
- CALLCODE = 0xf3
+ CREATE OpCode = 0xf0 + iota
+ CALL
+ RETURN
+ CALLCODE
// 0x70 range - other
SUICIDE = 0xff
@@ -163,22 +173,22 @@ const (
// Since the opcodes aren't all in order we can't use a regular slice
var opCodeToString = map[OpCode]string{
// 0x0 range - arithmetic ops
- STOP: "STOP",
- ADD: "ADD",
- MUL: "MUL",
- SUB: "SUB",
- DIV: "DIV",
- SDIV: "SDIV",
- MOD: "MOD",
- SMOD: "SMOD",
- EXP: "EXP",
- BNOT: "BNOT",
- LT: "LT",
- GT: "GT",
- SLT: "SLT",
- SGT: "SGT",
- EQ: "EQ",
- NOT: "NOT",
+ STOP: "STOP",
+ ADD: "ADD",
+ MUL: "MUL",
+ SUB: "SUB",
+ DIV: "DIV",
+ SDIV: "SDIV",
+ MOD: "MOD",
+ SMOD: "SMOD",
+ EXP: "EXP",
+ NOT: "NOT",
+ LT: "LT",
+ GT: "GT",
+ SLT: "SLT",
+ SGT: "SGT",
+ EQ: "EQ",
+ ISZERO: "ISZERO",
// 0x10 range - bit ops
AND: "AND",
diff --git a/vm/vm.go b/vm/vm.go
index 28df832d3..e1c2d9c14 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -268,7 +268,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
U256(base)
stack.Push(base)
- case BNOT:
+ case NOT:
require(1)
base.Sub(Pow256, stack.Pop())
@@ -325,7 +325,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
} else {
stack.Push(ethutil.BigFalse)
}
- case NOT:
+ case ISZERO:
require(1)
x := stack.Pop()
if x.Cmp(ethutil.BigFalse) > 0 {
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
index 0942636d6..0abfa098d 100644
--- a/vm/vm_debug.go
+++ b/vm/vm_debug.go
@@ -142,7 +142,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
// Stack Check, memory resize & gas phase
switch op {
// Stack checks only
- case NOT, CALLDATALOAD, POP, JUMP, BNOT: // 1
+ case ISZERO, CALLDATALOAD, POP, JUMP, NOT: // 1
require(1)
case ADD, SUB, DIV, SDIV, MOD, SMOD, EXP, LT, GT, SLT, SGT, EQ, AND, OR, XOR, BYTE: // 2
require(2)
@@ -392,7 +392,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
self.Printf(" = %v", base)
stack.Push(base)
- case BNOT:
+ case NOT:
base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)
// Not needed
@@ -449,7 +449,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
} else {
stack.Push(ethutil.BigFalse)
}
- case NOT:
+ case ISZERO:
x := stack.Pop()
if x.Cmp(ethutil.BigFalse) > 0 {
stack.Push(ethutil.BigFalse)