import { base2 } from './base2'
import { FieldElement, fe, fe_1, fe_add, fe_cmov, fe_frombytes, fe_isnegative, fe_iszero, fe_memcmov, 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_0, 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'
+import { equal } from './utils'
/**
* √-1
-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, 0, 0
])
-//@ts-expect-error
-@inline
-function ge_cmov (t: ge_precomp, u: usize, b: u8): void {
- fe_memcmov(changetype<usize>(t.yplusx), u, b)
- fe_memcmov(changetype<usize>(t.yminusx), u + 48, b)
- fe_memcmov(changetype<usize>(t.xy2d), u + 96, b)
-}
-
/** Scratch array equivalent to a `ge_precomp`: 3x 12-limb FieldElements */
const minust = new StaticArray<i32>(36)
//@ts-expect-error
@inline
function ge_cmov8_base (t: ge_precomp, bp: usize, b: i8): void {
- const bnegative: u8 = negative(b)
+ const bnegative: u8 = u8(b) >> 7 /* b == 0..127: positive; b == 128..255: negative */
const babs: u8 = b - (((-bnegative) & b) * (i8(1) << 1))
ge_precomp_0(t)
// 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 += 144, equal(babs, 3))
- ge_cmov(t, bp += 144, equal(babs, 4))
- ge_cmov(t, bp += 144, equal(babs, 5))
- ge_cmov(t, bp += 144, equal(babs, 6))
- ge_cmov(t, bp += 144, equal(babs, 7))
- ge_cmov(t, bp += 144, equal(babs, 8))
+ for (let i: i8 = 1; i < 9; i++, bp += 144) {
+ fe_memcmov(changetype<usize>(t.yplusx), bp, equal(babs, i))
+ fe_memcmov(changetype<usize>(t.yminusx), bp + 48, equal(babs, i))
+ fe_memcmov(changetype<usize>(t.xy2d), bp + 96, equal(babs, i))
+ }
fe_memcopy(changetype<usize>(minust), changetype<usize>(t.yminusx))
fe_memcopy(changetype<usize>(minust) + 48, changetype<usize>(t.yplusx))
fe_memneg(changetype<usize>(minust) + 96, changetype<usize>(t.xy2d))
- ge_cmov(t, changetype<usize>(minust), bnegative)
+ fe_memcmov(changetype<usize>(t.yplusx), changetype<usize>(minust), bnegative)
+ fe_memcmov(changetype<usize>(t.yminusx), changetype<usize>(minust) + 48, bnegative)
+ fe_memcmov(changetype<usize>(t.xy2d), changetype<usize>(minust) + 96, bnegative)
+
minust.fill(0)
}