From 9574613596309d5184f81bd31b5fb8ffd28dbd7c Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Fri, 21 Aug 2026 13:46:44 -0700 Subject: [PATCH] Eliminate memcpy in loop. --- src/assembly/ge.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) 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() -- 2.52.0