0cb6dc47e4
1. Slot is a new mechanism for storing variables during execution which is more convenient than alt.stack. This commit implements support for slot opcodes in both vm and compiler. 2. Remove old alt.stack opcodes. 3. Do not process globals at the start of every function, but instead load them single time at main.
213 lines
4.8 KiB
Go
213 lines
4.8 KiB
Go
package opcode
|
|
|
|
//go:generate stringer -type=Opcode
|
|
|
|
// Opcode represents a single operation code for the NEO virtual machine.
|
|
type Opcode byte
|
|
|
|
// Viable list of supported instruction constants.
|
|
const (
|
|
// Constants
|
|
PUSHINT8 Opcode = 0x00
|
|
PUSHINT16 Opcode = 0x01
|
|
PUSHINT32 Opcode = 0x02
|
|
PUSHINT64 Opcode = 0x03
|
|
PUSHINT128 Opcode = 0x04
|
|
PUSHINT256 Opcode = 0x05
|
|
|
|
PUSHA Opcode = 0x0A
|
|
PUSHNULL Opcode = 0x0B
|
|
|
|
PUSHDATA1 Opcode = 0x0C
|
|
PUSHDATA2 Opcode = 0x0D
|
|
PUSHDATA4 Opcode = 0x0E
|
|
|
|
PUSHM1 Opcode = 0x0F
|
|
PUSH0 Opcode = 0x10
|
|
PUSHF Opcode = PUSH0
|
|
PUSH1 Opcode = 0x11
|
|
PUSHT Opcode = PUSH1
|
|
PUSH2 Opcode = 0x12
|
|
PUSH3 Opcode = 0x13
|
|
PUSH4 Opcode = 0x14
|
|
PUSH5 Opcode = 0x15
|
|
PUSH6 Opcode = 0x16
|
|
PUSH7 Opcode = 0x17
|
|
PUSH8 Opcode = 0x18
|
|
PUSH9 Opcode = 0x19
|
|
PUSH10 Opcode = 0x1A
|
|
PUSH11 Opcode = 0x1B
|
|
PUSH12 Opcode = 0x1C
|
|
PUSH13 Opcode = 0x1D
|
|
PUSH14 Opcode = 0x1E
|
|
PUSH15 Opcode = 0x1F
|
|
PUSH16 Opcode = 0x20
|
|
|
|
// Flow control
|
|
NOP Opcode = 0x21
|
|
JMP Opcode = 0x22
|
|
JMPL Opcode = 0x23
|
|
JMPIF Opcode = 0x24
|
|
JMPIFL Opcode = 0x25
|
|
JMPIFNOT Opcode = 0x26
|
|
JMPIFNOTL Opcode = 0x27
|
|
JMPEQ Opcode = 0x28
|
|
JMPEQL Opcode = 0x29
|
|
JMPNE Opcode = 0x2A
|
|
JMPNEL Opcode = 0x2B
|
|
JMPGT Opcode = 0x2C
|
|
JMPGTL Opcode = 0x2D
|
|
JMPGE Opcode = 0x2E
|
|
JMPGEL Opcode = 0x2F
|
|
JMPLT Opcode = 0x30
|
|
JMPLTL Opcode = 0x31
|
|
JMPLE Opcode = 0x32
|
|
JMPLEL Opcode = 0x33
|
|
CALL Opcode = 0x34
|
|
CALLL Opcode = 0x35
|
|
CALLA Opcode = 0x36
|
|
|
|
// Exceptions
|
|
ABORT Opcode = 0x37
|
|
ASSERT Opcode = 0x38
|
|
THROW Opcode = 0x3A
|
|
|
|
RET Opcode = 0x40
|
|
SYSCALL Opcode = 0x41
|
|
|
|
// Stack
|
|
DEPTH Opcode = 0x43
|
|
DROP Opcode = 0x45
|
|
NIP Opcode = 0x46
|
|
XDROP Opcode = 0x48
|
|
CLEAR Opcode = 0x49
|
|
DUP Opcode = 0x4A
|
|
OVER Opcode = 0x4B
|
|
PICK Opcode = 0x4D
|
|
TUCK Opcode = 0x4E
|
|
SWAP Opcode = 0x50
|
|
OLDPUSH1 Opcode = 0x51 // FIXME remove #927
|
|
ROT Opcode = 0x51
|
|
ROLL Opcode = 0x52
|
|
REVERSE3 Opcode = 0x53
|
|
REVERSE4 Opcode = 0x54
|
|
REVERSEN Opcode = 0x55
|
|
|
|
// Slots
|
|
INITSSLOT Opcode = 0x56
|
|
INITSLOT Opcode = 0x57
|
|
LDSFLD0 Opcode = 0x58
|
|
LDSFLD1 Opcode = 0x59
|
|
LDSFLD2 Opcode = 0x5A
|
|
LDSFLD3 Opcode = 0x5B
|
|
LDSFLD4 Opcode = 0x5C
|
|
LDSFLD5 Opcode = 0x5D
|
|
LDSFLD6 Opcode = 0x5E
|
|
LDSFLD Opcode = 0x5F
|
|
STSFLD0 Opcode = 0x60
|
|
STSFLD1 Opcode = 0x61
|
|
STSFLD2 Opcode = 0x62
|
|
STSFLD3 Opcode = 0x63
|
|
STSFLD4 Opcode = 0x64
|
|
STSFLD5 Opcode = 0x65
|
|
STSFLD6 Opcode = 0x66
|
|
STSFLD Opcode = 0x67
|
|
LDLOC0 Opcode = 0x68
|
|
LDLOC1 Opcode = 0x69
|
|
LDLOC2 Opcode = 0x6A
|
|
LDLOC3 Opcode = 0x6B
|
|
LDLOC4 Opcode = 0x6C
|
|
LDLOC5 Opcode = 0x6D
|
|
LDLOC6 Opcode = 0x6E
|
|
LDLOC Opcode = 0x6F
|
|
STLOC0 Opcode = 0x70
|
|
STLOC1 Opcode = 0x71
|
|
STLOC2 Opcode = 0x72
|
|
STLOC3 Opcode = 0x73
|
|
STLOC4 Opcode = 0x74
|
|
STLOC5 Opcode = 0x75
|
|
STLOC6 Opcode = 0x76
|
|
STLOC Opcode = 0x77
|
|
LDARG0 Opcode = 0x78
|
|
LDARG1 Opcode = 0x79
|
|
LDARG2 Opcode = 0x7A
|
|
LDARG3 Opcode = 0x7B
|
|
LDARG4 Opcode = 0x7C
|
|
LDARG5 Opcode = 0x7D
|
|
LDARG6 Opcode = 0x7E
|
|
LDARG Opcode = 0x7F
|
|
STARG0 Opcode = 0x80
|
|
STARG1 Opcode = 0x81
|
|
STARG2 Opcode = 0x82
|
|
STARG3 Opcode = 0x83
|
|
STARG4 Opcode = 0x84
|
|
STARG5 Opcode = 0x85
|
|
STARG6 Opcode = 0x86
|
|
STARG Opcode = 0x87
|
|
|
|
// Splice
|
|
CAT Opcode = 0x8B
|
|
SUBSTR Opcode = 0x8C
|
|
LEFT Opcode = 0x8D
|
|
RIGHT Opcode = 0x8E
|
|
|
|
// Bitwise logic
|
|
INVERT Opcode = 0x90
|
|
AND Opcode = 0x91
|
|
OR Opcode = 0x92
|
|
XOR Opcode = 0x93
|
|
EQUAL Opcode = 0x97
|
|
NOTEQUAL Opcode = 0x98
|
|
|
|
// Arithmetic
|
|
SIGN Opcode = 0x99
|
|
ABS Opcode = 0x9A
|
|
NEGATE Opcode = 0x9B
|
|
INC Opcode = 0x9C
|
|
DEC Opcode = 0x9D
|
|
ADD Opcode = 0x9E
|
|
SUB Opcode = 0x9F
|
|
MUL Opcode = 0xA0
|
|
DIV Opcode = 0xA1
|
|
MOD Opcode = 0xA2
|
|
SHL Opcode = 0xA8
|
|
SHR Opcode = 0xA9
|
|
NOT Opcode = 0xAA
|
|
BOOLAND Opcode = 0xAB
|
|
BOOLOR Opcode = 0xAC
|
|
NZ Opcode = 0xB1
|
|
NUMEQUAL Opcode = 0xB3
|
|
NUMNOTEQUAL Opcode = 0xB4
|
|
LT Opcode = 0xB5
|
|
LTE Opcode = 0xB6
|
|
GT Opcode = 0xB7
|
|
GTE Opcode = 0xB8
|
|
MIN Opcode = 0xB9
|
|
MAX Opcode = 0xBA
|
|
WITHIN Opcode = 0xBB
|
|
|
|
// Advanced data structures (arrays, structures, maps)
|
|
PACK Opcode = 0xC0
|
|
UNPACK Opcode = 0xC1
|
|
NEWARRAY0 Opcode = 0xC2
|
|
NEWARRAY Opcode = 0xC3
|
|
NEWARRAYT Opcode = 0xC4
|
|
NEWSTRUCT0 Opcode = 0xC5
|
|
NEWSTRUCT Opcode = 0xC6
|
|
NEWMAP Opcode = 0xC8
|
|
SIZE Opcode = 0xCA
|
|
HASKEY Opcode = 0xCB
|
|
KEYS Opcode = 0xCC
|
|
VALUES Opcode = 0xCD
|
|
PICKITEM Opcode = 0xCE
|
|
APPEND Opcode = 0xCF
|
|
SETITEM Opcode = 0xD0
|
|
REVERSEITEMS Opcode = 0xD1
|
|
REMOVE Opcode = 0xD2
|
|
CLEARITEMS Opcode = 0xD3
|
|
|
|
// Types
|
|
ISNULL Opcode = 0xD8
|
|
ISTYPE Opcode = 0xD9
|
|
CONVERT Opcode = 0xDB
|
|
)
|