#ifndef COSMOPOLITAN_THIRD_PARTY_MBEDTLS_MATH_H_
#define COSMOPOLITAN_THIRD_PARTY_MBEDTLS_MATH_H_

#define ADC(R, A, B, CI, CO) \
  do {                       \
    uint64_t Ta = A;         \
    uint64_t Tb = B;         \
    CO = (Ta += CI) < CI;    \
    CO += (Ta += Tb) < Tb;   \
    R = Ta;                  \
  } while (0)

#define SBB(R, A, B, CI, CO) \
  do {                       \
    uint64_t Ta = A;         \
    uint64_t Tb = B;         \
    uint64_t Tc = Ta < CI;   \
    Ta -= CI;                \
    CO = (Ta < Tb) + Tc;     \
    Ta -= Tb;                \
    R = Ta;                  \
  } while (0)

#define MADD(a, b, c0, c1, c2) \
  t = (uint128_t)a * b;        \
  t += c0;                     \
  c0 = t;                      \
  h = t >> 64;                 \
  c1 += h;                     \
  if (c1 < h) c2++

#endif /* COSMOPOLITAN_THIRD_PARTY_MBEDTLS_MATH_H_ */