mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-05 15:23:06 +00:00
carry -> carry_limb
This commit is contained in:
parent
e57358bcbd
commit
0627633439
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user