]> git.codecow.com Git - nano25519.git/commitdiff
Eliminate memcpy in loop.
authorChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 20:46:44 +0000 (13:46 -0700)
committerChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 20:46:44 +0000 (13:46 -0700)
src/assembly/ge.ts

index e02a9bc598ce7b4a10a907125fbcf0f8794263e8..1f48fcfa1087197dab23e74c23cd41e6c8aa02b4 100644 (file)
@@ -25,13 +25,14 @@ import { equal, negative } from './utils'
 
 //@ts-expect-error
 @inline
-function ge_cmov (t: ge_precomp, u: ge_precomp, b: u8): void {
-       fe_cmov(changetype<usize>(t.yplusx), changetype<usize>(u.yplusx), b)
-       fe_cmov(changetype<usize>(t.yminusx), changetype<usize>(u.yminusx), b)
-       fe_cmov(changetype<usize>(t.xy2d), changetype<usize>(u.xy2d), b)
+function ge_cmov (t: ge_precomp, u: usize, b: u8): void {
+       fe_cmov(changetype<usize>(t.yplusx), u, b)
+       fe_cmov(changetype<usize>(t.yminusx), u + 48, b)
+       fe_cmov(changetype<usize>(t.xy2d), u + 96, b)
 }
 
 const p: ge_precomp = new ge_precomp()
+const q: usize = changetype<usize>(new StaticArray<i32>(36))
 //@ts-expect-error
 @inline
 function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void {
@@ -41,16 +42,18 @@ function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void {
        ge_precomp_0(t)
        for (let i = 0; i < 8; i++) {
                const baseptr = base + offset + (i * 144) // 4 bytes * 12 values * 3 fields
-               memory.copy(changetype<usize>(p.yplusx), baseptr, 48)
-               memory.copy(changetype<usize>(p.yminusx), baseptr + 48, 48)
-               memory.copy(changetype<usize>(p.xy2d), baseptr + 96, 48)
-               ge_cmov(t, p, equal(babs, i8(i + 1)))
+               ge_cmov(t, baseptr, equal(babs, i8(i + 1)))
        }
 
        fe_copy(p.yplusx, t.yminusx)
        fe_copy(p.yminusx, t.yplusx)
        fe_neg(p.xy2d, t.xy2d)
-       ge_cmov(t, p, bnegative)
+
+       memory.copy(q, changetype<usize>(p.yplusx), 48)
+       memory.copy(q + 48, changetype<usize>(p.yminusx), 48)
+       memory.copy(q + 96, changetype<usize>(p.xy2d), 48)
+
+       ge_cmov(t, q, bnegative)
 }
 
 const u: FieldElement = fe()