diff --git a/evm/src/cpu/kernel/asm/curve/bls381/util.asm b/evm/src/cpu/kernel/asm/curve/bls381/util.asm index ad340d17..1417c2b4 100644 --- a/evm/src/cpu/kernel/asm/curve/bls381/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bls381/util.asm @@ -12,20 +12,6 @@ // stack: z0, z1 %endmacro -%macro mul_fp381 - // stack: x0, x1, y0, y1 - PROVER_INPUT(sf::bls381_base::mul_hi) - // stack: z1, x0, x1, y0, y1 - SWAP4 - // stack: y1, x0, x1, y0, z1 - PROVER_INPUT(sf::bls381_base::mul_lo) - // stack: z0, y1, x0, x1, y0, z1 - SWAP4 - // stack: y0, y1, x0, x1, z0, z1 - %pop4 - // stack: z0, z1 -%endmacro - %macro sub_fp381 // stack: x0, x1, y0, y1 PROVER_INPUT(sf::bls381_base::sub_hi) @@ -40,31 +26,65 @@ // stack: z0, z1 %endmacro +%macro mul_fp381 + // stack: x0, x1, y0, y1 + PROVER_INPUT(sf::bls381_base::mul_hi) + // stack: z1, x0, x1, y0, y1 + SWAP4 + // stack: y1, x0, x1, y0, z1 + PROVER_INPUT(sf::bls381_base::mul_lo) + // stack: z0, y1, x0, x1, y0, z1 + SWAP4 + // stack: y0, y1, x0, x1, z0, z1 + %pop4 + // stack: z0, z1 +%endmacro + global test_add_fp381: %add_fp381 %jump(0xdeadbeef) -global test_mul_fp381: - %mul_fp381 - %jump(0xdeadbeef) - global test_sub_fp381: %sub_fp381 %jump(0xdeadbeef) +global test_mul_fp381: + %mul_fp381 + %jump(0xdeadbeef) -global add_fp381_2: - // stack: x_re, x_im, y_re, y_im, jumpdest + +%macro add_fp381_2 + // stack: x_re, x_im, y_re, y_im %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (y_im, x_im, y_re, x_re) - // stack: y_im, x_im, y_re, x_re, jumpdest + // stack: y_im, x_im, y_re, x_re %add_fp381 - // stack: z_im, y_re, x_re, jumpdest + // stack: z_im, y_re, x_re %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) - // stack: x_re, y_re, z_im, jumpdest + // stack: x_re, y_re, z_im %add_fp381 - // stack: z_re, z_im, jumpdest - %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) - JUMP + // stack: z_re, z_im +%endmacro + +%macro sub_fp381_2 + // stack: x_re, x_im, y_re, y_im + %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re) + // stack: x_im, y_im, y_re, x_re + %sub_fp381 + // stack: z_im, y_re, x_re + %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) + // stack: x_re, y_re, z_im + %sub_fp381 + // stack: z_re, z_im +%endmacro + +global test_add_fp381_2: + %add_fp381_2 + %jump(0xdeadbeef) + +global test_sub_fp381_2: + %sub_fp381_2 + %jump(0xdeadbeef) + global mul_fp381_2: // stack: x_re, x_im, y_re, y_im, jumpdest @@ -100,16 +120,4 @@ global mul_fp381_2: // stack: z_re, z_im, jumpdest %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) JUMP - -global sub_fp381_2: - // stack: x_re, x_im, y_re, y_im, jumpdest - %stack (x_re: 2, x_im: 2, y_re: 2, y_im: 2) -> (x_im, y_im, y_re, x_re) - // stack: x_im, y_im, y_re, x_re, jumpdest - %sub_fp381 - // stack: z_im, y_re, x_re, jumpdest - %stack (z_im: 2, y_re: 2, x_re: 2) -> (x_re, y_re, z_im) - // stack: x_re, y_re, z_im, jumpdest - %sub_fp381 - // stack: z_re, z_im, jumpdest - %stack (z_re: 2, z_im: 2, jumpdest) -> (jumpdest, z_re, z_im) - JUMP + \ No newline at end of file diff --git a/evm/src/cpu/kernel/tests/bls381.rs b/evm/src/cpu/kernel/tests/bls381.rs index 1b988065..96ff51ce 100644 --- a/evm/src/cpu/kernel/tests/bls381.rs +++ b/evm/src/cpu/kernel/tests/bls381.rs @@ -29,12 +29,12 @@ fn test_bls_ops() -> Result<()> { let y: BLS381 = rng.gen::(); let output_add = run_bls_ops("test_add_fp381", x, y); - let output_mul = run_bls_ops("test_mul_fp381", x, y); let output_sub = run_bls_ops("test_sub_fp381", x, y); + let output_mul = run_bls_ops("test_mul_fp381", x, y); assert_eq!(output_add, x + y); - assert_eq!(output_mul, x * y); assert_eq!(output_sub, x - y); + assert_eq!(output_mul, x * y); Ok(()) } @@ -60,13 +60,13 @@ fn test_bls_fp2_ops() -> Result<()> { let x: Fp2 = rng.gen::>(); let y: Fp2 = rng.gen::>(); - let output_add = run_bls_fp2_ops("add_fp381_2", x, y); + let output_add = run_bls_fp2_ops("test_add_fp381_2", x, y); + let output_sub = run_bls_fp2_ops("test_sub_fp381_2", x, y); let output_mul = run_bls_fp2_ops("mul_fp381_2", x, y); - let output_sub = run_bls_fp2_ops("sub_fp381_2", x, y); assert_eq!(output_add, x + y); - assert_eq!(output_mul, x * y); assert_eq!(output_sub, x - y); + assert_eq!(output_mul, x * y); Ok(()) }