github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/vm/opcode/opcode.go (about)

     1  package opcode
     2  
     3  //go:generate stringer -type=Opcode -linecomment
     4  
     5  // Opcode represents a single operation code for the Neo virtual machine.
     6  type Opcode byte
     7  
     8  // Viable list of supported instruction constants.
     9  const (
    10  	// Constants.
    11  	PUSHINT8   Opcode = 0x00
    12  	PUSHINT16  Opcode = 0x01
    13  	PUSHINT32  Opcode = 0x02
    14  	PUSHINT64  Opcode = 0x03
    15  	PUSHINT128 Opcode = 0x04
    16  	PUSHINT256 Opcode = 0x05
    17  
    18  	PUSHT Opcode = 0x08
    19  	PUSHF Opcode = 0x09
    20  
    21  	PUSHA    Opcode = 0x0A
    22  	PUSHNULL Opcode = 0x0B
    23  
    24  	PUSHDATA1 Opcode = 0x0C
    25  	PUSHDATA2 Opcode = 0x0D
    26  	PUSHDATA4 Opcode = 0x0E
    27  
    28  	PUSHM1 Opcode = 0x0F
    29  	PUSH0  Opcode = 0x10
    30  	PUSH1  Opcode = 0x11
    31  	PUSH2  Opcode = 0x12
    32  	PUSH3  Opcode = 0x13
    33  	PUSH4  Opcode = 0x14
    34  	PUSH5  Opcode = 0x15
    35  	PUSH6  Opcode = 0x16
    36  	PUSH7  Opcode = 0x17
    37  	PUSH8  Opcode = 0x18
    38  	PUSH9  Opcode = 0x19
    39  	PUSH10 Opcode = 0x1A
    40  	PUSH11 Opcode = 0x1B
    41  	PUSH12 Opcode = 0x1C
    42  	PUSH13 Opcode = 0x1D
    43  	PUSH14 Opcode = 0x1E
    44  	PUSH15 Opcode = 0x1F
    45  	PUSH16 Opcode = 0x20
    46  
    47  	// Flow control.
    48  	NOP       Opcode = 0x21
    49  	JMP       Opcode = 0x22
    50  	JMPL      Opcode = 0x23 // JMP_L
    51  	JMPIF     Opcode = 0x24
    52  	JMPIFL    Opcode = 0x25 // JMPIF_L
    53  	JMPIFNOT  Opcode = 0x26
    54  	JMPIFNOTL Opcode = 0x27 // JMPIFNOT_L
    55  	JMPEQ     Opcode = 0x28
    56  	JMPEQL    Opcode = 0x29 // JMPEQ_L
    57  	JMPNE     Opcode = 0x2A
    58  	JMPNEL    Opcode = 0x2B // JMPNE_L
    59  	JMPGT     Opcode = 0x2C
    60  	JMPGTL    Opcode = 0x2D // JMPGT_L
    61  	JMPGE     Opcode = 0x2E
    62  	JMPGEL    Opcode = 0x2F // JMPGE_L
    63  	JMPLT     Opcode = 0x30
    64  	JMPLTL    Opcode = 0x31 // JMPLT_L
    65  	JMPLE     Opcode = 0x32
    66  	JMPLEL    Opcode = 0x33 // JMPLE_L
    67  	CALL      Opcode = 0x34
    68  	CALLL     Opcode = 0x35 // CALL_L
    69  	CALLA     Opcode = 0x36
    70  	CALLT     Opcode = 0x37
    71  
    72  	// Exceptions.
    73  	ABORT      Opcode = 0x38
    74  	ASSERT     Opcode = 0x39
    75  	THROW      Opcode = 0x3A
    76  	TRY        Opcode = 0x3B
    77  	TRYL       Opcode = 0x3C // TRY_L
    78  	ENDTRY     Opcode = 0x3D
    79  	ENDTRYL    Opcode = 0x3E // ENDTRY_L
    80  	ENDFINALLY Opcode = 0x3F
    81  
    82  	RET     Opcode = 0x40
    83  	SYSCALL Opcode = 0x41
    84  
    85  	// Stack.
    86  	DEPTH    Opcode = 0x43
    87  	DROP     Opcode = 0x45
    88  	NIP      Opcode = 0x46
    89  	XDROP    Opcode = 0x48
    90  	CLEAR    Opcode = 0x49
    91  	DUP      Opcode = 0x4A
    92  	OVER     Opcode = 0x4B
    93  	PICK     Opcode = 0x4D
    94  	TUCK     Opcode = 0x4E
    95  	SWAP     Opcode = 0x50
    96  	ROT      Opcode = 0x51
    97  	ROLL     Opcode = 0x52
    98  	REVERSE3 Opcode = 0x53
    99  	REVERSE4 Opcode = 0x54
   100  	REVERSEN Opcode = 0x55
   101  
   102  	// Slots.
   103  	INITSSLOT Opcode = 0x56
   104  	INITSLOT  Opcode = 0x57
   105  	LDSFLD0   Opcode = 0x58
   106  	LDSFLD1   Opcode = 0x59
   107  	LDSFLD2   Opcode = 0x5A
   108  	LDSFLD3   Opcode = 0x5B
   109  	LDSFLD4   Opcode = 0x5C
   110  	LDSFLD5   Opcode = 0x5D
   111  	LDSFLD6   Opcode = 0x5E
   112  	LDSFLD    Opcode = 0x5F
   113  	STSFLD0   Opcode = 0x60
   114  	STSFLD1   Opcode = 0x61
   115  	STSFLD2   Opcode = 0x62
   116  	STSFLD3   Opcode = 0x63
   117  	STSFLD4   Opcode = 0x64
   118  	STSFLD5   Opcode = 0x65
   119  	STSFLD6   Opcode = 0x66
   120  	STSFLD    Opcode = 0x67
   121  	LDLOC0    Opcode = 0x68
   122  	LDLOC1    Opcode = 0x69
   123  	LDLOC2    Opcode = 0x6A
   124  	LDLOC3    Opcode = 0x6B
   125  	LDLOC4    Opcode = 0x6C
   126  	LDLOC5    Opcode = 0x6D
   127  	LDLOC6    Opcode = 0x6E
   128  	LDLOC     Opcode = 0x6F
   129  	STLOC0    Opcode = 0x70
   130  	STLOC1    Opcode = 0x71
   131  	STLOC2    Opcode = 0x72
   132  	STLOC3    Opcode = 0x73
   133  	STLOC4    Opcode = 0x74
   134  	STLOC5    Opcode = 0x75
   135  	STLOC6    Opcode = 0x76
   136  	STLOC     Opcode = 0x77
   137  	LDARG0    Opcode = 0x78
   138  	LDARG1    Opcode = 0x79
   139  	LDARG2    Opcode = 0x7A
   140  	LDARG3    Opcode = 0x7B
   141  	LDARG4    Opcode = 0x7C
   142  	LDARG5    Opcode = 0x7D
   143  	LDARG6    Opcode = 0x7E
   144  	LDARG     Opcode = 0x7F
   145  	STARG0    Opcode = 0x80
   146  	STARG1    Opcode = 0x81
   147  	STARG2    Opcode = 0x82
   148  	STARG3    Opcode = 0x83
   149  	STARG4    Opcode = 0x84
   150  	STARG5    Opcode = 0x85
   151  	STARG6    Opcode = 0x86
   152  	STARG     Opcode = 0x87
   153  
   154  	// Splice.
   155  	NEWBUFFER Opcode = 0x88
   156  	MEMCPY    Opcode = 0x89
   157  	CAT       Opcode = 0x8B
   158  	SUBSTR    Opcode = 0x8C
   159  	LEFT      Opcode = 0x8D
   160  	RIGHT     Opcode = 0x8E
   161  
   162  	// Bitwise logic.
   163  	INVERT   Opcode = 0x90
   164  	AND      Opcode = 0x91
   165  	OR       Opcode = 0x92
   166  	XOR      Opcode = 0x93
   167  	EQUAL    Opcode = 0x97
   168  	NOTEQUAL Opcode = 0x98
   169  
   170  	// Arithmetic.
   171  	SIGN        Opcode = 0x99
   172  	ABS         Opcode = 0x9A
   173  	NEGATE      Opcode = 0x9B
   174  	INC         Opcode = 0x9C
   175  	DEC         Opcode = 0x9D
   176  	ADD         Opcode = 0x9E
   177  	SUB         Opcode = 0x9F
   178  	MUL         Opcode = 0xA0
   179  	DIV         Opcode = 0xA1
   180  	MOD         Opcode = 0xA2
   181  	POW         Opcode = 0xA3
   182  	SQRT        Opcode = 0xA4
   183  	MODMUL      Opcode = 0xA5
   184  	MODPOW      Opcode = 0xA6
   185  	SHL         Opcode = 0xA8
   186  	SHR         Opcode = 0xA9
   187  	NOT         Opcode = 0xAA
   188  	BOOLAND     Opcode = 0xAB
   189  	BOOLOR      Opcode = 0xAC
   190  	NZ          Opcode = 0xB1
   191  	NUMEQUAL    Opcode = 0xB3
   192  	NUMNOTEQUAL Opcode = 0xB4
   193  	LT          Opcode = 0xB5
   194  	LE          Opcode = 0xB6
   195  	GT          Opcode = 0xB7
   196  	GE          Opcode = 0xB8
   197  	MIN         Opcode = 0xB9
   198  	MAX         Opcode = 0xBA
   199  	WITHIN      Opcode = 0xBB
   200  
   201  	// Advanced data structures (arrays, structures, maps).
   202  	PACKMAP      Opcode = 0xBE
   203  	PACKSTRUCT   Opcode = 0xBF
   204  	PACK         Opcode = 0xC0
   205  	UNPACK       Opcode = 0xC1
   206  	NEWARRAY0    Opcode = 0xC2
   207  	NEWARRAY     Opcode = 0xC3
   208  	NEWARRAYT    Opcode = 0xC4 // NEWARRAY_T
   209  	NEWSTRUCT0   Opcode = 0xC5
   210  	NEWSTRUCT    Opcode = 0xC6
   211  	NEWMAP       Opcode = 0xC8
   212  	SIZE         Opcode = 0xCA
   213  	HASKEY       Opcode = 0xCB
   214  	KEYS         Opcode = 0xCC
   215  	VALUES       Opcode = 0xCD
   216  	PICKITEM     Opcode = 0xCE
   217  	APPEND       Opcode = 0xCF
   218  	SETITEM      Opcode = 0xD0
   219  	REVERSEITEMS Opcode = 0xD1
   220  	REMOVE       Opcode = 0xD2
   221  	CLEARITEMS   Opcode = 0xD3
   222  	POPITEM      Opcode = 0xD4
   223  
   224  	// Types.
   225  	ISNULL  Opcode = 0xD8
   226  	ISTYPE  Opcode = 0xD9
   227  	CONVERT Opcode = 0xDB
   228  
   229  	// Extensions.
   230  	ABORTMSG  Opcode = 0xE0
   231  	ASSERTMSG Opcode = 0xE1
   232  )
   233  
   234  var validCodes [256]bool
   235  
   236  func init() {
   237  	// We rely on stringer here, it has a map anyway.
   238  	for op := range _Opcode_map {
   239  		validCodes[int(op)] = true
   240  	}
   241  }
   242  
   243  // IsValid returns true if the opcode passed is valid (defined in the VM).
   244  func IsValid(op Opcode) bool {
   245  	return validCodes[int(op)]
   246  }