]> git.codecow.com Git - nano25519.git/commitdiff
Eliminate redundant memory copy calls.
authorChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 21:27:04 +0000 (14:27 -0700)
committerChris Duncan <chris@codecow.com>
Fri, 21 Aug 2026 21:27:04 +0000 (14:27 -0700)
src/assembly/fe.ts
src/assembly/ge.ts

index e79f5354dfd8ce500f213ee5700f176398689614..06abed1072a144abdbeb5309dfe3025aa7d725de 100644 (file)
@@ -92,8 +92,20 @@ export function fe_cmov (f: usize, g: usize, b: u64): void {
 /**
  * Copy values from one FieldElement to another.
  *
- * @param h FieldElement destination
- * @param f FieldElement source
+ * @param {usize} h pointer to FieldElement destination
+ * @param {usize} f pointer to FieldElement source
+ */
+//@ts-expect-error
+@inline
+export function fe_memcopy (h: usize, f: usize): void {
+       memory.copy(h, f, 40)
+}
+
+/**
+ * Copy values from one FieldElement to another.
+ *
+ * @param {FieldElement} h destination
+ * @param {FieldElement} f source
  */
 //@ts-expect-error
 @inline
@@ -566,17 +578,27 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void
 /**
  * Negate the values of a FieldElement and store the result.
  *
- * @param h FieldElement result destination
- * @param f FieldElement operand source
+ * @param {usize} h pointer to FieldElement result destination
+ * @param {usize} f pointer to FieldElement operand source
+ */
+//@ts-expect-error
+@inline
+export function fe_memneg (h: usize, f: usize): void {
+       v128.store(h, v128.neg<i32>(v128.load(f)))
+       v128.store(h, v128.neg<i32>(v128.load(f, 16)), 16)
+       v128.store_lane<i64>(h, v128.neg<i32>(v128.load(f, 32)), 0, 32)
+}
+
+/**
+ * Negate the values of a FieldElement and store the result.
+ *
+ * @param {FieldElement} h result destination
+ * @param {FieldElement} f operand source
  */
 //@ts-expect-error
 @inline
 export function fe_neg (h: FieldElement, f: FieldElement): void {
-       const h_ptr = changetype<usize>(h)
-       const f_ptr = changetype<usize>(f)
-       v128.store(h_ptr, v128.neg<i32>(v128.load(f_ptr)))
-       v128.store(h_ptr, v128.neg<i32>(v128.load(f_ptr, 16)), 16)
-       v128.store_lane<i64>(h_ptr, v128.neg<i32>(v128.load(f_ptr, 32)), 0, 32)
+       fe_memneg(changetype<usize>(h), changetype<usize>(f))
 }
 
 const fe_pow22523_t0: FieldElement = fe()
index 1f48fcfa1087197dab23e74c23cd41e6c8aa02b4..c514d3408727bd4e0455c79ff570329f229635fd 100644 (file)
@@ -19,7 +19,7 @@
 import { base } from './base'
 import { base2 } from './base2'
 import { ed25519_d, fe_sqrtm1 } from './constants'
-import { FieldElement, fe, fe_1, fe_add, fe_cmov, fe_copy, fe_frombytes, fe_isnegative, fe_iszero, fe_mul, fe_neg, fe_pow22523, fe_sq, fe_sub } from './fe'
+import { FieldElement, fe, fe_1, fe_add, fe_cmov, fe_frombytes, fe_isnegative, fe_iszero, fe_memcopy, fe_memneg, fe_mul, fe_neg, fe_pow22523, fe_sq, fe_sub } from './fe'
 import { ge_add_cached, ge_add_precomp, ge_cached, ge_p1p1, ge_p1p1_to_p2, ge_p1p1_to_p3, ge_p2, ge_p2_0, ge_p2_dbl, ge_p2_to_p3, ge_p3, ge_p3_0, ge_p3_dbl, ge_p3_to_cached, ge_p3_tobytes, ge_precomp, ge_precomp_0, ge_sub_cached, ge_sub_precomp } from './p'
 import { equal, negative } from './utils'
 
@@ -31,8 +31,7 @@ function ge_cmov (t: ge_precomp, u: usize, b: u8): void {
        fe_cmov(changetype<usize>(t.xy2d), u + 96, b)
 }
 
-const p: ge_precomp = new ge_precomp()
-const q: usize = changetype<usize>(new StaticArray<i32>(36))
+const p = changetype<usize>(new StaticArray<i32>(36))
 //@ts-expect-error
 @inline
 function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void {
@@ -45,15 +44,11 @@ function ge_cmov8_base (t: ge_precomp, offset: i32, b: i8): void {
                ge_cmov(t, baseptr, equal(babs, i8(i + 1)))
        }
 
-       fe_copy(p.yplusx, t.yminusx)
-       fe_copy(p.yminusx, t.yplusx)
-       fe_neg(p.xy2d, t.xy2d)
+       fe_memcopy(p, changetype<usize>(t.yminusx))
+       fe_memcopy(p + 48, changetype<usize>(t.yplusx))
+       fe_memneg(p + 96, changetype<usize>(t.xy2d))
 
-       memory.copy(q, changetype<usize>(p.yplusx), 48)
-       memory.copy(q + 48, changetype<usize>(p.yminusx), 48)
-       memory.copy(q + 96, changetype<usize>(p.xy2d), 48)
-
-       ge_cmov(t, q, bnegative)
+       ge_cmov(t, p, bnegative)
 }
 
 const u: FieldElement = fe()