From 3b3b9d2ff11b78c531870b47fe93a9217eb842f8 Mon Sep 17 00:00:00 2001 From: Andrei Kashin Date: Tue, 30 Jan 2024 15:10:59 +0000 Subject: [PATCH] Add assert about aligned addresses --- cranelift/codegen/src/isa/zkasm/inst/emit.rs | 10 + cranelift/codegen/src/isa/zkasm/inst/mod.rs | 2 + .../sha256/generated/from_rust.zkasm | 383 ++++++++++++------ cranelift/zkasm_data/generated/global.zkasm | 18 +- cranelift/zkasm_data/generated/memory.zkasm | 14 +- .../zkasm_data/generated/memory_i32.zkasm | 219 ++++++---- 6 files changed, 436 insertions(+), 210 deletions(-) diff --git a/cranelift/codegen/src/isa/zkasm/inst/emit.rs b/cranelift/codegen/src/isa/zkasm/inst/emit.rs index 80c2582dcce1..3a6e276f6079 100644 --- a/cranelift/codegen/src/isa/zkasm/inst/emit.rs +++ b/cranelift/codegen/src/isa/zkasm/inst/emit.rs @@ -591,6 +591,11 @@ impl MachInstEmit for Inst { match from { AMode::RegOffset(r, ..) => { debug_assert_eq!(r, e0()); + // For simplicity we assume that register address is word-aligned. + // This was the case for Rust-generated code, but might be violated in the + // future. + put_string(&format!("${{ {} % 8 }} => A\n", reg_name(r)), sink); + put_string(&format!("0: ASSERT\n"), sink); // TODO(#43): Implement the conversion using verifiable computations. put_string( &format!( @@ -689,6 +694,11 @@ impl MachInstEmit for Inst { match to { AMode::RegOffset(r, ..) => { debug_assert_eq!(r, e0()); + // For simplicity we assume that register address is word-aligned. + // This was the case for Rust-generated code, but might be violated in the + // future. + put_string(&format!("${{ {} % 8 }} => A\n", reg_name(r)), sink); + put_string(&format!("0: ASSERT\n"), sink); // TODO(#43): Implement the conversion using verifiable computations. put_string( &format!( diff --git a/cranelift/codegen/src/isa/zkasm/inst/mod.rs b/cranelift/codegen/src/isa/zkasm/inst/mod.rs index fe0fc66f1551..6a2e4e8ce82e 100644 --- a/cranelift/codegen/src/isa/zkasm/inst/mod.rs +++ b/cranelift/codegen/src/isa/zkasm/inst/mod.rs @@ -337,6 +337,7 @@ fn zkasm_get_operands VReg>(inst: &Inst, collector: &mut OperandC collector.reg_fixed_use(r, e0()); } let mut clobbered = PRegSet::empty(); + clobbered.add(a0().to_real_reg().unwrap().into()); clobbered.add(d0().to_real_reg().unwrap().into()); collector.reg_clobbers(clobbered); collector.reg_def(rd); @@ -346,6 +347,7 @@ fn zkasm_get_operands VReg>(inst: &Inst, collector: &mut OperandC collector.reg_fixed_use(r, e0()); } let mut clobbered = PRegSet::empty(); + clobbered.add(a0().to_real_reg().unwrap().into()); clobbered.add(d0().to_real_reg().unwrap().into()); collector.reg_clobbers(clobbered); collector.reg_late_use(src); diff --git a/cranelift/zkasm_data/benchmarks/sha256/generated/from_rust.zkasm b/cranelift/zkasm_data/benchmarks/sha256/generated/from_rust.zkasm index 553a5ef3bb2c..10b4e18ea822 100644 --- a/cranelift/zkasm_data/benchmarks/sha256/generated/from_rust.zkasm +++ b/cranelift/zkasm_data/benchmarks/sha256/generated/from_rust.zkasm @@ -22,14 +22,17 @@ function_1: E :MSTORE(SP - 3) B :MSTORE(SP - 4) SP - 18 => SP - $ => A :MLOAD(global_0) + $ => E :MLOAD(global_0) + E => A 112n => B ;; LoadConst32 $ => A :SUB 4294967295n => B ;; LoadConst64 $ => A :AND + A => B A :MSTORE(SP + 13) - A :MSTORE(global_0) + B :MSTORE(global_0) 24n => B ;; LoadConst32 + $ => A :MLOAD(SP + 13) $ => D :ADD D => A 4294967295n => B ;; LoadConst64 @@ -38,11 +41,15 @@ function_1: 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2072) / 8 } => E $ => C :MLOAD(MEM:E) 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 2) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 16n => B ;; LoadConst32 @@ -55,11 +62,15 @@ function_1: 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2064) / 8 } => E $ => C :MLOAD(MEM:E) 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 1) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 8n => B ;; LoadConst32 @@ -72,11 +83,15 @@ function_1: 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2056) / 8 } => E $ => C :MLOAD(MEM:E) 0n => A ;; LoadConst32 $ => B :MLOAD(SP) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 50n => B ;; LoadConst32 @@ -88,6 +103,8 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 58n => B ;; LoadConst32 @@ -99,6 +116,8 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 66n => B ;; LoadConst32 @@ -110,6 +129,8 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 74n => B ;; LoadConst32 @@ -121,6 +142,8 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 82n => B ;; LoadConst32 @@ -132,6 +155,8 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 88n => B ;; LoadConst32 @@ -143,12 +168,16 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 1n => C ;; LoadConst32 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 104) / 8 } => E ${ C & ((1 << 8) - 1) } => C $ => D :MLOAD(MEM:E) @@ -156,11 +185,15 @@ function_1: 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 32) / 8 } => E C :MSTORE(MEM:E) 0n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 42) / 8 } => E $ => D :MLOAD(MEM:E) ${ (D & ~(((1 << 64) - 1) << 16)) | (C << 16) } :MSTORE(MEM:E) @@ -169,6 +202,8 @@ function_1: 32856n => C ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 40) / 8 } => E ${ C & ((1 << 16) - 1) } => C $ => D :MLOAD(MEM:E) @@ -176,11 +211,15 @@ function_1: 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2048) / 8 } => E $ => C :MLOAD(MEM:E) 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 96n => B ;; LoadConst32 @@ -192,6 +231,8 @@ function_1: 576460752303423488n => C ;; LoadConst64 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E C :MSTORE(MEM:E) 40n => B ;; LoadConst32 @@ -200,9 +241,9 @@ function_1: D => A 4294967295n => B ;; LoadConst64 $ => B :AND - 1n => A ;; LoadConst32 + 1n => C ;; LoadConst32 SP - 1 => SP - A :MSTORE(SP) + C :MSTORE(SP) $ => A :MLOAD(SP + 14) zkPC + 2 => RR :JMP(function_2) @@ -210,61 +251,81 @@ function_1: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 2) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 12) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 12) 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 1) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 11) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 11) 0n => A ;; LoadConst32 $ => B :MLOAD(SP) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 10) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 10) 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 28) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 9) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 9) 0n => A ;; LoadConst32 + $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 20) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 8) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 8) 0n => A ;; LoadConst32 + $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 12) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 7) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 7) 0n => A ;; LoadConst32 + $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 4) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 6) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 6) 75n => A ;; LoadConst64 A :MSTORE(SP + 4) 0n => A ;; LoadConst32 + $ => B :MLOAD(SP + 13) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 5) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 5) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -283,11 +344,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 5) $ => B :AND - B => C + B => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -378,11 +439,11 @@ function_1: $ => A :MLOAD(SP + 4) B :ASSERT 56n => A ;; LoadConst64 - A => C + A => D 255n => B ;; LoadConst32 $ => A :MLOAD(SP + 5) $ => B :AND - C => A + D => A B :ASSERT 71n => A ;; LoadConst64 A :MSTORE(SP + 4) @@ -404,11 +465,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 6) $ => B :AND - B => C + B => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -499,11 +560,11 @@ function_1: $ => A :MLOAD(SP + 4) B :ASSERT 125n => A ;; LoadConst64 - A => E + A => C 255n => B ;; LoadConst32 $ => A :MLOAD(SP + 6) $ => B :AND - E => A + C => A B :ASSERT 108n => A ;; LoadConst64 A :MSTORE(SP + 4) @@ -525,11 +586,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 10) $ => E :AND - E => C + E => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -646,11 +707,10 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 7) $ => D :AND - D => C 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -741,11 +801,11 @@ function_1: $ => A :MLOAD(SP + 4) B :ASSERT 163n => A ;; LoadConst64 - A => D + A => E 255n => B ;; LoadConst32 $ => A :MLOAD(SP + 7) $ => B :AND - D => A + E => A B :ASSERT 94n => A ;; LoadConst64 A :MSTORE(SP + 4) @@ -767,10 +827,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 11) $ => C :AND + C => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -887,11 +948,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 8) $ => B :AND - B => C + B => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -982,11 +1043,11 @@ function_1: $ => A :MLOAD(SP + 4) B :ASSERT 244n => A ;; LoadConst64 - A => C + A => D 255n => B ;; LoadConst32 $ => A :MLOAD(SP + 8) $ => B :AND - C => A + D => A B :ASSERT 221n => A ;; LoadConst64 A :MSTORE(SP + 4) @@ -1008,11 +1069,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 12) $ => B :AND - B => C + B => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -1103,11 +1164,11 @@ function_1: $ => A :MLOAD(SP + 3) B :ASSERT 93n => A ;; LoadConst64 - A => E + A => C 255n => B ;; LoadConst32 $ => A :MLOAD(SP + 12) $ => B :AND - E => A + C => A B :ASSERT 246n => A ;; LoadConst64 A :MSTORE(SP + 3) @@ -1129,11 +1190,11 @@ function_1: 65280n => B ;; LoadConst32 $ => A :MLOAD(SP + 9) $ => E :AND - E => C + E => D 8n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND - C => A + D => A ;;NEED_INCLUDE: 2-exp zkPC + 2 => RR :JMP(@two_power + E) @@ -1234,8 +1295,8 @@ function_1: $ => A :MLOAD(SP + 13) $ => A :ADD 4294967295n => B ;; LoadConst64 - $ => A :AND - A :MSTORE(global_0) + $ => B :AND + B :MSTORE(global_0) SP + 18 => SP $ => C :MLOAD(SP - 1) $ => D :MLOAD(SP - 2) @@ -1254,11 +1315,13 @@ function_2: SP - 1182 => SP A :MSTORE(SP) B :MSTORE(SP + 1) - $ => A :MLOAD(SP + 1183) - A :MSTORE(SP + 2) + $ => B :MLOAD(SP + 1183) + B :MSTORE(SP + 2) 0n => A ;; LoadConst32 $ => B :MLOAD(SP) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 28) / 8 } => E $ => E :MLOAD(MEM:E) ${ E >> 32 } => E @@ -1266,12 +1329,16 @@ function_2: E :MSTORE(SP + 9) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 24) / 8 } => E $ => C :MLOAD(MEM:E) ${ C & ((1 << 32) - 1) } => C C :MSTORE(SP + 10) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 20) / 8 } => E $ => C :MLOAD(MEM:E) ${ C >> 32 } => C @@ -1279,12 +1346,16 @@ function_2: C :MSTORE(SP + 11) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 16) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 12) + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 32) - 1) } => C + C :MSTORE(SP + 12) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 12) / 8 } => E $ => E :MLOAD(MEM:E) ${ E >> 32 } => E @@ -1292,12 +1363,16 @@ function_2: E :MSTORE(SP + 13) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 8) / 8 } => E $ => E :MLOAD(MEM:E) ${ E & ((1 << 32) - 1) } => E E :MSTORE(SP + 14) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 4) / 8 } => E $ => C :MLOAD(MEM:E) ${ C >> 32 } => C @@ -1305,6 +1380,8 @@ function_2: C :MSTORE(SP + 15) 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E $ => B :MLOAD(MEM:E) ${ B & ((1 << 32) - 1) } => B @@ -1595,10 +1672,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1165) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1165) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -1806,11 +1885,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 4) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1155) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1155) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -2144,10 +2225,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 8) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1139) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1139) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -2481,11 +2564,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 12) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1123) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1123) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -2819,10 +2904,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 16) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1107) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1107) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -3155,11 +3242,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 20) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1091) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1091) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -3493,10 +3582,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 24) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1075) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1075) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -3830,11 +3921,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 28) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1059) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1059) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -4168,10 +4261,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 32) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1043) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1043) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -4505,11 +4600,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 36) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1027) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1027) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -4843,10 +4940,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 40) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 1011) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 1011) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -5180,11 +5279,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 44) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 995) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 995) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -5518,10 +5619,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 48) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 979) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 979) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -5855,11 +5958,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 52) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 963) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 963) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -6193,10 +6298,12 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 56) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 947) + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 947) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -6530,11 +6637,13 @@ label_2_3: 0n => A ;; LoadConst32 $ => B :MLOAD(SP + 8) $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 60) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 32 } => A - ${ A & ((1 << 32) - 1) } => A - A :MSTORE(SP + 931) + $ => B :MLOAD(MEM:E) + ${ B >> 32 } => B + ${ B & ((1 << 32) - 1) } => B + B :MSTORE(SP + 931) 24n => A ;; LoadConst32 31n => B ;; LoadConst64 $ => E :AND @@ -27758,35 +27867,45 @@ label_2_7: 0n => A ;; LoadConst32 $ => B :MLOAD(SP) $ => E :ADD - $ => A :MLOAD(SP + 9) + $ => C :MLOAD(SP + 9) + ${ E % 8 } => A + 0: ASSERT ${ (E + 28) / 8 } => E - ${ A & ((1 << 32) - 1) } => A + ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) - ${ (D & ~(((1 << 32) - 1) << 32)) | (A << 32) } :MSTORE(MEM:E) + ${ (D & ~(((1 << 32) - 1) << 32)) | (C << 32) } :MSTORE(MEM:E) 0n => A ;; LoadConst32 $ => E :ADD - $ => A :MLOAD(SP + 10) + $ => C :MLOAD(SP + 10) + ${ E % 8 } => A + 0: ASSERT ${ (E + 24) / 8 } => E - ${ A & ((1 << 32) - 1) } => A + ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) - ${ (D & ~(((1 << 32) - 1) << 0)) | (A << 0) } :MSTORE(MEM:E) + ${ (D & ~(((1 << 32) - 1) << 0)) | (C << 0) } :MSTORE(MEM:E) 0n => A ;; LoadConst32 $ => E :ADD $ => C :MLOAD(SP + 11) + ${ E % 8 } => A + 0: ASSERT ${ (E + 20) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) ${ (D & ~(((1 << 32) - 1) << 32)) | (C << 32) } :MSTORE(MEM:E) 0n => A ;; LoadConst32 $ => E :ADD - $ => A :MLOAD(SP + 12) + $ => C :MLOAD(SP + 12) + ${ E % 8 } => A + 0: ASSERT ${ (E + 16) / 8 } => E - ${ A & ((1 << 32) - 1) } => A + ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) - ${ (D & ~(((1 << 32) - 1) << 0)) | (A << 0) } :MSTORE(MEM:E) + ${ (D & ~(((1 << 32) - 1) << 0)) | (C << 0) } :MSTORE(MEM:E) 0n => A ;; LoadConst32 $ => E :ADD $ => C :MLOAD(SP + 13) + ${ E % 8 } => A + 0: ASSERT ${ (E + 12) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) @@ -27794,6 +27913,8 @@ label_2_7: 0n => A ;; LoadConst32 $ => E :ADD $ => C :MLOAD(SP + 14) + ${ E % 8 } => A + 0: ASSERT ${ (E + 8) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) @@ -27801,6 +27922,8 @@ label_2_7: 0n => A ;; LoadConst32 $ => E :ADD $ => C :MLOAD(SP + 15) + ${ E % 8 } => A + 0: ASSERT ${ (E + 4) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) @@ -27808,6 +27931,8 @@ label_2_7: 0n => A ;; LoadConst32 $ => E :ADD $ => B :MLOAD(SP + 16) + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E ${ B & ((1 << 32) - 1) } => B $ => D :MLOAD(MEM:E) diff --git a/cranelift/zkasm_data/generated/global.zkasm b/cranelift/zkasm_data/generated/global.zkasm index 8a9e92eeba98..465a3ddc9429 100644 --- a/cranelift/zkasm_data/generated/global.zkasm +++ b/cranelift/zkasm_data/generated/global.zkasm @@ -10,23 +10,27 @@ start: function_1: SP - 1 => SP RR :MSTORE(SP) - D :MSTORE(SP - 1) - E :MSTORE(SP - 2) - B :MSTORE(SP - 3) + C :MSTORE(SP - 1) + D :MSTORE(SP - 2) + E :MSTORE(SP - 3) + B :MSTORE(SP - 4) SP - 4 => SP 3n => E ;; LoadConst32 E :MSTORE(global_1) - $ => A :MLOAD(global_0) + $ => E :MLOAD(global_0) + E => C $ => B :MLOAD(global_1) + C => A $ => A :ADD 4294967295n => B ;; LoadConst64 $ => A :AND 1n => B ;; LoadConst32 B :ASSERT SP + 4 => SP - $ => D :MLOAD(SP - 1) - $ => E :MLOAD(SP - 2) - $ => B :MLOAD(SP - 3) + $ => C :MLOAD(SP - 1) + $ => D :MLOAD(SP - 2) + $ => E :MLOAD(SP - 3) + $ => B :MLOAD(SP - 4) $ => RR :MLOAD(SP) SP + 1 => SP :JMP(RR) diff --git a/cranelift/zkasm_data/generated/memory.zkasm b/cranelift/zkasm_data/generated/memory.zkasm index c255b6877c56..fcd3c1ac387d 100644 --- a/cranelift/zkasm_data/generated/memory.zkasm +++ b/cranelift/zkasm_data/generated/memory.zkasm @@ -15,6 +15,8 @@ function_1: 2n => C ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) @@ -23,6 +25,8 @@ function_1: 3n => C ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E ${ C & ((1 << 32) - 1) } => C $ => D :MLOAD(MEM:E) @@ -30,13 +34,17 @@ function_1: 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A - A => C + $ => E :MLOAD(MEM:E) + ${ E & ((1 << 32) - 1) } => E + E => C 8n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E $ => B :MLOAD(MEM:E) ${ B & ((1 << 32) - 1) } => B diff --git a/cranelift/zkasm_data/generated/memory_i32.zkasm b/cranelift/zkasm_data/generated/memory_i32.zkasm index 6c0a6e60b906..0311d85675ed 100644 --- a/cranelift/zkasm_data/generated/memory_i32.zkasm +++ b/cranelift/zkasm_data/generated/memory_i32.zkasm @@ -11,229 +11,306 @@ start: function_1: SP - 1 => SP RR :MSTORE(SP) - D :MSTORE(SP - 1) - E :MSTORE(SP - 2) - B :MSTORE(SP - 3) + C :MSTORE(SP - 1) + D :MSTORE(SP - 2) + E :MSTORE(SP - 3) + B :MSTORE(SP - 4) SP - 4 => SP 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 8) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 8) - 1) } => B + B => A 97n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 8) - 1) } => A + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 8) - 1) } => C + C => A 97n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 1) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 8) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 8 } => E + ${ E & ((1 << 8) - 1) } => E + E => A 98n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 16 } => A - ${ A & ((1 << 8) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 16 } => E + ${ E & ((1 << 8) - 1) } => E + E => A 99n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 25) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 8) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B >> 8 } => B + ${ B & ((1 << 8) - 1) } => B + B => A 122n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 8) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 8) - 1) } => B + B => A 97n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 8) - 1) } => A + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 8) - 1) } => C + C => A 97n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 1) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 8) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 8 } => E + ${ E & ((1 << 8) - 1) } => E + E => A 98n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 16 } => A - ${ A & ((1 << 8) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 16 } => E + ${ E & ((1 << 8) - 1) } => E + E => A 99n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 25) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 8) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B >> 8 } => B + ${ B & ((1 << 8) - 1) } => B + B => A 122n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 16) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 16) - 1) } => B + B => A 25185n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 16) - 1) } => A + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 16) - 1) } => C + C => A 25185n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 1) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 16) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 8 } => E + ${ E & ((1 << 16) - 1) } => E + E => A 25442n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 16 } => A - ${ A & ((1 << 16) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 16 } => E + ${ E & ((1 << 16) - 1) } => E + E => A 25699n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 25) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 16) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B >> 8 } => B + ${ B & ((1 << 16) - 1) } => B + B => A 122n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 16) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 16) - 1) } => B + B => A 25185n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 16) - 1) } => A + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 16) - 1) } => C + C => A 25185n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 1) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 16) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 8 } => E + ${ E & ((1 << 16) - 1) } => E + E => A 25442n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 16 } => A - ${ A & ((1 << 16) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 16 } => E + ${ E & ((1 << 16) - 1) } => E + E => A 25699n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 25) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 16) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B >> 8 } => B + ${ B & ((1 << 16) - 1) } => B + B => A 122n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B & ((1 << 32) - 1) } => B + B => A 1684234849n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A & ((1 << 32) - 1) } => A + $ => C :MLOAD(MEM:E) + ${ C & ((1 << 32) - 1) } => C + C => A 1684234849n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 1) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 32) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 8 } => E + ${ E & ((1 << 32) - 1) } => E + E => A 1701077858n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 2) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 16 } => A - ${ A & ((1 << 32) - 1) } => A + $ => E :MLOAD(MEM:E) + ${ E >> 16 } => E + ${ E & ((1 << 32) - 1) } => E + E => A 1717920867n => B ;; LoadConst32 B :ASSERT 0n => B ;; LoadConst32 0n => A ;; LoadConst32 $ => E :ADD + ${ E % 8 } => A + 0: ASSERT ${ (E + 25) / 8 } => E - $ => A :MLOAD(MEM:E) - ${ A >> 8 } => A - ${ A & ((1 << 32) - 1) } => A + $ => B :MLOAD(MEM:E) + ${ B >> 8 } => B + ${ B & ((1 << 32) - 1) } => B + B => A 122n => B ;; LoadConst32 B :ASSERT SP + 4 => SP - $ => D :MLOAD(SP - 1) - $ => E :MLOAD(SP - 2) - $ => B :MLOAD(SP - 3) + $ => C :MLOAD(SP - 1) + $ => D :MLOAD(SP - 2) + $ => E :MLOAD(SP - 3) + $ => B :MLOAD(SP - 4) $ => RR :MLOAD(SP) SP + 1 => SP :JMP(RR)