(module (import "js" "table" (table 3 anyfunc)) (type $fe_mul (func (param $f_0 i64) (param $f_1 i64) (param $f_2 i64) (param $f_3 i64) (param $f_4 i64) (param $f_5 i64) (param $f_6 i64) (param $f_7 i64) (param $f_8 i64) (param $f_9 i64) (param $g_0 i64) (param $g_1 i64) (param $g_2 i64) (param $g_3 i64) (param $g_4 i64) (param $g_5 i64) (param $g_6 i64) (param $g_7 i64) (param $g_8 i64) (param $g_9 i64) (param $res i32))) (type $fe_sq (func (param $f_0 i64) (param $f_1 i64) (param $f_2 i64) (param $f_3 i64) (param $f_4 i64) (param $f_5 i64) (param $f_6 i64) (param $f_7 i64) (param $f_8 i64) (param $f_9 i64) (param $double i32) (param $repeat i32) (param $res i32))) (func $i32.log (import "debug" "log") (param i32)) (func $i32.log_tee (import "debug" "log_tee") (param i32) (result i32)) ;; No i64 interop with JS yet - but maybe coming with WebAssembly BigInt ;; So we can instead fake this by splitting the i64 into two i32 limbs, ;; however these are WASM functions using i32x2.log: (func $i32x2.log (import "debug" "log") (param i32) (param i32)) (func $f32.log (import "debug" "log") (param f32)) (func $f32.log_tee (import "debug" "log_tee") (param f32) (result f32)) (func $f64.log (import "debug" "log") (param f64)) (func $f64.log_tee (import "debug" "log_tee") (param f64) (result f64)) ;; i64 logging by splitting into two i32 limbs (func $i64.log (param $0 i64) (call $i32x2.log ;; Upper limb (i32.wrap/i64 (i64.shr_s (get_local $0) (i64.const 32))) ;; Lower limb (i32.wrap/i64 (get_local $0)))) (func $i64.log_tee (param $0 i64) (result i64) (call $i64.log (get_local $0)) (return (get_local $0))) (memory $0 1) (export "memory" (memory $0)) (func $scalarmult (export "scalarmult") (param $ptr_x1 i32) (param $ptr_x2 i32) (param $ptr_x3 i32) (param $ptr_z2 i32) (param $ptr_z3 i32) (param $ptr_t i32) (param $res_x2 i32) (param $res_x3 i32) (param $res_z2 i32) (param $res_z3 i32) (result i32) (local $swap i32) (local $b i32) (local $pos i32) (local $ptr0 i32) (local $ptr1 i32) (local $ptr2 i32) (local $ptr3 i32) (local $mask i64) (local $t i64) (local $t_0 i64) (local $t_1 i64) (local $t_2 i64) (local $t_3 i64) (local $x1_0 i64) (local $x1_1 i64) (local $x1_2 i64) (local $x1_3 i64) (local $x1_4 i64) (local $x1_5 i64) (local $x1_6 i64) (local $x1_7 i64) (local $x1_8 i64) (local $x1_9 i64) (local $x2_0 i64) (local $x2_1 i64) (local $x2_2 i64) (local $x2_3 i64) (local $x2_4 i64) (local $x2_5 i64) (local $x2_6 i64) (local $x2_7 i64) (local $x2_8 i64) (local $x2_9 i64) (local $z2_0 i64) (local $z2_1 i64) (local $z2_2 i64) (local $z2_3 i64) (local $z2_4 i64) (local $z2_5 i64) (local $z2_6 i64) (local $z2_7 i64) (local $z2_8 i64) (local $z2_9 i64) (local $x3_0 i64) (local $x3_1 i64) (local $x3_2 i64) (local $x3_3 i64) (local $x3_4 i64) (local $x3_5 i64) (local $x3_6 i64) (local $x3_7 i64) (local $x3_8 i64) (local $x3_9 i64) (local $z3_0 i64) (local $z3_1 i64) (local $z3_2 i64) (local $z3_3 i64) (local $z3_4 i64) (local $z3_5 i64) (local $z3_6 i64) (local $z3_7 i64) (local $z3_8 i64) (local $z3_9 i64) (local $tmp0_0 i64) (local $tmp0_1 i64) (local $tmp0_2 i64) (local $tmp0_3 i64) (local $tmp0_4 i64) (local $tmp0_5 i64) (local $tmp0_6 i64) (local $tmp0_7 i64) (local $tmp0_8 i64) (local $tmp0_9 i64) (local $tmp1_0 i64) (local $tmp1_1 i64) (local $tmp1_2 i64) (local $tmp1_3 i64) (local $tmp1_4 i64) (local $tmp1_5 i64) (local $tmp1_6 i64) (local $tmp1_7 i64) (local $tmp1_8 i64) (local $tmp1_9 i64) (set_local $t_0 (i64.load offset=0 (get_local $ptr_t))) (set_local $t_1 (i64.load offset=8 (get_local $ptr_t))) (set_local $t_2 (i64.load offset=16 (get_local $ptr_t))) (set_local $t_3 (i64.load offset=24 (get_local $ptr_t))) (set_local $x1_0 (i64.load32_u offset=0 (get_local $ptr_x1))) (set_local $x1_1 (i64.load32_u offset=4 (get_local $ptr_x1))) (set_local $x1_2 (i64.load32_u offset=8 (get_local $ptr_x1))) (set_local $x1_3 (i64.load32_u offset=12 (get_local $ptr_x1))) (set_local $x1_4 (i64.load32_u offset=16 (get_local $ptr_x1))) (set_local $x1_5 (i64.load32_u offset=20 (get_local $ptr_x1))) (set_local $x1_6 (i64.load32_u offset=24 (get_local $ptr_x1))) (set_local $x1_7 (i64.load32_u offset=28 (get_local $ptr_x1))) (set_local $x1_8 (i64.load32_u offset=32 (get_local $ptr_x1))) (set_local $x1_9 (i64.load32_u offset=36 (get_local $ptr_x1))) (set_local $x2_0 (i64.load32_u offset=0 (get_local $ptr_x2))) (set_local $x2_1 (i64.load32_u offset=4 (get_local $ptr_x2))) (set_local $x2_2 (i64.load32_u offset=8 (get_local $ptr_x2))) (set_local $x2_3 (i64.load32_u offset=12 (get_local $ptr_x2))) (set_local $x2_4 (i64.load32_u offset=16 (get_local $ptr_x2))) (set_local $x2_5 (i64.load32_u offset=20 (get_local $ptr_x2))) (set_local $x2_6 (i64.load32_u offset=24 (get_local $ptr_x2))) (set_local $x2_7 (i64.load32_u offset=28 (get_local $ptr_x2))) (set_local $x2_8 (i64.load32_u offset=32 (get_local $ptr_x2))) (set_local $x2_9 (i64.load32_u offset=36 (get_local $ptr_x2))) (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr_x3))) (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr_x3))) (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr_x3))) (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr_x3))) (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr_x3))) (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr_x3))) (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr_x3))) (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr_x3))) (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr_x3))) (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr_x3))) (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr_z2))) (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr_z2))) (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr_z2))) (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr_z2))) (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr_z2))) (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr_z2))) (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr_z2))) (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr_z2))) (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr_z2))) (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr_z2))) (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr_z3))) (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr_z3))) (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr_z3))) (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr_z3))) (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr_z3))) (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr_z3))) (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr_z3))) (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr_z3))) (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr_z3))) (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr_z3))) (i32.const 254) (set_local $pos) (block $end (loop $start (get_local $pos) (i32.const 0) (i32.lt_s) (br_if $end) ;; choose which limb of t (block $break (block $0 (block $1 (block $2 (block $3 (block $switch (get_local $pos) (i32.const 64) (i32.div_u) (br_table $3 $2 $1 $0)) (get_local $t_3) (set_local $t) (br $break)) (get_local $t_3) (set_local $t) (br $break)) (get_local $t_3) (set_local $t) (br $break)) (get_local $t_3) (set_local $t) (br $break))) ;; end of switch statement (get_local $t) (get_local $pos) (i32.const 8) (i32.div_u) (i32.const 64) (i32.rem_u) (i64.extend_u/i32) (i64.shr_u) (i64.const 0xff) (i64.and) (get_local $pos) (i32.const 7) (i32.and) (i64.extend_u/i32) (i64.shr_u) (i64.const 1) (i64.and) (i32.wrap/i64) (set_local $b) (get_local $swap) (get_local $b) (i32.xor) (set_local $swap) (i32.const 0) (get_local $swap) (i32.sub) (i64.extend_u/i32) (set_local $mask) (get_local $x2_0) (get_local $x3_0) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_0) (get_local $x2_1) (get_local $x3_1) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_1) (get_local $x2_2) (get_local $x3_2) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_2) (get_local $x2_3) (get_local $x3_3) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_3) (get_local $x2_4) (get_local $x3_4) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_4) (get_local $x2_5) (get_local $x3_5) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_5) (get_local $x2_6) (get_local $x3_6) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_6) (get_local $x2_7) (get_local $x3_7) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_7) (get_local $x2_8) (get_local $x3_8) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_8) (get_local $x2_9) (get_local $x3_9) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_9) (get_local $x2_0) (get_local $tmp0_0) (i64.xor) (set_local $x2_0) (get_local $x2_0) (get_local $tmp0_0) (i64.xor) (set_local $x2_0) (get_local $x2_1) (get_local $tmp0_1) (i64.xor) (set_local $x2_1) (get_local $x2_2) (get_local $tmp0_2) (i64.xor) (set_local $x2_2) (get_local $x2_3) (get_local $tmp0_3) (i64.xor) (set_local $x2_3) (get_local $x2_4) (get_local $tmp0_4) (i64.xor) (set_local $x2_4) (get_local $x2_5) (get_local $tmp0_5) (i64.xor) (set_local $x2_5) (get_local $x2_6) (get_local $tmp0_6) (i64.xor) (set_local $x2_6) (get_local $x2_7) (get_local $tmp0_7) (i64.xor) (set_local $x2_7) (get_local $x2_8) (get_local $tmp0_8) (i64.xor) (set_local $x2_8) (get_local $x2_9) (get_local $tmp0_9) (i64.xor) (set_local $x2_9) (get_local $x3_0) (get_local $tmp0_0) (i64.xor) (set_local $x3_0) (get_local $x3_0) (get_local $tmp0_0) (i64.xor) (set_local $x3_0) (get_local $x3_1) (get_local $tmp0_1) (i64.xor) (set_local $x3_1) (get_local $x3_2) (get_local $tmp0_2) (i64.xor) (set_local $x3_2) (get_local $x3_3) (get_local $tmp0_3) (i64.xor) (set_local $x3_3) (get_local $x3_4) (get_local $tmp0_4) (i64.xor) (set_local $x3_4) (get_local $x3_5) (get_local $tmp0_5) (i64.xor) (set_local $x3_5) (get_local $x3_6) (get_local $tmp0_6) (i64.xor) (set_local $x3_6) (get_local $x3_7) (get_local $tmp0_7) (i64.xor) (set_local $x3_7) (get_local $x3_8) (get_local $tmp0_8) (i64.xor) (set_local $x3_8) (get_local $x3_9) (get_local $tmp0_9) (i64.xor) (set_local $x3_9) (get_local $z3_0) (get_local $z2_0) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_0) (get_local $z3_1) (get_local $z2_1) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_1) (get_local $z3_2) (get_local $z2_2) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_2) (get_local $z3_3) (get_local $z2_3) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_3) (get_local $z3_4) (get_local $z2_4) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_4) (get_local $z3_5) (get_local $z2_5) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_5) (get_local $z3_6) (get_local $z2_6) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_6) (get_local $z3_7) (get_local $z2_7) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_7) (get_local $z3_8) (get_local $z2_8) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_8) (get_local $z3_9) (get_local $z2_9) (i64.xor) (get_local $mask) (i64.and) (set_local $tmp0_9) (get_local $z2_0) (get_local $tmp0_0) (i64.xor) (set_local $z2_0) (get_local $z2_0) (get_local $tmp0_0) (i64.xor) (set_local $z2_0) (get_local $z2_1) (get_local $tmp0_1) (i64.xor) (set_local $z2_1) (get_local $z2_2) (get_local $tmp0_2) (i64.xor) (set_local $z2_2) (get_local $z2_3) (get_local $tmp0_3) (i64.xor) (set_local $z2_3) (get_local $z2_4) (get_local $tmp0_4) (i64.xor) (set_local $z2_4) (get_local $z2_5) (get_local $tmp0_5) (i64.xor) (set_local $z2_5) (get_local $z2_6) (get_local $tmp0_6) (i64.xor) (set_local $z2_6) (get_local $z2_7) (get_local $tmp0_7) (i64.xor) (set_local $z2_7) (get_local $z2_8) (get_local $tmp0_8) (i64.xor) (set_local $z2_8) (get_local $z2_9) (get_local $tmp0_9) (i64.xor) (set_local $z2_9) (get_local $z3_0) (get_local $tmp0_0) (i64.xor) (set_local $z3_0) (get_local $z3_0) (get_local $tmp0_0) (i64.xor) (set_local $z3_0) (get_local $z3_1) (get_local $tmp0_1) (i64.xor) (set_local $z3_1) (get_local $z3_2) (get_local $tmp0_2) (i64.xor) (set_local $z3_2) (get_local $z3_3) (get_local $tmp0_3) (i64.xor) (set_local $z3_3) (get_local $z3_4) (get_local $tmp0_4) (i64.xor) (set_local $z3_4) (get_local $z3_5) (get_local $tmp0_5) (i64.xor) (set_local $z3_5) (get_local $z3_6) (get_local $tmp0_6) (i64.xor) (set_local $z3_6) (get_local $z3_7) (get_local $tmp0_7) (i64.xor) (set_local $z3_7) (get_local $z3_8) (get_local $tmp0_8) (i64.xor) (set_local $z3_8) (get_local $z3_9) (get_local $tmp0_9) (i64.xor) (set_local $z3_9) (get_local $b) (set_local $swap) ;; fe25519_sub(tmp0, x3, z3) (get_local $x3_0) (get_local $z3_0) (i64.sub) (set_local $tmp0_0) (get_local $x3_1) (get_local $z3_1) (i64.sub) (set_local $tmp0_1) (get_local $x3_2) (get_local $z3_2) (i64.sub) (set_local $tmp0_2) (get_local $x3_3) (get_local $z3_3) (i64.sub) (set_local $tmp0_3) (get_local $x3_4) (get_local $z3_4) (i64.sub) (set_local $tmp0_4) (get_local $x3_5) (get_local $z3_5) (i64.sub) (set_local $tmp0_5) (get_local $x3_6) (get_local $z3_6) (i64.sub) (set_local $tmp0_6) (get_local $x3_7) (get_local $z3_7) (i64.sub) (set_local $tmp0_7) (get_local $x3_8) (get_local $z3_8) (i64.sub) (set_local $tmp0_8) (get_local $x3_9) (get_local $z3_9) (i64.sub) (set_local $tmp0_9) ;; fe25519_sub(tmp0, x3, z3) (get_local $x2_0) (get_local $z2_0) (i64.sub) (set_local $tmp1_0) (get_local $x2_1) (get_local $z2_1) (i64.sub) (set_local $tmp1_1) (get_local $x2_2) (get_local $z2_2) (i64.sub) (set_local $tmp1_2) (get_local $x2_3) (get_local $z2_3) (i64.sub) (set_local $tmp1_3) (get_local $x2_4) (get_local $z2_4) (i64.sub) (set_local $tmp1_4) (get_local $x2_5) (get_local $z2_5) (i64.sub) (set_local $tmp1_5) (get_local $x2_6) (get_local $z2_6) (i64.sub) (set_local $tmp1_6) (get_local $x2_7) (get_local $z2_7) (i64.sub) (set_local $tmp1_7) (get_local $x2_8) (get_local $z2_8) (i64.sub) (set_local $tmp1_8) (get_local $x2_9) (get_local $z2_9) (i64.sub) (set_local $tmp1_9) ;; fe25519_add(x2, x2, z2) (get_local $x2_0) (get_local $z2_0) (i64.add) (set_local $x2_0) (get_local $x2_1) (get_local $z2_1) (i64.add) (set_local $x2_1) (get_local $x2_2) (get_local $z2_2) (i64.add) (set_local $x2_2) (get_local $x2_3) (get_local $z2_3) (i64.add) (set_local $x2_3) (get_local $x2_4) (get_local $z2_4) (i64.add) (set_local $x2_4) (get_local $x2_5) (get_local $z2_5) (i64.add) (set_local $x2_5) (get_local $x2_6) (get_local $z2_6) (i64.add) (set_local $x2_6) (get_local $x2_7) (get_local $z2_7) (i64.add) (set_local $x2_7) (get_local $x2_8) (get_local $z2_8) (i64.add) (set_local $x2_8) (get_local $x2_9) (get_local $z2_9) (i64.add) (set_local $x2_9) ;; fe25519_add(z2, x3, z3) (get_local $x3_0) (get_local $z3_0) (i64.add) (set_local $z2_0) (get_local $x3_1) (get_local $z3_1) (i64.add) (set_local $z2_1) (get_local $x3_2) (get_local $z3_2) (i64.add) (set_local $z2_2) (get_local $x3_3) (get_local $z3_3) (i64.add) (set_local $z2_3) (get_local $x3_4) (get_local $z3_4) (i64.add) (set_local $z2_4) (get_local $x3_5) (get_local $z3_5) (i64.add) (set_local $z2_5) (get_local $x3_6) (get_local $z3_6) (i64.add) (set_local $z2_6) (get_local $x3_7) (get_local $z3_7) (i64.add) (set_local $z2_7) (get_local $x3_8) (get_local $z3_8) (i64.add) (set_local $z2_8) (get_local $x3_9) (get_local $z3_9) (i64.add) (set_local $z2_9) ;; ptr0 <- z3 = x2 * tmp0 (get_local $x2_0) (get_local $x2_1) (get_local $x2_2) (get_local $x2_3) (get_local $x2_4) (get_local $x2_5) (get_local $x2_6) (get_local $x2_7) (get_local $x2_8) (get_local $x2_9) (get_local $tmp0_0) (get_local $tmp0_1) (get_local $tmp0_2) (get_local $tmp0_3) (get_local $tmp0_4) (get_local $tmp0_5) (get_local $tmp0_6) (get_local $tmp0_7) (get_local $tmp0_8) (get_local $tmp0_9) (get_local $ptr0) (i32.const 1) (call_indirect (type $fe_mul)) ;; ptr1 <- z2 = z2 * tmp1 (get_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) (get_local $z2_0) (get_local $z2_1) (get_local $z2_2) (get_local $z2_3) (get_local $z2_4) (get_local $z2_5) (get_local $z2_6) (get_local $z2_7) (get_local $z2_8) (get_local $z2_9) (get_local $ptr1) (i32.const 1) (call_indirect (type $fe_mul)) ;; ptr2 <- tmp0 = tmp1 ^ 2 (get_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) (get_local $ptr2) (i32.const 0) (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) ;; ptr3 <- tmp1 = x2 ^ 2 (get_local $x2_0) (get_local $x2_1) (get_local $x2_2) (get_local $x2_3) (get_local $x2_4) (get_local $x2_5) (get_local $x2_6) (get_local $x2_7) (get_local $x2_8) (get_local $x2_9) (get_local $ptr3) (i32.const 0) (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) ;; z3 <- load(ptr0) (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr0))) (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr0))) (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr0))) (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr0))) (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr0))) (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr0))) (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr0))) (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr0))) (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr0))) (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr0))) ;; z2 <- load(ptr1) (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr1))) (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr1))) (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr1))) (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr1))) (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr1))) (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr1))) (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr1))) (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr1))) (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr1))) (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr1))) ;; tmp0 <- load(ptr2) (set_local $tmp0_0 (i64.load32_u offset=0 (get_local $ptr2))) (set_local $tmp0_1 (i64.load32_u offset=4 (get_local $ptr2))) (set_local $tmp0_2 (i64.load32_u offset=8 (get_local $ptr2))) (set_local $tmp0_3 (i64.load32_u offset=12 (get_local $ptr2))) (set_local $tmp0_4 (i64.load32_u offset=16 (get_local $ptr2))) (set_local $tmp0_5 (i64.load32_u offset=20 (get_local $ptr2))) (set_local $tmp0_6 (i64.load32_u offset=24 (get_local $ptr2))) (set_local $tmp0_7 (i64.load32_u offset=28 (get_local $ptr2))) (set_local $tmp0_8 (i64.load32_u offset=32 (get_local $ptr2))) (set_local $tmp0_9 (i64.load32_u offset=36 (get_local $ptr2))) ;; tmp1 <- load(ptr3) (set_local $tmp1_0 (i64.load32_u offset=0 (get_local $ptr3))) (set_local $tmp1_1 (i64.load32_u offset=4 (get_local $ptr3))) (set_local $tmp1_2 (i64.load32_u offset=8 (get_local $ptr3))) (set_local $tmp1_3 (i64.load32_u offset=12 (get_local $ptr3))) (set_local $tmp1_4 (i64.load32_u offset=16 (get_local $ptr3))) (set_local $tmp1_5 (i64.load32_u offset=20 (get_local $ptr3))) (set_local $tmp1_6 (i64.load32_u offset=24 (get_local $ptr3))) (set_local $tmp1_7 (i64.load32_u offset=28 (get_local $ptr3))) (set_local $tmp1_8 (i64.load32_u offset=32 (get_local $ptr3))) (set_local $tmp1_9 (i64.load32_u offset=36 (get_local $ptr3))) ;; fe25519_add(x3, z3, z2) (get_local $z3_0) (get_local $z2_0) (i64.add) (set_local $x3_0) (get_local $z3_1) (get_local $z2_1) (i64.add) (set_local $x3_1) (get_local $z3_2) (get_local $z2_2) (i64.add) (set_local $x3_2) (get_local $z3_3) (get_local $z2_3) (i64.add) (set_local $x3_3) (get_local $z3_4) (get_local $z2_4) (i64.add) (set_local $x3_4) (get_local $z3_5) (get_local $z2_5) (i64.add) (set_local $x3_5) (get_local $z3_6) (get_local $z2_6) (i64.add) (set_local $x3_6) (get_local $z3_7) (get_local $z2_7) (i64.add) (set_local $x3_7) (get_local $z3_8) (get_local $z2_8) (i64.add) (set_local $x3_8) (get_local $z3_9) (get_local $z2_9) (i64.add) (set_local $x3_9) ;; fe25519_sub(z2, z3, z2) (get_local $z3_0) (get_local $z2_0) (i64.sub) (set_local $z2_0) (get_local $z3_1) (get_local $z2_1) (i64.sub) (set_local $z2_1) (get_local $z3_2) (get_local $z2_2) (i64.sub) (set_local $z2_2) (get_local $z3_3) (get_local $z2_3) (i64.sub) (set_local $z2_3) (get_local $z3_4) (get_local $z2_4) (i64.sub) (set_local $z2_4) (get_local $z3_5) (get_local $z2_5) (i64.sub) (set_local $z2_5) (get_local $z3_6) (get_local $z2_6) (i64.sub) (set_local $z2_6) (get_local $z3_7) (get_local $z2_7) (i64.sub) (set_local $z2_7) (get_local $z3_8) (get_local $z2_8) (i64.sub) (set_local $z2_8) (get_local $z3_9) (get_local $z2_9) (i64.sub) (set_local $z2_9) ;; ptr1 <- x2 = tmp0 * tmp1 (get_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) (get_local $tmp0_0) (get_local $tmp0_1) (get_local $tmp0_2) (get_local $tmp0_3) (get_local $tmp0_4) (get_local $tmp0_5) (get_local $tmp0_6) (get_local $tmp0_7) (get_local $tmp0_8) (get_local $tmp0_9) (get_local $ptr1) (i32.const 1) (call_indirect (type $fe_mul)) ;; tmp1 = tmp1 - tmp0 (get_local $tmp1_0) (get_local $tmp0_0) (i64.sub) (set_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp0_1) (i64.sub) (set_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp0_2) (i64.sub) (set_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp0_3) (i64.sub) (set_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp0_4) (i64.sub) (set_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp0_5) (i64.sub) (set_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp0_6) (i64.sub) (set_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp0_7) (i64.sub) (set_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp0_8) (i64.sub) (set_local $tmp1_8) (get_local $tmp1_9) (get_local $tmp0_9) (i64.sub) (set_local $tmp1_9) ;; ptr0 <- z2 = z2 ^ 2 (get_local $z2_0) (get_local $z2_1) (get_local $z2_2) (get_local $z2_3) (get_local $z2_4) (get_local $z2_5) (get_local $z2_6) (get_local $z2_7) (get_local $z2_8) (get_local $z2_9) (get_local $ptr0) (i32.const 0) (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) ;; ptr1 <- z3 = tmp1 * _121666 (i64.const 121666) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (get_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) (get_local $ptr1) (i32.const 1) (call_indirect (type $fe_mul)) ;; ptr2 <- x3 = x3 ^ 2 (get_local $x3_0) (get_local $x3_1) (get_local $x3_2) (get_local $x3_3) (get_local $x3_4) (get_local $x3_5) (get_local $x3_6) (get_local $x3_7) (get_local $x3_8) (get_local $x3_9) (get_local $ptr2) (i32.const 0) (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) ;; tmp0 <- load(ptr2) (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr0))) (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr0))) (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr0))) (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr0))) (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr0))) (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr0))) (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr0))) (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr0))) (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr0))) (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr0))) ;; tmp0 <- load(ptr2) (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr1))) (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr1))) (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr1))) (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr1))) (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr1))) (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr1))) (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr1))) (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr1))) (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr1))) (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr1))) ;; tmp0 <- load(ptr2) (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr2))) (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr2))) (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr2))) (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr2))) (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr2))) (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr2))) (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr2))) (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr2))) (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr2))) (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr2))) (get_local $tmp0_0) (get_local $z3_0) (i64.add) (set_local $tmp0_0) (get_local $tmp0_1) (get_local $z3_1) (i64.add) (set_local $tmp0_1) (get_local $tmp0_2) (get_local $z3_2) (i64.add) (set_local $tmp0_2) (get_local $tmp0_3) (get_local $z3_3) (i64.add) (set_local $tmp0_3) (get_local $tmp0_4) (get_local $z3_4) (i64.add) (set_local $tmp0_4) (get_local $tmp0_5) (get_local $z3_5) (i64.add) (set_local $tmp0_5) (get_local $tmp0_6) (get_local $z3_6) (i64.add) (set_local $tmp0_6) (get_local $tmp0_7) (get_local $z3_7) (i64.add) (set_local $tmp0_7) (get_local $tmp0_8) (get_local $z3_8) (i64.add) (set_local $tmp0_8) (get_local $tmp0_9) (get_local $z3_9) (i64.add) (set_local $tmp0_9) ;; ptr1 <- z3 = x1 * z2 (get_local $x1_0) (get_local $x1_1) (get_local $x1_2) (get_local $x1_3) (get_local $x1_4) (get_local $x1_5) (get_local $x1_6) (get_local $x1_7) (get_local $x1_8) (get_local $x1_9) (get_local $z2_0) (get_local $z2_1) (get_local $z2_2) (get_local $z2_3) (get_local $z2_4) (get_local $z2_5) (get_local $z2_6) (get_local $z2_7) (get_local $z2_8) (get_local $z2_9) (get_local $ptr1) (i32.const 1) (call_indirect (type $fe_mul)) ;; ptr0 <- z2 = tmp1 * tmp0 (get_local $tmp0_0) (get_local $tmp0_1) (get_local $tmp0_2) (get_local $tmp0_3) (get_local $tmp0_4) (get_local $tmp0_5) (get_local $tmp0_6) (get_local $tmp0_7) (get_local $tmp0_8) (get_local $tmp0_9) (get_local $tmp1_0) (get_local $tmp1_1) (get_local $tmp1_2) (get_local $tmp1_3) (get_local $tmp1_4) (get_local $tmp1_5) (get_local $tmp1_6) (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) (get_local $ptr0) (i32.const 1) (call_indirect (type $fe_mul)) ;; tmp0 <- load(ptr2) (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr0))) (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr0))) (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr0))) (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr0))) (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr0))) (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr0))) (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr0))) (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr0))) (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr0))) (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr0))) ;; tmp0 <- load(ptr2) (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr1))) (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr1))) (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr1))) (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr1))) (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr1))) (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr1))) (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr1))) (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr1))) (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr1))) (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr1))) (get_local $pos) (i32.const 1) (i32.sub) (set_local $pos) (br $start))) ;; (call $i32.log (get_local $res_x2)) (i64.store32 offset=0 (get_local $res_x2) (get_local $x2_0)) (i64.store32 offset=4 (get_local $res_x2) (get_local $x2_1)) (i64.store32 offset=8 (get_local $res_x2) (get_local $x2_2)) (i64.store32 offset=12 (get_local $res_x2) (get_local $x2_3)) (i64.store32 offset=16 (get_local $res_x2) (get_local $x2_4)) (i64.store32 offset=20 (get_local $res_x2) (get_local $x2_5)) (i64.store32 offset=24 (get_local $res_x2) (get_local $x2_6)) (i64.store32 offset=28 (get_local $res_x2) (get_local $x2_7)) (i64.store32 offset=32 (get_local $res_x2) (get_local $x2_8)) (i64.store32 offset=36 (get_local $res_x2) (get_local $x2_9)) (i64.store32 offset=0 (get_local $res_x3) (get_local $x3_0)) (i64.store32 offset=4 (get_local $res_x3) (get_local $x3_1)) (i64.store32 offset=8 (get_local $res_x3) (get_local $x3_2)) (i64.store32 offset=12 (get_local $res_x3) (get_local $x3_3)) (i64.store32 offset=16 (get_local $res_x3) (get_local $x3_4)) (i64.store32 offset=20 (get_local $res_x3) (get_local $x3_5)) (i64.store32 offset=24 (get_local $res_x3) (get_local $x3_6)) (i64.store32 offset=28 (get_local $res_x3) (get_local $x3_7)) (i64.store32 offset=32 (get_local $res_x3) (get_local $x3_8)) (i64.store32 offset=36 (get_local $res_x3) (get_local $x3_9)) (i64.store32 offset=0 (get_local $res_z2) (get_local $z2_0)) (i64.store32 offset=4 (get_local $res_z2) (get_local $z2_1)) (i64.store32 offset=8 (get_local $res_z2) (get_local $z2_2)) (i64.store32 offset=12 (get_local $res_z2) (get_local $z2_3)) (i64.store32 offset=16 (get_local $res_z2) (get_local $z2_4)) (i64.store32 offset=20 (get_local $res_z2) (get_local $z2_5)) (i64.store32 offset=24 (get_local $res_z2) (get_local $z2_6)) (i64.store32 offset=28 (get_local $res_z2) (get_local $z2_7)) (i64.store32 offset=32 (get_local $res_z2) (get_local $z2_8)) (i64.store32 offset=36 (get_local $res_z2) (get_local $z2_9)) (i64.store32 offset=0 (get_local $res_z3) (get_local $z3_0)) (i64.store32 offset=4 (get_local $res_z3) (get_local $z3_1)) (i64.store32 offset=8 (get_local $res_z3) (get_local $z3_2)) (i64.store32 offset=12 (get_local $res_z3) (get_local $z3_3)) (i64.store32 offset=16 (get_local $res_z3) (get_local $z3_4)) (i64.store32 offset=20 (get_local $res_z3) (get_local $z3_5)) (i64.store32 offset=24 (get_local $res_z3) (get_local $z3_6)) (i64.store32 offset=28 (get_local $res_z3) (get_local $z3_7)) (i64.store32 offset=32 (get_local $res_z3) (get_local $z3_8)) (i64.store32 offset=36 (get_local $res_z3) (get_local $z3_9)) (get_local $swap)))