]> git.codecow.com Git - nano25519.git/commitdiff
Return pointer into base buffer instead of constructing new objects, and use pointer...
authorChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 19:06:35 +0000 (12:06 -0700)
committerChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 19:06:35 +0000 (12:06 -0700)
src/assembly/base.ts
src/assembly/ge.ts

index b45e44d8bfc1a58e1ec046d4cee5399d84a31431..448f1c0681cfbe5b52d621a2e92b3dcdec34f288 100644 (file)
@@ -1,23 +1,13 @@
 //! SPDX-FileCopyrightText: 2013-2026 Frank Denis <j@pureftpd.org>
 //! SPDX-License-Identifier: ISC
 
-import { ge_precomp } from './p'
-
-export function base (pos: i32): StaticArray<ge_precomp> {
-       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<ge_precomp> = new StaticArray<ge_precomp>(8)
-       for (let i = 0; i < 8; i++) {
-               const offset = i * 36
-               ge[i] = {
-                       yplusx: StaticArray.fromArray<i32>(ge_slice.slice(offset, offset + 12)),
-                       yminusx: StaticArray.fromArray<i32>(ge_slice.slice(offset + 12, offset + 24)),
-                       xy2d: StaticArray.fromArray<i32>(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<usize>(_base) + start
 }
 
 const _base = StaticArray.fromArray<i32>([
index f60e893fd39d54fb408d93f60acc16d2aca2e6fe..deab94525596f1de45360df5b76a12b1fa0de472 100644 (file)
@@ -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<usize>(new StaticArray<i32>(1152)) // 4 bytes * 12 values * 3 fields * 8 groups
 const ge_cmov8_minust: ge_precomp = new ge_precomp()
+const ge_cmov8_precomp: StaticArray<ge_precomp> = StaticArray.fromArray<ge_precomp>([
+       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<usize>(ge_cmov8_precomp[i].yplusx), ptr, 48)
+               memory.copy(changetype<usize>(ge_cmov8_precomp[i].yminusx), ptr + 48, 48)
+               memory.copy(changetype<usize>(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)