package vm

//go:generate stringer -type=Instruction

// Instruction represents an single operation for the NEO virtual machine.
type Instruction byte

// Viable list of supported instruction constants.
const (
	// Constants
	PUSH0       Instruction = 0x00
	PUSHF       Instruction = PUSH0
	PUSHBYTES1  Instruction = 0x01
	PUSHBYTES2  Instruction = 0x02
	PUSHBYTES3  Instruction = 0x03
	PUSHBYTES4  Instruction = 0x04
	PUSHBYTES5  Instruction = 0x05
	PUSHBYTES6  Instruction = 0x06
	PUSHBYTES7  Instruction = 0x07
	PUSHBYTES8  Instruction = 0x08
	PUSHBYTES9  Instruction = 0x09
	PUSHBYTES10 Instruction = 0x0A
	PUSHBYTES11 Instruction = 0x0B
	PUSHBYTES12 Instruction = 0x0C
	PUSHBYTES13 Instruction = 0x0D
	PUSHBYTES14 Instruction = 0x0E
	PUSHBYTES15 Instruction = 0x0F
	PUSHBYTES16 Instruction = 0x10
	PUSHBYTES17 Instruction = 0x11
	PUSHBYTES18 Instruction = 0x12
	PUSHBYTES19 Instruction = 0x13
	PUSHBYTES20 Instruction = 0x14
	PUSHBYTES21 Instruction = 0x15
	PUSHBYTES22 Instruction = 0x16
	PUSHBYTES23 Instruction = 0x17
	PUSHBYTES24 Instruction = 0x18
	PUSHBYTES25 Instruction = 0x19
	PUSHBYTES26 Instruction = 0x1A
	PUSHBYTES27 Instruction = 0x1B
	PUSHBYTES28 Instruction = 0x1C
	PUSHBYTES29 Instruction = 0x1D
	PUSHBYTES30 Instruction = 0x1E
	PUSHBYTES31 Instruction = 0x1F
	PUSHBYTES32 Instruction = 0x20
	PUSHBYTES33 Instruction = 0x21
	PUSHBYTES34 Instruction = 0x22
	PUSHBYTES35 Instruction = 0x23
	PUSHBYTES36 Instruction = 0x24
	PUSHBYTES37 Instruction = 0x25
	PUSHBYTES38 Instruction = 0x26
	PUSHBYTES39 Instruction = 0x27
	PUSHBYTES40 Instruction = 0x28
	PUSHBYTES41 Instruction = 0x29
	PUSHBYTES42 Instruction = 0x2A
	PUSHBYTES43 Instruction = 0x2B
	PUSHBYTES44 Instruction = 0x2C
	PUSHBYTES45 Instruction = 0x2D
	PUSHBYTES46 Instruction = 0x2E
	PUSHBYTES47 Instruction = 0x2F
	PUSHBYTES48 Instruction = 0x30
	PUSHBYTES49 Instruction = 0x31
	PUSHBYTES50 Instruction = 0x32
	PUSHBYTES51 Instruction = 0x33
	PUSHBYTES52 Instruction = 0x34
	PUSHBYTES53 Instruction = 0x35
	PUSHBYTES54 Instruction = 0x36
	PUSHBYTES55 Instruction = 0x37
	PUSHBYTES56 Instruction = 0x38
	PUSHBYTES57 Instruction = 0x39
	PUSHBYTES58 Instruction = 0x3A
	PUSHBYTES59 Instruction = 0x3B
	PUSHBYTES60 Instruction = 0x3C
	PUSHBYTES61 Instruction = 0x3D
	PUSHBYTES62 Instruction = 0x3E
	PUSHBYTES63 Instruction = 0x3F
	PUSHBYTES64 Instruction = 0x40
	PUSHBYTES65 Instruction = 0x41
	PUSHBYTES66 Instruction = 0x42
	PUSHBYTES67 Instruction = 0x43
	PUSHBYTES68 Instruction = 0x44
	PUSHBYTES69 Instruction = 0x45
	PUSHBYTES70 Instruction = 0x46
	PUSHBYTES71 Instruction = 0x47
	PUSHBYTES72 Instruction = 0x48
	PUSHBYTES73 Instruction = 0x49
	PUSHBYTES74 Instruction = 0x4A
	PUSHBYTES75 Instruction = 0x4B
	PUSHDATA1   Instruction = 0x4C
	PUSHDATA2   Instruction = 0x4D
	PUSHDATA4   Instruction = 0x4E
	PUSHM1      Instruction = 0x4F
	PUSH1       Instruction = 0x51
	PUSHT       Instruction = PUSH1
	PUSH2       Instruction = 0x52
	PUSH3       Instruction = 0x53
	PUSH4       Instruction = 0x54
	PUSH5       Instruction = 0x55
	PUSH6       Instruction = 0x56
	PUSH7       Instruction = 0x57
	PUSH8       Instruction = 0x58
	PUSH9       Instruction = 0x59
	PUSH10      Instruction = 0x5A
	PUSH11      Instruction = 0x5B
	PUSH12      Instruction = 0x5C
	PUSH13      Instruction = 0x5D
	PUSH14      Instruction = 0x5E
	PUSH15      Instruction = 0x5F
	PUSH16      Instruction = 0x60

	// Flow control
	NOP      Instruction = 0x61
	JMP      Instruction = 0x62
	JMPIF    Instruction = 0x63
	JMPIFNOT Instruction = 0x64
	CALL     Instruction = 0x65
	RET      Instruction = 0x66
	APPCALL  Instruction = 0x67
	SYSCALL  Instruction = 0x68
	TAILCALL Instruction = 0x69

	// Stack
	DUPFROMALTSTACK Instruction = 0x6A
	TOALTSTACK      Instruction = 0x6B
	FROMALTSTACK    Instruction = 0x6C
	XDROP           Instruction = 0x6D
	XSWAP           Instruction = 0x72
	XTUCK           Instruction = 0x73
	DEPTH           Instruction = 0x74
	DROP            Instruction = 0x75
	DUP             Instruction = 0x76
	NIP             Instruction = 0x77
	OVER            Instruction = 0x78
	PICK            Instruction = 0x79
	ROLL            Instruction = 0x7A
	ROT             Instruction = 0x7B
	SWAP            Instruction = 0x7C
	TUCK            Instruction = 0x7D

	// Splice
	CAT    Instruction = 0x7E
	SUBSTR Instruction = 0x7F
	LEFT   Instruction = 0x80
	RIGHT  Instruction = 0x81
	SIZE   Instruction = 0x82

	// Bitwise logic
	INVERT Instruction = 0x83
	AND    Instruction = 0x84
	OR     Instruction = 0x85
	XOR    Instruction = 0x86
	EQUAL  Instruction = 0x87

	// Arithmetic
	INC         Instruction = 0x8B
	DEC         Instruction = 0x8C
	SIGN        Instruction = 0x8D
	NEGATE      Instruction = 0x8F
	ABS         Instruction = 0x90
	NOT         Instruction = 0x91
	NZ          Instruction = 0x92
	ADD         Instruction = 0x93
	SUB         Instruction = 0x94
	MUL         Instruction = 0x95
	DIV         Instruction = 0x96
	MOD         Instruction = 0x97
	SHL         Instruction = 0x98
	SHR         Instruction = 0x99
	BOOLAND     Instruction = 0x9A
	BOOLOR      Instruction = 0x9B
	NUMEQUAL    Instruction = 0x9C
	NUMNOTEQUAL Instruction = 0x9E
	LT          Instruction = 0x9F
	GT          Instruction = 0xA0
	LTE         Instruction = 0xA1
	GTE         Instruction = 0xA2
	MIN         Instruction = 0xA3
	MAX         Instruction = 0xA4
	WITHIN      Instruction = 0xA5

	// Crypto
	SHA1          Instruction = 0xA7
	SHA256        Instruction = 0xA8
	HASH160       Instruction = 0xA9
	HASH256       Instruction = 0xAA
	CHECKSIG      Instruction = 0xAC
	VERIFY        Instruction = 0xAD
	CHECKMULTISIG Instruction = 0xAE

	// Advanced data structures (arrays, structures, maps)
	ARRAYSIZE Instruction = 0xC0
	PACK      Instruction = 0xC1
	UNPACK    Instruction = 0xC2
	PICKITEM  Instruction = 0xC3
	SETITEM   Instruction = 0xC4
	NEWARRAY  Instruction = 0xC5
	NEWSTRUCT Instruction = 0xC6
	NEWMAP    Instruction = 0xC7
	APPEND    Instruction = 0xC8
	REVERSE   Instruction = 0xC9
	REMOVE    Instruction = 0xCA
	HASKEY    Instruction = 0xCB
	KEYS      Instruction = 0xCC
	VALUES    Instruction = 0xCD

	// Stack isolation (intentionally left out, see #362)
	// CALL_I   Instruction = 0xE0
	// CALL_E   Instruction = 0xE1
	// CALL_ED  Instruction = 0xE2
	// CALL_ET  Instruction = 0xE3
	// CALL_EDT Instruction = 0xE4

	// Exceptions
	THROW      Instruction = 0xF0
	THROWIFNOT Instruction = 0xF1
)