From: Chris Duncan Date: Fri, 21 Aug 2026 19:06:35 +0000 (-0700) Subject: Return pointer into base buffer instead of constructing new objects, and use pointer... X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=57d00ec88d643f034fe9039b1a53a04e1a335f43;p=nano25519.git Return pointer into base buffer instead of constructing new objects, and use pointer to copy memory one ge_precomp at a time. --- diff --git a/src/assembly/base.ts b/src/assembly/base.ts index b45e44d..448f1c0 100644 --- a/src/assembly/base.ts +++ b/src/assembly/base.ts @@ -1,23 +1,13 @@ //! SPDX-FileCopyrightText: 2013-2026 Frank Denis //! SPDX-License-Identifier: ISC -import { ge_precomp } from './p' - -export function base (pos: i32): StaticArray { - const stride = 8 * 3 * 12 // 8 arrays of 3 arrays of 12 values - const start: i32 = pos * stride - const end: i32 = start + stride - const ge_slice = _base.slice(start, end) - const ge: StaticArray = new StaticArray(8) - for (let i = 0; i < 8; i++) { - const offset = i * 36 - ge[i] = { - yplusx: StaticArray.fromArray(ge_slice.slice(offset, offset + 12)), - yminusx: StaticArray.fromArray(ge_slice.slice(offset + 12, offset + 24)), - xy2d: StaticArray.fromArray(ge_slice.slice(offset + 24, offset + 36)), - } - } - return ge + +/** 8 arrays of 3 arrays of 12 values of 4 bytes */ +const stride = 8 * 3 * 12 * 4 + +export function base (pos: i32): usize { + const start: usize = pos * stride + return changetype(_base) + start } const _base = StaticArray.fromArray([ diff --git a/src/assembly/ge.ts b/src/assembly/ge.ts index f60e893..deab945 100644 --- a/src/assembly/ge.ts +++ b/src/assembly/ge.ts @@ -31,18 +31,33 @@ function ge_cmov (t: ge_precomp, u: ge_precomp, b: u8): void { fe_cmov(t.xy2d, u.xy2d, b) } +const ge_cmov8_precomp_buffer: usize = changetype(new StaticArray(1152)) // 4 bytes * 12 values * 3 fields * 8 groups const ge_cmov8_minust: ge_precomp = new ge_precomp() +const ge_cmov8_precomp: StaticArray = StaticArray.fromArray([ + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), + new ge_precomp(), +]) //@ts-expect-error @inline function ge_cmov8_base (t: ge_precomp, pos: i32, b: i8): void { const minust = ge_cmov8_minust const bnegative: u8 = negative(b) const babs: u8 = b - (((-bnegative) & b) * (i8(1) << 1)) - const precomp = base(pos) + memory.copy(ge_cmov8_precomp_buffer, base(pos), 1152) ge_precomp_0(t) for (let i: i8 = 0; i < 8; i++) { - ge_cmov(t, precomp[i], equal(babs, i + 1)) + const ptr = ge_cmov8_precomp_buffer + (i * 144) // 4 bytes * 12 values * 3 fields + memory.copy(changetype(ge_cmov8_precomp[i].yplusx), ptr, 48) + memory.copy(changetype(ge_cmov8_precomp[i].yminusx), ptr + 48, 48) + memory.copy(changetype(ge_cmov8_precomp[i].xy2d), ptr + 96, 48) + ge_cmov(t, ge_cmov8_precomp[i], equal(babs, i + 1)) } fe_copy(minust.yplusx, t.yminusx)