From d000f6f99ff69d6dd9040ff71dd1779c3c5c47ea Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Fri, 21 Aug 2026 15:04:44 -0700 Subject: [PATCH] Move base pointer out of move function entirely. --- src/assembly/ge.ts | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/assembly/ge.ts b/src/assembly/ge.ts index 8924cbd..6aae7f2 100644 --- a/src/assembly/ge.ts +++ b/src/assembly/ge.ts @@ -34,22 +34,21 @@ function ge_cmov (t: ge_precomp, u: usize, b: u8): void { const minust = changetype(new StaticArray(36)) //@ts-expect-error @inline -function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void { +function ge_cmov8_base (t: ge_precomp, bp: usize, b: i8): void { const bnegative: u8 = negative(b) const babs: u8 = b - (((-bnegative) & b) * (i8(1) << 1)) ge_precomp_0(t) - const base_ptr = base + offset - - // base pointer offset = 144n = (4 bytes * 12 values * 3 fields) * n - ge_cmov(t, base_ptr, equal(babs, 1)) - ge_cmov(t, base_ptr + 144, equal(babs, 2)) - ge_cmov(t, base_ptr + 288, equal(babs, 3)) - ge_cmov(t, base_ptr + 432, equal(babs, 4)) - ge_cmov(t, base_ptr + 576, equal(babs, 5)) - ge_cmov(t, base_ptr + 720, equal(babs, 6)) - ge_cmov(t, base_ptr + 864, equal(babs, 7)) - ge_cmov(t, base_ptr + 1008, equal(babs, 8)) + + // base pointer offset += 144n = (4 bytes * 12 values * 3 fields) * n + ge_cmov(t, bp, equal(babs, 1)) + ge_cmov(t, bp + 144, equal(babs, 2)) + ge_cmov(t, bp + 288, equal(babs, 3)) + ge_cmov(t, bp + 432, equal(babs, 4)) + ge_cmov(t, bp + 576, equal(babs, 5)) + ge_cmov(t, bp + 720, equal(babs, 6)) + ge_cmov(t, bp + 864, equal(babs, 7)) + ge_cmov(t, bp + 1008, equal(babs, 8)) fe_memcopy(minust, changetype(t.yminusx)) fe_memcopy(minust + 48, changetype(t.yplusx)) @@ -222,9 +221,9 @@ function ge_scalarmult_base (h: ge_p3, a: StaticArray): void { ge_p3_0(h) - // base pointer = 4 bytes * 12 values * 3 fe * 8 ge = 1152 bytes + // base pointer offset = 4 bytes * 12 values * 3 fe * 8 ge = 1152 bytes for (let i = 1, bp = 0; i < 64; i += 2, bp += 1152) { - ge_cmov8_base(t, bp, e[i]) + ge_cmov8_base(t, base + bp, e[i]) ge_add_precomp(r, h, t) ge_p1p1_to_p3(h, r) } @@ -238,9 +237,9 @@ function ge_scalarmult_base (h: ge_p3, a: StaticArray): void { ge_p2_dbl(r, s) ge_p1p1_to_p3(h, r) - // base pointer = 4 bytes * 12 values * 3 fe * 8 ge = 1152 bytes + // base pointer offset = 4 bytes * 12 values * 3 fe * 8 ge = 1152 bytes for (let i = 0, bp = 0; i < 64; i += 2, bp += 1152) { - ge_cmov8_base(t, bp, e[i]) + ge_cmov8_base(t, base + bp, e[i]) ge_add_precomp(r, h, t) ge_p1p1_to_p3(h, r) } -- 2.52.0