]> git.codecow.com Git - nano25519.git/commitdiff
Interleave carry assignments to improve cpu scheduling.
authorChris Duncan <chris@codecow.com>
Thu, 1 Oct 2026 20:51:02 +0000 (13:51 -0700)
committerChris Duncan <chris@codecow.com>
Thu, 1 Oct 2026 20:51:02 +0000 (13:51 -0700)
src/assembly/ed25519/fe.ts

index fba24bdbec63c9a45dfcaecb79e776531a6f797f..e157b1db6b6c9505e0e61aac39dc315714ad341f 100644 (file)
@@ -461,36 +461,37 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void
        const bias25 = v128.splat<i64>((<i64>1 << 25) + (<i64>1 << 62))
        const unbias25 = v128.splat<i64>(<i64>1 << 37)
        const unbias26 = v128.splat<i64>(<i64>1 << 36)
-       let carry: v128
+       let carryA: v128
+       let carryB: v128
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h04_sum, bias25), 26), unbias26)
-       h04_sum = v128.sub<i64>(h04_sum, v128.shl<i64>(carry, 26))
-       h15_sum = v128.add<i64>(h15_sum, carry)
+       carryA = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h04_sum, bias25), 26), unbias26)
+       h04_sum = v128.sub<i64>(h04_sum, v128.shl<i64>(carryA, 26))
+       h15_sum = v128.add<i64>(h15_sum, carryA)
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h15_sum, bias24), 25), unbias25)
-       h15_sum = v128.sub<i64>(h15_sum, v128.shl<i64>(carry, 25))
-       h26_sum = v128.add<i64>(h26_sum, carry)
+       carryB = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h15_sum, bias24), 25), unbias25)
+       h15_sum = v128.sub<i64>(h15_sum, v128.shl<i64>(carryB, 25))
+       h26_sum = v128.add<i64>(h26_sum, carryB)
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h26_sum, bias25), 26), unbias26)
-       h26_sum = v128.sub<i64>(h26_sum, v128.shl<i64>(carry, 26))
-       h37_sum = v128.add<i64>(h37_sum, carry)
+       carryA = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h26_sum, bias25), 26), unbias26)
+       h26_sum = v128.sub<i64>(h26_sum, v128.shl<i64>(carryA, 26))
+       h37_sum = v128.add<i64>(h37_sum, carryA)
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h37_sum, bias24), 25), unbias25)
-       h37_sum = v128.sub<i64>(h37_sum, v128.shl<i64>(carry, 25))
-       let h48_sum = v128.add<i64>(v128.shuffle<i64>(h04_sum, h89_sum, 1, 2), carry)
+       carryB = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h37_sum, bias24), 25), unbias25)
+       h37_sum = v128.sub<i64>(h37_sum, v128.shl<i64>(carryB, 25))
+       let h48_sum = v128.add<i64>(v128.shuffle<i64>(h04_sum, h89_sum, 1, 2), carryB)
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h48_sum, bias25), 26), unbias26)
-       h48_sum = v128.sub<i64>(h48_sum, v128.shl<i64>(carry, 26))
-       let h59_sum = v128.add<i64>(v128.shuffle<i64>(h15_sum, h89_sum, 1, 3), carry)
+       carryA = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h48_sum, bias25), 26), unbias26)
+       h48_sum = v128.sub<i64>(h48_sum, v128.shl<i64>(carryA, 26))
+       let h59_sum = v128.add<i64>(v128.shuffle<i64>(h15_sum, h89_sum, 1, 3), carryA)
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h59_sum, bias24), 25), unbias25)
-       h59_sum = v128.sub<i64>(h59_sum, v128.shl<i64>(carry, 25))
+       carryB = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h59_sum, bias24), 25), unbias25)
+       h59_sum = v128.sub<i64>(h59_sum, v128.shl<i64>(carryB, 25))
        // wrap requires multiplying carry from h9 by 19
-       let h60_sum = v128.add<i64>(v128.shuffle<i64>(h26_sum, h04_sum, 1, 2), v128.mul<i64>(carry, i64x2(1, 19)))
+       let h60_sum = v128.add<i64>(v128.shuffle<i64>(h26_sum, h04_sum, 1, 2), v128.mul<i64>(carryB, i64x2(1, 19)))
 
-       carry = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h60_sum, bias25), 26), unbias26)
-       h60_sum = v128.sub<i64>(h60_sum, v128.shl<i64>(carry, 26))
-       let h71_sum = v128.add<i64>(v128.shuffle<i64>(h37_sum, h15_sum, 1, 2), carry)
+       carryA = v128.sub<i64>(v128.shr<u64>(v128.add<i64>(h60_sum, bias25), 26), unbias26)
+       h60_sum = v128.sub<i64>(h60_sum, v128.shl<i64>(carryA, 26))
+       let h71_sum = v128.add<i64>(v128.shuffle<i64>(h37_sum, h15_sum, 1, 2), carryA)
 
        // assign scalar results to output
        v128.store_lane<i32>(h_ptr, h60_sum, 2, 0)