From: Chris Duncan Date: Fri, 21 Aug 2026 20:46:44 +0000 (-0700) Subject: Eliminate memcpy in loop. X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=9574613596309d5184f81bd31b5fb8ffd28dbd7c;p=nano25519.git Eliminate memcpy in loop. --- diff --git a/src/assembly/ge.ts b/src/assembly/ge.ts index e02a9bc..1f48fcf 100644 --- a/src/assembly/ge.ts +++ b/src/assembly/ge.ts @@ -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(t.yplusx), changetype(u.yplusx), b) - fe_cmov(changetype(t.yminusx), changetype(u.yminusx), b) - fe_cmov(changetype(t.xy2d), changetype(u.xy2d), b) +function ge_cmov (t: ge_precomp, u: usize, b: u8): void { + fe_cmov(changetype(t.yplusx), u, b) + fe_cmov(changetype(t.yminusx), u + 48, b) + fe_cmov(changetype(t.xy2d), u + 96, b) } const p: ge_precomp = new ge_precomp() +const q: usize = changetype(new StaticArray(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(p.yplusx), baseptr, 48) - memory.copy(changetype(p.yminusx), baseptr + 48, 48) - memory.copy(changetype(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(p.yplusx), 48) + memory.copy(q + 48, changetype(p.yminusx), 48) + memory.copy(q + 96, changetype(p.xy2d), 48) + + ge_cmov(t, q, bnegative) } const u: FieldElement = fe()