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 } from './utils'
/**
* √-1
ge_precomp_0(t)
// base pointer offset += 144n = (4 bytes * 12 values * 3 fields) * n
- 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))
+ for (let i: u8 = 1; i < 9; i++, bp += 144) {
+ const iEqualsBabs = (u32(babs ^ i) - 1) >> 31 /* 1: yes; 0: no */
+ fe_memcmov(changetype<usize>(t.yplusx), bp, iEqualsBabs)
+ fe_memcmov(changetype<usize>(t.yminusx), bp + 48, iEqualsBabs)
+ fe_memcmov(changetype<usize>(t.xy2d), bp + 96, iEqualsBabs)
}
fe_memcopy(changetype<usize>(minust), changetype<usize>(t.yminusx))