*/
//@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)
}
/**
//@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 {
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()
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