From a1c6aff56081540895a3b7719de496ff66a375d9 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Wed, 30 Sep 2026 14:20:25 -0700 Subject: [PATCH] Remove dead code and initialize additional scratch vectors. --- scripts/fe.gen.mjs | 18 ++-- scripts/p.gen.mjs | 4 - src/assembly/ed25519/fe.ts | 72 ++++++++++--- src/assembly/ed25519/p.ts | 205 ++++++++++++++++++++++++++----------- 4 files changed, 212 insertions(+), 87 deletions(-) diff --git a/scripts/fe.gen.mjs b/scripts/fe.gen.mjs index 6a36597..77beb53 100644 --- a/scripts/fe.gen.mjs +++ b/scripts/fe.gen.mjs @@ -20,7 +20,10 @@ export function fe_init_v128 (...fe) { let ${fe.map(fe => ` ${fe.replaceAll('.', '_')}_0123: v128, ${fe.replaceAll('.', '_')}_4567: v128, - ${fe.replaceAll('.', '_')}_89xx: v128 + ${fe.replaceAll('.', '_')}_89xx: v128, + ${fe.replaceAll('.', '_')}_0123_19: v128, + ${fe.replaceAll('.', '_')}_4567_19: v128, + ${fe.replaceAll('.', '_')}_89xx_19: v128 `)} ` } @@ -189,9 +192,9 @@ export function fe_mul (h, f, g) { const g_name = g.replaceAll('.', '_') return ` // ${h} = ${f} * ${g} - const ${g_name}_0123_19: v128 = i32x4.mul(${g_name}_0123, v19) - const ${g_name}_4567_19: v128 = i32x4.mul(${g_name}_4567, v19) - const ${g_name}_89xx_19: v128 = i32x4.mul(${g_name}_89xx, v19) + ${g_name}_0123_19 = i32x4.mul(${g_name}_0123, v19) + ${g_name}_4567_19 = i32x4.mul(${g_name}_4567, v19) + ${g_name}_89xx_19 = i32x4.mul(${g_name}_89xx, v19) // f[0] fi = v128.extract_lane(${f_name}_0123, 0) @@ -1130,9 +1133,10 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void // factor of 19 for wrap from h9 to h0 const v19: v128 = i32x4.splat(19) - const g_0123_19: v128 = i32x4.mul(g_0123, v19) - const g_4567_19: v128 = i32x4.mul(g_4567, v19) - const g_89xx_19: v128 = i32x4.mul(g_89xx, v19) + + g_0123_19 = i32x4.mul(g_0123, v19) + g_4567_19 = i32x4.mul(g_4567, v19) + g_89xx_19 = i32x4.mul(g_89xx, v19) // f[0] let fi: i32 = load(f_ptr, 0) diff --git a/scripts/p.gen.mjs b/scripts/p.gen.mjs index a4936e6..339755b 100644 --- a/scripts/p.gen.mjs +++ b/scripts/p.gen.mjs @@ -60,7 +60,6 @@ export function ge_p2_0 (h: ge_p2): void { fe_1(h.Z) } -const ge_p2_dbl_t: FieldElement = fe() //@ts-expect-error @inline export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void { @@ -74,9 +73,6 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void { ${fe_load('r.Z')} ${fe_load('r.T')} - const rY2 = ge_p2_dbl_t - ${fe_load('rY2')} - // could swap below with fe_sq_vec(r.X, r.Z, p.X, p.Y) // rX = pX²; rZ = pY² ${fe_sq('r.X', 'p.X')} ${fe_sq('r.Z', 'p.Y')} diff --git a/src/assembly/ed25519/fe.ts b/src/assembly/ed25519/fe.ts index f4ab1c3..3f50542 100644 --- a/src/assembly/ed25519/fe.ts +++ b/src/assembly/ed25519/fe.ts @@ -69,15 +69,24 @@ export function fe_add (h: FieldElement, f: FieldElement, g: FieldElement): void let h_0123: v128, h_4567: v128, - h_89xx: v128 + h_89xx: v128, + h_0123_19: v128, + h_4567_19: v128, + h_89xx_19: v128 , f_0123: v128, f_4567: v128, - f_89xx: v128 + f_89xx: v128, + f_0123_19: v128, + f_4567_19: v128, + f_89xx_19: v128 , g_0123: v128, g_4567: v128, - g_89xx: v128 + g_89xx: v128, + g_0123_19: v128, + g_4567_19: v128, + g_89xx_19: v128 // [0..3, 4..7, 8..11] = h h_0123 = v128.load(changetype(h), 0) @@ -149,11 +158,17 @@ export function fe_dbl (h: FieldElement, f: FieldElement): void { let h_0123: v128, h_4567: v128, - h_89xx: v128 + h_89xx: v128, + h_0123_19: v128, + h_4567_19: v128, + h_89xx_19: v128 , f_0123: v128, f_4567: v128, - f_89xx: v128 + f_89xx: v128, + f_0123_19: v128, + f_4567_19: v128, + f_89xx_19: v128 // [0..3, 4..7, 8..11] = h h_0123 = v128.load(changetype(h), 0) @@ -346,15 +361,24 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void let h_0123: v128, h_4567: v128, - h_89xx: v128 + h_89xx: v128, + h_0123_19: v128, + h_4567_19: v128, + h_89xx_19: v128 , f_0123: v128, f_4567: v128, - f_89xx: v128 + f_89xx: v128, + f_0123_19: v128, + f_4567_19: v128, + f_89xx_19: v128 , g_0123: v128, g_4567: v128, - g_89xx: v128 + g_89xx: v128, + g_0123_19: v128, + g_4567_19: v128, + g_89xx_19: v128 const f_ptr: usize = changetype(f) @@ -371,9 +395,10 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void // factor of 19 for wrap from h9 to h0 const v19: v128 = i32x4.splat(19) - const g_0123_19: v128 = i32x4.mul(g_0123, v19) - const g_4567_19: v128 = i32x4.mul(g_4567, v19) - const g_89xx_19: v128 = i32x4.mul(g_89xx, v19) + + g_0123_19 = i32x4.mul(g_0123, v19) + g_4567_19 = i32x4.mul(g_4567, v19) + g_89xx_19 = i32x4.mul(g_89xx, v19) // f[0] let fi: i32 = load(f_ptr, 0) @@ -622,11 +647,17 @@ export function fe_neg (h: FieldElement, f: FieldElement): void { let h_0123: v128, h_4567: v128, - h_89xx: v128 + h_89xx: v128, + h_0123_19: v128, + h_4567_19: v128, + h_89xx_19: v128 , f_0123: v128, f_4567: v128, - f_89xx: v128 + f_89xx: v128, + f_0123_19: v128, + f_4567_19: v128, + f_89xx_19: v128 // [0..3, 4..7, 8..11] = h h_0123 = v128.load(changetype(h), 0) @@ -1494,15 +1525,24 @@ export function fe_sub (h: FieldElement, f: FieldElement, g: FieldElement): void let h_0123: v128, h_4567: v128, - h_89xx: v128 + h_89xx: v128, + h_0123_19: v128, + h_4567_19: v128, + h_89xx_19: v128 , f_0123: v128, f_4567: v128, - f_89xx: v128 + f_89xx: v128, + f_0123_19: v128, + f_4567_19: v128, + f_89xx_19: v128 , g_0123: v128, g_4567: v128, - g_89xx: v128 + g_89xx: v128, + g_0123_19: v128, + g_4567_19: v128, + g_89xx_19: v128 // [0..3, 4..7, 8..11] = h h_0123 = v128.load(changetype(h), 0) diff --git a/src/assembly/ed25519/p.ts b/src/assembly/ed25519/p.ts index 9b030f2..e7de970 100644 --- a/src/assembly/ed25519/p.ts +++ b/src/assembly/ed25519/p.ts @@ -47,7 +47,6 @@ export function ge_p2_0 (h: ge_p2): void { fe_1(h.Z) } -const ge_p2_dbl_t: FieldElement = fe() //@ts-expect-error @inline export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void { @@ -55,35 +54,59 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void { let p_X_0123: v128, p_X_4567: v128, - p_X_89xx: v128 + p_X_89xx: v128, + p_X_0123_19: v128, + p_X_4567_19: v128, + p_X_89xx_19: v128 , p_Y_0123: v128, p_Y_4567: v128, - p_Y_89xx: v128 + p_Y_89xx: v128, + p_Y_0123_19: v128, + p_Y_4567_19: v128, + p_Y_89xx_19: v128 , p_Z_0123: v128, p_Z_4567: v128, - p_Z_89xx: v128 + p_Z_89xx: v128, + p_Z_0123_19: v128, + p_Z_4567_19: v128, + p_Z_89xx_19: v128 , r_X_0123: v128, r_X_4567: v128, - r_X_89xx: v128 + r_X_89xx: v128, + r_X_0123_19: v128, + r_X_4567_19: v128, + r_X_89xx_19: v128 , r_Y_0123: v128, r_Y_4567: v128, - r_Y_89xx: v128 + r_Y_89xx: v128, + r_Y_0123_19: v128, + r_Y_4567_19: v128, + r_Y_89xx_19: v128 , r_Z_0123: v128, r_Z_4567: v128, - r_Z_89xx: v128 + r_Z_89xx: v128, + r_Z_0123_19: v128, + r_Z_4567_19: v128, + r_Z_89xx_19: v128 , r_T_0123: v128, r_T_4567: v128, - r_T_89xx: v128 + r_T_89xx: v128, + r_T_0123_19: v128, + r_T_4567_19: v128, + r_T_89xx_19: v128 , rY2_0123: v128, rY2_4567: v128, - rY2_89xx: v128 + rY2_89xx: v128, + rY2_0123_19: v128, + rY2_4567_19: v128, + rY2_89xx_19: v128 // mask to select even lane from first vector and odd lane from second const m: v128 = i32x4(-1, 0, -1, 0) @@ -203,13 +226,6 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void { r_T_4567 = v128.load(changetype(r.T), 16) r_T_89xx = v128.load(changetype(r.T), 32) - const rY2 = ge_p2_dbl_t - - // [0..3, 4..7, 8..11] = rY2 - rY2_0123 = v128.load(changetype(rY2), 0) - rY2_4567 = v128.load(changetype(rY2), 16) - rY2_89xx = v128.load(changetype(rY2), 32) - // could swap below with fe_sq_vec(r.X, r.Z, p.X, p.Y) // rX = pX²; rZ = pY² // r.X = p.X² @@ -952,51 +968,87 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void { let r_X_0123: v128, r_X_4567: v128, - r_X_89xx: v128 + r_X_89xx: v128, + r_X_0123_19: v128, + r_X_4567_19: v128, + r_X_89xx_19: v128 , r_Y_0123: v128, r_Y_4567: v128, - r_Y_89xx: v128 + r_Y_89xx: v128, + r_Y_0123_19: v128, + r_Y_4567_19: v128, + r_Y_89xx_19: v128 , r_Z_0123: v128, r_Z_4567: v128, - r_Z_89xx: v128 + r_Z_89xx: v128, + r_Z_0123_19: v128, + r_Z_4567_19: v128, + r_Z_89xx_19: v128 , r_T_0123: v128, r_T_4567: v128, - r_T_89xx: v128 + r_T_89xx: v128, + r_T_0123_19: v128, + r_T_4567_19: v128, + r_T_89xx_19: v128 , p_X_0123: v128, p_X_4567: v128, - p_X_89xx: v128 + p_X_89xx: v128, + p_X_0123_19: v128, + p_X_4567_19: v128, + p_X_89xx_19: v128 , p_Y_0123: v128, p_Y_4567: v128, - p_Y_89xx: v128 + p_Y_89xx: v128, + p_Y_0123_19: v128, + p_Y_4567_19: v128, + p_Y_89xx_19: v128 , p_Z_0123: v128, p_Z_4567: v128, - p_Z_89xx: v128 + p_Z_89xx: v128, + p_Z_0123_19: v128, + p_Z_4567_19: v128, + p_Z_89xx_19: v128 , p_T_0123: v128, p_T_4567: v128, - p_T_89xx: v128 + p_T_89xx: v128, + p_T_0123_19: v128, + p_T_4567_19: v128, + p_T_89xx_19: v128 , q_YplusX_0123: v128, q_YplusX_4567: v128, - q_YplusX_89xx: v128 + q_YplusX_89xx: v128, + q_YplusX_0123_19: v128, + q_YplusX_4567_19: v128, + q_YplusX_89xx_19: v128 , q_YminusX_0123: v128, q_YminusX_4567: v128, - q_YminusX_89xx: v128 + q_YminusX_89xx: v128, + q_YminusX_0123_19: v128, + q_YminusX_4567_19: v128, + q_YminusX_89xx_19: v128 , q_Z_0123: v128, q_Z_4567: v128, - q_Z_89xx: v128 + q_Z_89xx: v128, + q_Z_0123_19: v128, + q_Z_4567_19: v128, + q_Z_89xx_19: v128 , q_T2d_0123: v128, q_T2d_4567: v128, - q_T2d_89xx: v128 + q_T2d_89xx: v128, + q_T2d_0123_19: v128, + q_T2d_4567_19: v128, + q_T2d_89xx_19: v128 // mask to select even lane from first vector and odd lane from second const m: v128 = i32x4(-1, 0, -1, 0) @@ -1152,9 +1204,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void { r_Y_89xx = v128.sub(p_Y_89xx, p_X_89xx) // r.Z = r.X * q.YplusX - const q_YplusX_0123_19: v128 = i32x4.mul(q_YplusX_0123, v19) - const q_YplusX_4567_19: v128 = i32x4.mul(q_YplusX_4567, v19) - const q_YplusX_89xx_19: v128 = i32x4.mul(q_YplusX_89xx, v19) + q_YplusX_0123_19 = i32x4.mul(q_YplusX_0123, v19) + q_YplusX_4567_19 = i32x4.mul(q_YplusX_4567, v19) + q_YplusX_89xx_19 = i32x4.mul(q_YplusX_89xx, v19) // f[0] fi = v128.extract_lane(r_X_0123, 0) @@ -1371,9 +1423,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void { r_Z_89xx = i32x4(h8, h9, 0, 0) // r.Y = r.Y * q.YminusX - const q_YminusX_0123_19: v128 = i32x4.mul(q_YminusX_0123, v19) - const q_YminusX_4567_19: v128 = i32x4.mul(q_YminusX_4567, v19) - const q_YminusX_89xx_19: v128 = i32x4.mul(q_YminusX_89xx, v19) + q_YminusX_0123_19 = i32x4.mul(q_YminusX_0123, v19) + q_YminusX_4567_19 = i32x4.mul(q_YminusX_4567, v19) + q_YminusX_89xx_19 = i32x4.mul(q_YminusX_89xx, v19) // f[0] fi = v128.extract_lane(r_Y_0123, 0) @@ -1590,9 +1642,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void { r_Y_89xx = i32x4(h8, h9, 0, 0) // r.T = q.T2d * p.T - const p_T_0123_19: v128 = i32x4.mul(p_T_0123, v19) - const p_T_4567_19: v128 = i32x4.mul(p_T_4567, v19) - const p_T_89xx_19: v128 = i32x4.mul(p_T_89xx, v19) + p_T_0123_19 = i32x4.mul(p_T_0123, v19) + p_T_4567_19 = i32x4.mul(p_T_4567, v19) + p_T_89xx_19 = i32x4.mul(p_T_89xx, v19) // f[0] fi = v128.extract_lane(q_T2d_0123, 0) @@ -1809,9 +1861,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void { r_T_89xx = i32x4(h8, h9, 0, 0) // r.X = p.Z * q.Z - const q_Z_0123_19: v128 = i32x4.mul(q_Z_0123, v19) - const q_Z_4567_19: v128 = i32x4.mul(q_Z_4567, v19) - const q_Z_89xx_19: v128 = i32x4.mul(q_Z_89xx, v19) + q_Z_0123_19 = i32x4.mul(q_Z_0123, v19) + q_Z_4567_19 = i32x4.mul(q_Z_4567, v19) + q_Z_89xx_19 = i32x4.mul(q_Z_89xx, v19) // f[0] fi = v128.extract_lane(p_Z_0123, 0) @@ -2086,47 +2138,80 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void { let r_X_0123: v128, r_X_4567: v128, - r_X_89xx: v128 + r_X_89xx: v128, + r_X_0123_19: v128, + r_X_4567_19: v128, + r_X_89xx_19: v128 , r_Y_0123: v128, r_Y_4567: v128, - r_Y_89xx: v128 + r_Y_89xx: v128, + r_Y_0123_19: v128, + r_Y_4567_19: v128, + r_Y_89xx_19: v128 , r_Z_0123: v128, r_Z_4567: v128, - r_Z_89xx: v128 + r_Z_89xx: v128, + r_Z_0123_19: v128, + r_Z_4567_19: v128, + r_Z_89xx_19: v128 , r_T_0123: v128, r_T_4567: v128, - r_T_89xx: v128 + r_T_89xx: v128, + r_T_0123_19: v128, + r_T_4567_19: v128, + r_T_89xx_19: v128 , p_X_0123: v128, p_X_4567: v128, - p_X_89xx: v128 + p_X_89xx: v128, + p_X_0123_19: v128, + p_X_4567_19: v128, + p_X_89xx_19: v128 , p_Y_0123: v128, p_Y_4567: v128, - p_Y_89xx: v128 + p_Y_89xx: v128, + p_Y_0123_19: v128, + p_Y_4567_19: v128, + p_Y_89xx_19: v128 , p_Z_0123: v128, p_Z_4567: v128, - p_Z_89xx: v128 + p_Z_89xx: v128, + p_Z_0123_19: v128, + p_Z_4567_19: v128, + p_Z_89xx_19: v128 , p_T_0123: v128, p_T_4567: v128, - p_T_89xx: v128 + p_T_89xx: v128, + p_T_0123_19: v128, + p_T_4567_19: v128, + p_T_89xx_19: v128 , q_yplusx_0123: v128, q_yplusx_4567: v128, - q_yplusx_89xx: v128 + q_yplusx_89xx: v128, + q_yplusx_0123_19: v128, + q_yplusx_4567_19: v128, + q_yplusx_89xx_19: v128 , q_yminusx_0123: v128, q_yminusx_4567: v128, - q_yminusx_89xx: v128 + q_yminusx_89xx: v128, + q_yminusx_0123_19: v128, + q_yminusx_4567_19: v128, + q_yminusx_89xx_19: v128 , q_xy2d_0123: v128, q_xy2d_4567: v128, - q_xy2d_89xx: v128 + q_xy2d_89xx: v128, + q_xy2d_0123_19: v128, + q_xy2d_4567_19: v128, + q_xy2d_89xx_19: v128 // mask to select even lane from first vector and odd lane from second const m: v128 = i32x4(-1, 0, -1, 0) @@ -2277,9 +2362,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void { r_Y_89xx = v128.sub(p_Y_89xx, p_X_89xx) // r.Z = r.X * q.yplusx - const q_yplusx_0123_19: v128 = i32x4.mul(q_yplusx_0123, v19) - const q_yplusx_4567_19: v128 = i32x4.mul(q_yplusx_4567, v19) - const q_yplusx_89xx_19: v128 = i32x4.mul(q_yplusx_89xx, v19) + q_yplusx_0123_19 = i32x4.mul(q_yplusx_0123, v19) + q_yplusx_4567_19 = i32x4.mul(q_yplusx_4567, v19) + q_yplusx_89xx_19 = i32x4.mul(q_yplusx_89xx, v19) // f[0] fi = v128.extract_lane(r_X_0123, 0) @@ -2496,9 +2581,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void { r_Z_89xx = i32x4(h8, h9, 0, 0) // r.Y = r.Y * q.yminusx - const q_yminusx_0123_19: v128 = i32x4.mul(q_yminusx_0123, v19) - const q_yminusx_4567_19: v128 = i32x4.mul(q_yminusx_4567, v19) - const q_yminusx_89xx_19: v128 = i32x4.mul(q_yminusx_89xx, v19) + q_yminusx_0123_19 = i32x4.mul(q_yminusx_0123, v19) + q_yminusx_4567_19 = i32x4.mul(q_yminusx_4567, v19) + q_yminusx_89xx_19 = i32x4.mul(q_yminusx_89xx, v19) // f[0] fi = v128.extract_lane(r_Y_0123, 0) @@ -2715,9 +2800,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void { r_Y_89xx = i32x4(h8, h9, 0, 0) // r.T = q.xy2d * p.T - const p_T_0123_19: v128 = i32x4.mul(p_T_0123, v19) - const p_T_4567_19: v128 = i32x4.mul(p_T_4567, v19) - const p_T_89xx_19: v128 = i32x4.mul(p_T_89xx, v19) + p_T_0123_19 = i32x4.mul(p_T_0123, v19) + p_T_4567_19 = i32x4.mul(p_T_4567, v19) + p_T_89xx_19 = i32x4.mul(p_T_89xx, v19) // f[0] fi = v128.extract_lane(q_xy2d_0123, 0) -- 2.52.0