1pub mod eval;
6mod gasometer;
7
8use evm::{
9 interpreter::{
10 etable::{Etable, MultiEfn, MultiEtable, Single},
11 opcode::Opcode,
12 },
13 standard::GasometerState,
14};
15
16pub use crate::gasometer::eval as eval_gasometer;
17
18pub const OPCODE_EVM64_MODE: Opcode = Opcode(0xc0);
19
20pub fn etable<'config, S, H, Tr>(
23 orig: (Single<S, H, Tr>, Etable<S, H, Tr>),
24) -> (Etable<S, H, Tr>, MultiEtable<S, H, Tr>)
25where
26 S: AsRef<GasometerState<'config>> + AsMut<GasometerState<'config>>,
27{
28 let mut gasometer_etable = Etable::from(orig.0);
29 let mut eval_etable = MultiEtable::from(orig.1);
30
31 let mut mode_etable = Etable::none();
32 mode_etable[Opcode::ADD.as_usize()] = eval::eval_add;
33 mode_etable[Opcode::MUL.as_usize()] = eval::eval_mul;
34 mode_etable[Opcode::SUB.as_usize()] = eval::eval_sub;
35 mode_etable[Opcode::DIV.as_usize()] = eval::eval_div;
36 mode_etable[Opcode::SDIV.as_usize()] = eval::eval_sdiv;
37 mode_etable[Opcode::MOD.as_usize()] = eval::eval_mod;
38 mode_etable[Opcode::SMOD.as_usize()] = eval::eval_smod;
39 mode_etable[Opcode::ADDMOD.as_usize()] = eval::eval_addmod;
40 mode_etable[Opcode::MULMOD.as_usize()] = eval::eval_mulmod;
41 mode_etable[Opcode::EXP.as_usize()] = eval::eval_exp;
42 mode_etable[Opcode::LT.as_usize()] = eval::eval_lt;
43 mode_etable[Opcode::GT.as_usize()] = eval::eval_gt;
44 mode_etable[Opcode::SLT.as_usize()] = eval::eval_slt;
45 mode_etable[Opcode::SGT.as_usize()] = eval::eval_sgt;
46 mode_etable[Opcode::EQ.as_usize()] = eval::eval_eq;
47 mode_etable[Opcode::ISZERO.as_usize()] = eval::eval_iszero;
48 mode_etable[Opcode::AND.as_usize()] = eval::eval_and;
49 mode_etable[Opcode::OR.as_usize()] = eval::eval_or;
50 mode_etable[Opcode::XOR.as_usize()] = eval::eval_xor;
51 mode_etable[Opcode::NOT.as_usize()] = eval::eval_not;
52 mode_etable[Opcode::SHL.as_usize()] = eval::eval_shl;
53 mode_etable[Opcode::SHR.as_usize()] = eval::eval_shr;
54 mode_etable[Opcode::SAR.as_usize()] = eval::eval_sar;
55 mode_etable[Opcode::JUMP.as_usize()] = eval::eval_jump;
56 mode_etable[Opcode::JUMPI.as_usize()] = eval::eval_jumpi;
57
58 gasometer_etable[OPCODE_EVM64_MODE.as_usize()] = eval_gasometer;
59 eval_etable[OPCODE_EVM64_MODE.as_usize()] = MultiEfn::Node(Box::new(mode_etable.into()));
60
61 (gasometer_etable, eval_etable)
62}