]> git.codecow.com Git - nano25519.git/commitdiff
Copy field elements by passing pointers instead of objects.
authorChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 20:32:29 +0000 (13:32 -0700)
committerChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 20:32:29 +0000 (13:32 -0700)
src/assembly/fe.ts
src/assembly/ge.ts

index fe45af82421e7469d17bf7a2782c495707b3abe9..e79f5354dfd8ce500f213ee5700f176398689614 100644 (file)
@@ -82,13 +82,11 @@ export function fe_add (h: FieldElement, f: FieldElement, g: FieldElement): void
  */
 //@ts-expect-error
 @inline
-export function fe_cmov (f: FieldElement, g: FieldElement, b: u64): void {
-       const f_ptr = changetype<usize>(f)
-       const g_ptr = changetype<usize>(g)
+export function fe_cmov (f: usize, g: usize, b: u64): void {
        const c = v128.splat<u64>(0 - b)
-       v128.store(f_ptr, v128.bitselect(v128.load(g_ptr), v128.load(f_ptr, 0), c))
-       v128.store(f_ptr, v128.bitselect(v128.load(g_ptr, 16), v128.load(f_ptr, 16), c), 16)
-       v128.store_lane<u64>(f_ptr, v128.bitselect(v128.load(g_ptr, 32), v128.load(f_ptr, 32), c), 0, 32)
+       v128.store(f, v128.bitselect(v128.load(g), v128.load(f, 0), c))
+       v128.store(f, v128.bitselect(v128.load(g, 16), v128.load(f, 16), c), 16)
+       v128.store_lane<u64>(f, v128.bitselect(v128.load(g, 32), v128.load(f, 32), c), 0, 32)
 }
 
 /**
index ca953a917d1b6b09a43da4396d6ea2d983d9a3d0..e02a9bc598ce7b4a10a907125fbcf0f8794263e8 100644 (file)
@@ -26,12 +26,12 @@ import { equal, negative } from './utils'
 //@ts-expect-error
 @inline
 function ge_cmov (t: ge_precomp, u: ge_precomp, b: u8): void {
-       fe_cmov(t.yplusx, u.yplusx, b)
-       fe_cmov(t.yminusx, u.yminusx, b)
-       fe_cmov(t.xy2d, u.xy2d, b)
+       fe_cmov(changetype<usize>(t.yplusx), changetype<usize>(u.yplusx), b)
+       fe_cmov(changetype<usize>(t.yminusx), changetype<usize>(u.yminusx), b)
+       fe_cmov(changetype<usize>(t.xy2d), changetype<usize>(u.xy2d), b)
 }
 
-const base_precomp: ge_precomp = new ge_precomp()
+const p: ge_precomp = new ge_precomp()
 //@ts-expect-error
 @inline
 function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void {
@@ -41,16 +41,16 @@ 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<usize>(base_precomp.yplusx), baseptr, 48)
-               memory.copy(changetype<usize>(base_precomp.yminusx), baseptr + 48, 48)
-               memory.copy(changetype<usize>(base_precomp.xy2d), baseptr + 96, 48)
-               ge_cmov(t, base_precomp, equal(babs, i8(i + 1)))
+               memory.copy(changetype<usize>(p.yplusx), baseptr, 48)
+               memory.copy(changetype<usize>(p.yminusx), baseptr + 48, 48)
+               memory.copy(changetype<usize>(p.xy2d), baseptr + 96, 48)
+               ge_cmov(t, p, equal(babs, i8(i + 1)))
        }
 
-       fe_copy(base_precomp.yplusx, t.yminusx)
-       fe_copy(base_precomp.yminusx, t.yplusx)
-       fe_neg(base_precomp.xy2d, t.xy2d)
-       ge_cmov(t, base_precomp, bnegative)
+       fe_copy(p.yplusx, t.yminusx)
+       fe_copy(p.yminusx, t.yplusx)
+       fe_neg(p.xy2d, t.xy2d)
+       ge_cmov(t, p, bnegative)
 }
 
 const u: FieldElement = fe()
@@ -132,10 +132,10 @@ export function ge_frombytes (h: ge_p3, s: StaticArray<u8>): i32 {
        has_m_root = fe_iszero(m_root_check)
        has_p_root = fe_iszero(p_root_check)
        fe_mul(x_sqrtm1, h.X, fe_sqrtm1) /* x*sqrt(-1) */
-       fe_cmov(h.X, x_sqrtm1, 1 - has_m_root)
+       fe_cmov(changetype<usize>(h.X), changetype<usize>(x_sqrtm1), 1 - has_m_root)
 
        fe_neg(negx, h.X)
-       fe_cmov(h.X, negx, fe_isnegative(h.X) ^ (s[31] >> 7))
+       fe_cmov(changetype<usize>(h.X), changetype<usize>(negx), fe_isnegative(h.X) ^ (s[31] >> 7))
        fe_mul(h.T, h.X, h.Y)
 
        return i32(has_m_root | has_p_root) - 1