]> git.codecow.com Git - nano25519.git/commitdiff
Move base pointer out of move function entirely.
authorChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 22:04:44 +0000 (15:04 -0700)
committerChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 22:04:44 +0000 (15:04 -0700)
src/assembly/ge.ts

index 8924cbd1d2b9a98012d75fdfd2756081f244fd16..6aae7f2a31f7db4f2eee7313a1c50443da004220 100644 (file)
@@ -34,22 +34,21 @@ function ge_cmov (t: ge_precomp, u: usize, b: u8): void {
 const minust = changetype<usize>(new StaticArray<i32>(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<usize>(t.yminusx))
        fe_memcopy(minust + 48, changetype<usize>(t.yplusx))
@@ -222,9 +221,9 @@ function ge_scalarmult_base (h: ge_p3, a: StaticArray<u8>): 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<u8>): 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)
        }