// Generated from Bedrock code in Fiat Cryptography. Avoid editing directly.

static inline br_word_t shrd(br_word_t lo, br_word_t hi, br_word_t n) {
  br_word_t res;
  res = lo>>(n&(sizeof(br_word_t)*8-1));
  if (n) {
    res = (hi<<((((((0u-(br_word_t)1)>>27)&63)+1)-n)&(sizeof(br_word_t)*8-1)))|res;
  } else {
    /*skip*/
  }
  return res;
}

static inline br_word_t p256_coord_nonzero(br_word_t p_x) {
  br_word_t nz;
  nz = (((_br_load(p_x))|(_br_load(p_x+4)))|(_br_load((p_x+4)+4)))|(_br_load(((p_x+4)+4)+4));
  nz = nz|(_br_load((((p_x+4)+4)+4)+4));
  nz = nz|(_br_load(((((p_x+4)+4)+4)+4)+4));
  nz = nz|(_br_load((((((p_x+4)+4)+4)+4)+4)+4));
  nz = nz|(_br_load(((((((p_x+4)+4)+4)+4)+4)+4)+4));
  nz = br_broadcast_nonzero(nz);
  return nz;
}

static inline void u256_shr(br_word_t p_out, br_word_t p_x, br_word_t n) {
  br_word_t x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7;
  x0 = _br_load(p_x);
  x1 = _br_load(p_x+4);
  x2 = _br_load((p_x+4)+4);
  x3 = _br_load(((p_x+4)+4)+4);
  x4 = _br_load((((p_x+4)+4)+4)+4);
  x5 = _br_load(((((p_x+4)+4)+4)+4)+4);
  x6 = _br_load((((((p_x+4)+4)+4)+4)+4)+4);
  x7 = _br_load(((((((p_x+4)+4)+4)+4)+4)+4)+4);
  y0 = shrd(x0, x1, n);
  y1 = shrd(x1, x2, n);
  y2 = shrd(x2, x3, n);
  y3 = shrd(x3, x4, n);
  y4 = shrd(x4, x5, n);
  y5 = shrd(x5, x6, n);
  y6 = shrd(x6, x7, n);
  y7 = x7>>(n&(sizeof(br_word_t)*8-1));
  _br_store(p_out, y0);
  _br_store(p_out+4, y1);
  _br_store((p_out+4)+4, y2);
  _br_store(((p_out+4)+4)+4, y3);
  _br_store((((p_out+4)+4)+4)+4, y4);
  _br_store(((((p_out+4)+4)+4)+4)+4, y5);
  _br_store((((((p_out+4)+4)+4)+4)+4)+4, y6);
  _br_store(((((((p_out+4)+4)+4)+4)+4)+4)+4, y7);
  return;
}

static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_t mask) {
  br_word_t mh0, mh1, mh2, mh3, mh4, mh5, mh6, mh7;
  mh0 = 0u-(br_word_t)1;
  mh1 = mh0;
  mh2 = mh0>>1;
  mh3 = (br_word_t)0;
  mh4 = (br_word_t)0;
  mh5 = (br_word_t)1<<31;
  mh6 = mh5;
  mh7 = mh2;
  _br_store(p_out, mask&mh0);
  _br_store(p_out+4, mask&mh1);
  _br_store((p_out+4)+4, mask&mh2);
  _br_store(((p_out+4)+4)+4, mask&mh3);
  _br_store((((p_out+4)+4)+4)+4, mask&mh4);
  _br_store(((((p_out+4)+4)+4)+4)+4, mask&mh5);
  _br_store((((((p_out+4)+4)+4)+4)+4)+4, mask&mh6);
  _br_store(((((((p_out+4)+4)+4)+4)+4)+4)+4, mask&mh7);
  return;
}
