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 }