Skip to main content

evmole/evm/
op.rs

1#![allow(dead_code)]
2
3pub type OpCode = u8;
4
5#[derive(Debug, Copy, Clone)]
6pub struct OpCodeInfo {
7    pub name: &'static str,
8    pub known: bool,
9    pub size: usize,
10    pub stack_in: usize,
11    pub stack_out: usize,
12}
13
14macro_rules! declare_opcodes {
15    ($(($code:literal, $name:ident, $size:literal, $stack_in:literal, $stack_out:literal)),* $(,)?) => {
16        $(
17            pub const $name: OpCode = $code;
18        )*
19
20        const INFOS: [OpCodeInfo; 256] = {
21            let mut arr = [OpCodeInfo{name: "?", known: false, size: 1, stack_in: 0, stack_out: 0}; 256];
22            $(
23                let p = $code as usize;
24                arr[p].name = stringify!($name);
25                arr[p].known = true;
26                arr[p].size = $size;
27                arr[p].stack_in = $stack_in;
28                arr[p].stack_out = $stack_out;
29            )*
30            arr
31        };
32
33    };
34}
35
36pub const fn info(op: OpCode) -> &'static OpCodeInfo {
37    &INFOS[op as usize]
38}
39
40declare_opcodes![
41    (0x00, STOP, 1, 0, 0),
42    (0x01, ADD, 1, 2, 1),
43    (0x02, MUL, 1, 2, 1),
44    (0x03, SUB, 1, 2, 1),
45    (0x04, DIV, 1, 2, 1),
46    (0x05, SDIV, 1, 2, 1),
47    (0x06, MOD, 1, 2, 1),
48    (0x07, SMOD, 1, 2, 1),
49    (0x08, ADDMOD, 1, 3, 1),
50    (0x09, MULMOD, 1, 3, 1),
51    (0x0A, EXP, 1, 2, 1),
52    (0x0B, SIGNEXTEND, 1, 2, 1),
53    (0x10, LT, 1, 2, 1),
54    (0x11, GT, 1, 2, 1),
55    (0x12, SLT, 1, 2, 1),
56    (0x13, SGT, 1, 2, 1),
57    (0x14, EQ, 1, 2, 1),
58    (0x15, ISZERO, 1, 1, 1),
59    (0x16, AND, 1, 2, 1),
60    (0x17, OR, 1, 2, 1),
61    (0x18, XOR, 1, 2, 1),
62    (0x19, NOT, 1, 1, 1),
63    (0x1A, BYTE, 1, 2, 1),
64    (0x1B, SHL, 1, 2, 1),
65    (0x1C, SHR, 1, 2, 1),
66    (0x1D, SAR, 1, 2, 1),
67    (0x1E, CLZ, 1, 1, 1),
68    (0x20, KECCAK256, 1, 2, 1),
69    (0x30, ADDRESS, 1, 0, 1),
70    (0x31, BALANCE, 1, 1, 1),
71    (0x32, ORIGIN, 1, 0, 1),
72    (0x33, CALLER, 1, 0, 1),
73    (0x34, CALLVALUE, 1, 0, 1),
74    (0x35, CALLDATALOAD, 1, 1, 1),
75    (0x36, CALLDATASIZE, 1, 0, 1),
76    (0x37, CALLDATACOPY, 1, 3, 0),
77    (0x38, CODESIZE, 1, 0, 1),
78    (0x39, CODECOPY, 1, 3, 0),
79    (0x3A, GASPRICE, 1, 0, 1),
80    (0x3B, EXTCODESIZE, 1, 1, 1),
81    (0x3C, EXTCODECOPY, 1, 4, 0),
82    (0x3D, RETURNDATASIZE, 1, 0, 1),
83    (0x3E, RETURNDATACOPY, 1, 3, 0),
84    (0x3F, EXTCODEHASH, 1, 1, 1),
85    (0x40, BLOCKHASH, 1, 1, 1),
86    (0x41, COINBASE, 1, 0, 1),
87    (0x42, TIMESTAMP, 1, 0, 1),
88    (0x43, NUMBER, 1, 0, 1),
89    (0x44, PREVRANDAO, 1, 0, 1),
90    (0x45, GASLIMIT, 1, 0, 1),
91    (0x46, CHAINID, 1, 0, 1),
92    (0x47, SELFBALANCE, 1, 0, 1),
93    (0x48, BASEFEE, 1, 0, 1),
94    (0x49, BLOBHASH, 1, 1, 1),
95    (0x4A, BLOBBASEFEE, 1, 0, 1),
96    (0x50, POP, 1, 1, 0),
97    (0x51, MLOAD, 1, 1, 1),
98    (0x52, MSTORE, 1, 2, 0),
99    (0x53, MSTORE8, 1, 2, 0),
100    (0x54, SLOAD, 1, 1, 1),
101    (0x55, SSTORE, 1, 2, 0),
102    (0x56, JUMP, 1, 1, 0),
103    (0x57, JUMPI, 1, 2, 0),
104    (0x58, PC, 1, 0, 1),
105    (0x59, MSIZE, 1, 0, 1),
106    (0x5A, GAS, 1, 0, 1),
107    (0x5B, JUMPDEST, 1, 0, 0),
108    (0x5C, TLOAD, 1, 1, 1),
109    (0x5D, TSTORE, 1, 2, 0),
110    (0x5E, MCOPY, 1, 3, 0),
111    (0x5F, PUSH0, 1, 0, 1),
112    (0x60, PUSH1, 2, 0, 1),
113    (0x61, PUSH2, 3, 0, 1),
114    (0x62, PUSH3, 4, 0, 1),
115    (0x63, PUSH4, 5, 0, 1),
116    (0x64, PUSH5, 6, 0, 1),
117    (0x65, PUSH6, 7, 0, 1),
118    (0x66, PUSH7, 8, 0, 1),
119    (0x67, PUSH8, 9, 0, 1),
120    (0x68, PUSH9, 10, 0, 1),
121    (0x69, PUSH10, 11, 0, 1),
122    (0x6A, PUSH11, 12, 0, 1),
123    (0x6B, PUSH12, 13, 0, 1),
124    (0x6C, PUSH13, 14, 0, 1),
125    (0x6D, PUSH14, 15, 0, 1),
126    (0x6E, PUSH15, 16, 0, 1),
127    (0x6F, PUSH16, 17, 0, 1),
128    (0x70, PUSH17, 18, 0, 1),
129    (0x71, PUSH18, 19, 0, 1),
130    (0x72, PUSH19, 20, 0, 1),
131    (0x73, PUSH20, 21, 0, 1),
132    (0x74, PUSH21, 22, 0, 1),
133    (0x75, PUSH22, 23, 0, 1),
134    (0x76, PUSH23, 24, 0, 1),
135    (0x77, PUSH24, 25, 0, 1),
136    (0x78, PUSH25, 26, 0, 1),
137    (0x79, PUSH26, 27, 0, 1),
138    (0x7A, PUSH27, 28, 0, 1),
139    (0x7B, PUSH28, 29, 0, 1),
140    (0x7C, PUSH29, 30, 0, 1),
141    (0x7D, PUSH30, 31, 0, 1),
142    (0x7E, PUSH31, 32, 0, 1),
143    (0x7F, PUSH32, 33, 0, 1),
144    (0x80, DUP1, 1, 1, 2),
145    (0x81, DUP2, 1, 2, 3),
146    (0x82, DUP3, 1, 3, 4),
147    (0x83, DUP4, 1, 4, 5),
148    (0x84, DUP5, 1, 5, 6),
149    (0x85, DUP6, 1, 6, 7),
150    (0x86, DUP7, 1, 7, 8),
151    (0x87, DUP8, 1, 8, 9),
152    (0x88, DUP9, 1, 9, 10),
153    (0x89, DUP10, 1, 10, 11),
154    (0x8A, DUP11, 1, 11, 12),
155    (0x8B, DUP12, 1, 12, 13),
156    (0x8C, DUP13, 1, 13, 14),
157    (0x8D, DUP14, 1, 14, 15),
158    (0x8E, DUP15, 1, 15, 16),
159    (0x8F, DUP16, 1, 16, 17),
160    (0x90, SWAP1, 1, 2, 2),
161    (0x91, SWAP2, 1, 3, 3),
162    (0x92, SWAP3, 1, 4, 4),
163    (0x93, SWAP4, 1, 5, 5),
164    (0x94, SWAP5, 1, 6, 6),
165    (0x95, SWAP6, 1, 7, 7),
166    (0x96, SWAP7, 1, 8, 8),
167    (0x97, SWAP8, 1, 9, 9),
168    (0x98, SWAP9, 1, 10, 10),
169    (0x99, SWAP10, 1, 11, 11),
170    (0x9A, SWAP11, 1, 12, 12),
171    (0x9B, SWAP12, 1, 13, 13),
172    (0x9C, SWAP13, 1, 14, 14),
173    (0x9D, SWAP14, 1, 15, 15),
174    (0x9E, SWAP15, 1, 16, 16),
175    (0x9F, SWAP16, 1, 17, 17),
176    (0xA0, LOG0, 1, 2, 0),
177    (0xA1, LOG1, 1, 3, 0),
178    (0xA2, LOG2, 1, 4, 0),
179    (0xA3, LOG3, 1, 5, 0),
180    (0xA4, LOG4, 1, 6, 0),
181    (0xF0, CREATE, 1, 3, 1),
182    (0xF1, CALL, 1, 7, 1),
183    (0xF2, CALLCODE, 1, 7, 1),
184    (0xF3, RETURN, 1, 2, 0),
185    (0xF4, DELEGATECALL, 1, 6, 1),
186    (0xF5, CREATE2, 1, 4, 1),
187    (0xFA, STATICCALL, 1, 6, 1),
188    (0xFD, REVERT, 1, 2, 0),
189    (0xFE, INVALID, 1, 0, 0),
190    (0xFF, SELFDESTRUCT, 1, 1, 0),
191];