From 13fd88322f7a9debc32bdcdb86de7a0d11062feb Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Thu, 1 Oct 2026 13:51:02 -0700 Subject: [PATCH] Interleave carry assignments to improve cpu scheduling. --- src/assembly/ed25519/fe.ts | 45 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/assembly/ed25519/fe.ts b/src/assembly/ed25519/fe.ts index fba24bd..e157b1d 100644 --- a/src/assembly/ed25519/fe.ts +++ b/src/assembly/ed25519/fe.ts @@ -461,36 +461,37 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void const bias25 = v128.splat((1 << 25) + (1 << 62)) const unbias25 = v128.splat(1 << 37) const unbias26 = v128.splat(1 << 36) - let carry: v128 + let carryA: v128 + let carryB: v128 - carry = v128.sub(v128.shr(v128.add(h04_sum, bias25), 26), unbias26) - h04_sum = v128.sub(h04_sum, v128.shl(carry, 26)) - h15_sum = v128.add(h15_sum, carry) + carryA = v128.sub(v128.shr(v128.add(h04_sum, bias25), 26), unbias26) + h04_sum = v128.sub(h04_sum, v128.shl(carryA, 26)) + h15_sum = v128.add(h15_sum, carryA) - carry = v128.sub(v128.shr(v128.add(h15_sum, bias24), 25), unbias25) - h15_sum = v128.sub(h15_sum, v128.shl(carry, 25)) - h26_sum = v128.add(h26_sum, carry) + carryB = v128.sub(v128.shr(v128.add(h15_sum, bias24), 25), unbias25) + h15_sum = v128.sub(h15_sum, v128.shl(carryB, 25)) + h26_sum = v128.add(h26_sum, carryB) - carry = v128.sub(v128.shr(v128.add(h26_sum, bias25), 26), unbias26) - h26_sum = v128.sub(h26_sum, v128.shl(carry, 26)) - h37_sum = v128.add(h37_sum, carry) + carryA = v128.sub(v128.shr(v128.add(h26_sum, bias25), 26), unbias26) + h26_sum = v128.sub(h26_sum, v128.shl(carryA, 26)) + h37_sum = v128.add(h37_sum, carryA) - carry = v128.sub(v128.shr(v128.add(h37_sum, bias24), 25), unbias25) - h37_sum = v128.sub(h37_sum, v128.shl(carry, 25)) - let h48_sum = v128.add(v128.shuffle(h04_sum, h89_sum, 1, 2), carry) + carryB = v128.sub(v128.shr(v128.add(h37_sum, bias24), 25), unbias25) + h37_sum = v128.sub(h37_sum, v128.shl(carryB, 25)) + let h48_sum = v128.add(v128.shuffle(h04_sum, h89_sum, 1, 2), carryB) - carry = v128.sub(v128.shr(v128.add(h48_sum, bias25), 26), unbias26) - h48_sum = v128.sub(h48_sum, v128.shl(carry, 26)) - let h59_sum = v128.add(v128.shuffle(h15_sum, h89_sum, 1, 3), carry) + carryA = v128.sub(v128.shr(v128.add(h48_sum, bias25), 26), unbias26) + h48_sum = v128.sub(h48_sum, v128.shl(carryA, 26)) + let h59_sum = v128.add(v128.shuffle(h15_sum, h89_sum, 1, 3), carryA) - carry = v128.sub(v128.shr(v128.add(h59_sum, bias24), 25), unbias25) - h59_sum = v128.sub(h59_sum, v128.shl(carry, 25)) + carryB = v128.sub(v128.shr(v128.add(h59_sum, bias24), 25), unbias25) + h59_sum = v128.sub(h59_sum, v128.shl(carryB, 25)) // wrap requires multiplying carry from h9 by 19 - let h60_sum = v128.add(v128.shuffle(h26_sum, h04_sum, 1, 2), v128.mul(carry, i64x2(1, 19))) + let h60_sum = v128.add(v128.shuffle(h26_sum, h04_sum, 1, 2), v128.mul(carryB, i64x2(1, 19))) - carry = v128.sub(v128.shr(v128.add(h60_sum, bias25), 26), unbias26) - h60_sum = v128.sub(h60_sum, v128.shl(carry, 26)) - let h71_sum = v128.add(v128.shuffle(h37_sum, h15_sum, 1, 2), carry) + carryA = v128.sub(v128.shr(v128.add(h60_sum, bias25), 26), unbias26) + h60_sum = v128.sub(h60_sum, v128.shl(carryA, 26)) + let h71_sum = v128.add(v128.shuffle(h37_sum, h15_sum, 1, 2), carryA) // assign scalar results to output v128.store_lane(h_ptr, h60_sum, 2, 0) -- 2.52.0