1#ifndef SECP256K1_FIELD_BRANCHLESS_HPP
2#define SECP256K1_FIELD_BRANCHLESS_HPP
33 std::uint64_t
const mask = 0ULL -
static_cast<std::uint64_t
>(flag);
35 auto& r_limbs =
const_cast<std::array<std::uint64_t, 4>&
>(r->limbs());
36 const auto& a_limbs = a->limbs();
37 const auto& b_limbs = b->limbs();
40 r_limbs[0] = (a_limbs[0] & mask) | (b_limbs[0] & ~mask);
41 r_limbs[1] = (a_limbs[1] & mask) | (b_limbs[1] & ~mask);
42 r_limbs[2] = (a_limbs[2] & mask) | (b_limbs[2] & ~mask);
43 r_limbs[3] = (a_limbs[3] & mask) | (b_limbs[3] & ~mask);
52 std::uint64_t mask = (flag | (0ULL - flag)) >> 63;
55 auto& r_limbs =
const_cast<std::array<std::uint64_t, 4>&
>(r->limbs());
56 const auto& a_limbs = a->limbs();
57 const auto& b_limbs = b->limbs();
59 r_limbs[0] = (a_limbs[0] & mask) | (b_limbs[0] & ~mask);
60 r_limbs[1] = (a_limbs[1] & mask) | (b_limbs[1] & ~mask);
61 r_limbs[2] = (a_limbs[2] & mask) | (b_limbs[2] & ~mask);
62 r_limbs[3] = (a_limbs[3] & mask) | (b_limbs[3] & ~mask);
69 std::uint64_t
const mask = 0ULL -
static_cast<std::uint64_t
>(flag);
71 const auto& a_limbs = a.
limbs();
72 const auto& b_limbs = b.limbs();
75 (a_limbs[0] & mask) | (b_limbs[0] & ~mask),
76 (a_limbs[1] & mask) | (b_limbs[1] & ~mask),
77 (a_limbs[2] & mask) | (b_limbs[2] & ~mask),
78 (a_limbs[3] & mask) | (b_limbs[3] & ~mask)
85 const auto& limbs = a.
limbs();
86 std::uint64_t
const z = limbs[0] | limbs[1] | limbs[2] | limbs[3];
88 return (z | (0ULL - z)) >> 63 ^ 1;
94 const auto& a_limbs = a.limbs();
95 const auto& b_limbs = b.limbs();
97 std::uint64_t
const diff = (a_limbs[0] ^ b_limbs[0]) |
98 (a_limbs[1] ^ b_limbs[1]) |
99 (a_limbs[2] ^ b_limbs[2]) |
100 (a_limbs[3] ^ b_limbs[3]);
103 return (diff | (0ULL - diff)) >> 63 ^ 1;
const limbs_type & limbs() const noexcept
static FieldElement zero()
static FieldElement from_limbs(const limbs_type &limbs)
void field_csub(FieldElement *r, const FieldElement &a, const FieldElement &b, bool flag) noexcept
void field_cmov(FieldElement *r, const FieldElement *a, const FieldElement *b, bool flag) noexcept
FieldElement field_select(const FieldElement &a, const FieldElement &b, bool flag) noexcept
void field_cneg(FieldElement *r, const FieldElement &a, bool flag) noexcept
void field_cadd(FieldElement *r, const FieldElement &a, const FieldElement &b, bool flag) noexcept
std::uint64_t field_eq(const FieldElement &a, const FieldElement &b) noexcept
std::uint64_t field_is_zero(const FieldElement &a) noexcept
void field_cmovznz(FieldElement *r, const FieldElement *a, const FieldElement *b, std::uint64_t flag) noexcept