diff --git a/evm/src/cpu/kernel/asm/bignum/addmul.asm b/evm/src/cpu/kernel/asm/bignum/addmul.asm index 9e4ce2ba..3dbb1cd3 100644 --- a/evm/src/cpu/kernel/asm/bignum/addmul.asm +++ b/evm/src/cpu/kernel/asm/bignum/addmul.asm @@ -1,7 +1,7 @@ // Arithmetic on little-endian integers represented with 128-bit limbs. // All integers must be under a given length bound, and are padded with leading zeroes. -// Sets a[0:len] += b[0:len] * val, and returns the carry. +// Sets a[0:len] += b[0:len] * val, and returns the carry (a limb of up to 128 bits). global addmul_bignum: // stack: len, a_start_loc, b_start_loc, val, retdest DUP1 @@ -9,103 +9,103 @@ global addmul_bignum: ISZERO %jumpi(len_zero) PUSH 0 - // stack: carry=0, i=len, a_cur_loc=a_start_loc, b_cur_loc=b_start_loc, val, retdest + // stack: carry_limb=0, i=len, a_cur_loc=a_start_loc, b_cur_loc=b_start_loc, val, retdest addmul_loop: - // stack: carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP4 - // stack: b_cur_loc, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: b_cur_loc, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %mload_kernel_general - // stack: b[cur], carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: b[cur], carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP6 - // stack: val, b[cur], carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: val, b[cur], carry_limb, i, a_cur_loc, b_cur_loc, val, retdest MUL - // stack: val * b[cur], carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: val * b[cur], carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP1 - // stack: val * b[cur], val * b[cur], carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: val * b[cur], val * b[cur], carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %shr_const(128) - // stack: (val * b[cur]) // 2^128, val * b[cur], carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: (val * b[cur]) // 2^128, val * b[cur], carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP1 - // stack: val * b[cur], (val * b[cur]) // 2^128, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: val * b[cur], (val * b[cur]) // 2^128, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %shl_const(128) %shr_const(128) - // stack: prod_lo = val * b[cur] % 2^128, prod_hi = (val * b[cur]) // 2^128, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo = val * b[cur] % 2^128, prod_hi = (val * b[cur]) // 2^128, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP5 - // stack: a_cur_loc, prod_lo, prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: a_cur_loc, prod_lo, prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %mload_kernel_general - // stack: a[cur], prod_lo, prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: a[cur], prod_lo, prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP1 - // stack: a[cur], a[cur], prod_lo, prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: a[cur], a[cur], prod_lo, prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP2 - // stack: prod_lo, a[cur], a[cur], prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo, a[cur], a[cur], prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest ADD %shl_const(128) %shr_const(128) - // stack: prod_lo' = (prod_lo + a[cur]) % 2^128, a[cur], prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo' = (prod_lo + a[cur]) % 2^128, a[cur], prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP1 - // stack: prod_lo', prod_lo', a[cur], prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo', prod_lo', a[cur], prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP2 - // stack: a[cur], prod_lo', prod_lo', prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: a[cur], prod_lo', prod_lo', prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest GT - // stack: prod_lo_carry = a[cur] > prod_lo', prod_lo', prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo_carry_limb = a[cur] > prod_lo', prod_lo', prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP1 - // stack: prod_lo', prod_lo_carry, prod_hi, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo', prod_lo_carry_limb, prod_hi, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP2 - // stack: prod_hi, prod_lo_carry, prod_lo', carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_hi, prod_lo_carry_limb, prod_lo', carry_limb, i, a_cur_loc, b_cur_loc, val, retdest ADD - // stack: prod_hi' = prod_hi + prod_lo_carry, prod_lo', carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_hi' = prod_hi + prod_lo_carry_limb, prod_lo', carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP3 - // stack: carry, prod_hi', prod_lo', carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb, prod_hi', prod_lo', carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP3 - // stack: prod_lo', carry, prod_hi', prod_lo', carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo', carry_limb, prod_hi', prod_lo', carry_limb, i, a_cur_loc, b_cur_loc, val, retdest ADD %shl_const(128) %shr_const(128) - // stack: to_write = (prod_lo' + carry) % 2^128, prod_hi', prod_lo', carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: to_write = (prod_lo' + carry_limb) % 2^128, prod_hi', prod_lo', carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP2 - // stack: prod_lo', prod_hi', to_write, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: prod_lo', prod_hi', to_write, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP3 - // stack: to_write, prod_lo', prod_hi', to_write, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: to_write, prod_lo', prod_hi', to_write, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest LT - // stack: carry_new = to_write < prod_lo', prod_hi', to_write, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb_new = to_write < prod_lo', prod_hi', to_write, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %stack (vals: 3, c) -> (vals) - // stack: carry_new, prod_hi', to_write, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb_new, prod_hi', to_write, i, a_cur_loc, b_cur_loc, val, retdest ADD - // stack: carry = carry_new' + prod_hi', to_write, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb = carry_limb_new' + prod_hi', to_write, i, a_cur_loc, b_cur_loc, val, retdest SWAP1 - // stack: to_write, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: to_write, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest DUP4 - // stack: a_cur_loc, to_write, carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: a_cur_loc, to_write, carry_limb, i, a_cur_loc, b_cur_loc, val, retdest %mstore_kernel_general - // stack: carry, i, a_cur_loc, b_cur_loc, val, retdest + // stack: carry_limb, i, a_cur_loc, b_cur_loc, val, retdest SWAP1 - // stack: i, carry, a_cur_loc, b_cur_loc, val, retdest + // stack: i, carry_limb, a_cur_loc, b_cur_loc, val, retdest %decrement - // stack: i-1, carry, a_cur_loc, b_cur_loc, val, retdest + // stack: i-1, carry_limb, a_cur_loc, b_cur_loc, val, retdest SWAP2 - // stack: a_cur_loc, carry, i-1, b_cur_loc, val, retdest + // stack: a_cur_loc, carry_limb, i-1, b_cur_loc, val, retdest %increment - // stack: a_cur_loc+1, carry, i-1, b_cur_loc, val, retdest + // stack: a_cur_loc+1, carry_limb, i-1, b_cur_loc, val, retdest SWAP3 - // stack: b_cur_loc, carry, i-1, a_cur_loc+1, val, retdest + // stack: b_cur_loc, carry_limb, i-1, a_cur_loc+1, val, retdest %increment - // stack: b_cur_loc+1, carry, i-1, a_cur_loc+1, val, retdest + // stack: b_cur_loc+1, carry_limb, i-1, a_cur_loc+1, val, retdest %stack (b, c, i, a) -> (c, i, a, b) - // stack: carry, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest + // stack: carry_limb, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest DUP2 - // stack: i-1, carry, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest + // stack: i-1, carry_limb, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest %jumpi(addmul_loop) addmul_end: - // stack: carry_new, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest + // stack: carry_limb_new, i-1, a_cur_loc+1, b_cur_loc+1, val, retdest %stack (c, i, a, b, v) -> (c) - // stack: carry_new, retdest + // stack: carry_limb_new, retdest SWAP1 - // stack: retdest, carry_new + // stack: retdest, carry_limb_new JUMP len_zero: // stack: len, a_start_loc, b_start_loc, val, retdest %pop4 // stack: retdest PUSH 0 - // stack: carry=0, retdest + // stack: carry_limb=0, retdest SWAP1 JUMP diff --git a/evm/src/cpu/kernel/asm/bignum/mul.asm b/evm/src/cpu/kernel/asm/bignum/mul.asm index cbf6a645..a7d19fb5 100644 --- a/evm/src/cpu/kernel/asm/bignum/mul.asm +++ b/evm/src/cpu/kernel/asm/bignum/mul.asm @@ -14,27 +14,27 @@ global mul_bignum: // stack: n=len, len, a_start_loc, bi=b_start_loc, output_cur=output_loc, retdest mul_loop: // stack: n, len, a_start_loc, bi, output_cur, retdest - PUSH mul_return - // stack: mul_return, n, len, a_start_loc, bi, output_cur, retdest + PUSH mul_addmul_return + // stack: mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest DUP5 - // stack: bi, mul_return, n, len, a_start_loc, bi, output_cur, retdest + // stack: bi, mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest %mload_kernel_general - // stack: b[i], mul_return, n, len, a_start_loc, bi, output_cur, retdest, b + // stack: b[i], mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest, b DUP5 - // stack: a_start_loc, b[i], mul_return, n, len, a_start_loc, bi, output_cur, retdest, b + // stack: a_start_loc, b[i], mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest, b DUP8 - // stack: output_loc, a_start_loc, b[i], mul_return, n, len, a_start_loc, bi, output_cur, retdest, b + // stack: output_loc, a_start_loc, b[i], mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest, b DUP6 - // stack: len, output_loc, a_start_loc, b[i], mul_return, n, len, a_start_loc, bi, output_cur, retdest, b + // stack: len, output_loc, a_start_loc, b[i], mul_addmul_return, n, len, a_start_loc, bi, output_cur, retdest, b %jump(addmul_bignum) -mul_return: - // stack: carry, n, len, a_start_loc, bi, output_cur, retdest +mul_addmul_return: + // stack: carry_limb, n, len, a_start_loc, bi, output_cur, retdest DUP6 - // stack: output_cur, carry, n, len, a_start_loc, bi, output_cur, retdest + // stack: output_cur, carry_limb, n, len, a_start_loc, bi, output_cur, retdest DUP4 - // stack: len, output_cur, carry, n, len, a_start_loc, bi, output_cur, retdest + // stack: len, output_cur, carry_limb, n, len, a_start_loc, bi, output_cur, retdest ADD - // stack: output_cur + len, carry, n, len, a_start_loc, bi, output_cur, retdest + // stack: output_cur + len, carry_limb, n, len, a_start_loc, bi, output_cur, retdest %mstore_kernel_general // stack: n, len, a_start_loc, bi, output_cur, retdest %decrement diff --git a/evm/src/cpu/kernel/tests/bignum.rs b/evm/src/cpu/kernel/tests/bignum.rs index 9dbcf6b7..0dd02bfa 100644 --- a/evm/src/cpu/kernel/tests/bignum.rs +++ b/evm/src/cpu/kernel/tests/bignum.rs @@ -291,9 +291,9 @@ where interpreter.run()?; // Determine actual result. - let carry = interpreter.stack()[0]; + let carry_limb = interpreter.stack()[0]; let mut new_memory = interpreter.get_kernel_general_memory(); - new_memory[len] = carry; + new_memory[len] = carry_limb; let actual_result: Vec<_> = new_memory[..expected_result.len()].into(); // Compare.