46#if !defined(__STDC_LIMIT_MACROS)
47#define __STDC_LIMIT_MACROS
53#error integer type definitions not available
56#if defined(__has_builtin)
57#define HAS_BUILTIN(x) __has_builtin(x)
59#define HAS_BUILTIN(x) 0
62#if defined(__GNUC__) || HAS_BUILTIN(__builtin_expect)
63#define expect_false(x) (__builtin_expect(x, 0))
64#define expect_true(x) (__builtin_expect(x, 1))
66#define expect_false(x) (x)
67#define expect_true(x) (x)
72void ov(
const char *msg);
74static inline int32_t
fits_7(int32_t
x,
const char *msg)
80static inline int32_t
fits_15(int32_t
x,
const char *msg)
86static inline int32_t
fits_31(int32_t
x,
const char *msg)
95 return fits_7(
x,
"monomial exponent overflow: fits_7");
99 return fits_15(
x,
"monomial exponent overflow: fits_15");
103 return fits_31(
x,
"monomial exponent overflow: fits_31");
106static inline int32_t
over_1(int32_t
x) {
return x < 0; }
109 return (0x80008000u & (uint32_t)
x) != 0;
113 return (0x80808080u & (uint32_t)
x) != 0;
116static inline int32_t
add(int32_t
x, int32_t y,
const char *msg)
118 int32_t z = (uint32_t)
x + (uint32_t)y;
121 (int32_t)((uint32_t)
x ^ (uint32_t)y) >= 0)
ov(msg);
125static inline int32_t
add(int32_t
x, int32_t y)
127 return add(
x, y,
"monomial exponent overflow: int32_t + int32_t");
130static inline int32_t
add_to(int32_t &
x, int32_t y,
const char *msg)
132 int32_t z = (uint32_t)
x + (uint32_t)y;
135 (int32_t)((uint32_t)
x ^ (uint32_t)y) >= 0)
ov(msg);
139static inline int32_t
add_to(int32_t &
x, int32_t y)
141 return add_to(
x, y,
"monomial exponent overflow: int32_t + int32_t");
144static inline int32_t
sub(int32_t
x, int32_t y,
const char *msg)
146 int32_t z = (uint32_t)
x - (uint32_t)y;
149 (int32_t)((uint32_t)
x ^ (uint32_t)y) < 0)
ov(msg);
153static inline int32_t
sub(int32_t
x, int32_t y)
155 return sub(
x, y,
"monomial exponent overflow: int32_t - int32_t");
158static inline int32_t
sub_from(int32_t &
x, int32_t y,
const char *msg)
160 int32_t z = (uint32_t)
x - (uint32_t)y;
163 (int32_t)((uint32_t)
x ^ (uint32_t)y) < 0)
ov(msg);
169 return sub_from(
x, y,
"monomial exponent overflow: int32_t - int32_t");
172static inline int32_t
sub_pos(int32_t
x, int32_t y,
const char *msg)
174 if (
x <= y)
return 0;
175 int32_t z = (uint32_t)
x - (uint32_t)y;
182 return sub_pos(
x, y,
"monomial exponent overflow: int32_t - int32_t [pos]");
185static inline int32_t
minus(int32_t
x,
const char *msg)
187 int32_t z = -(uint32_t)
x;
194 return minus(
x,
"monomial exponent overflow: - int32_t");
197static inline int32_t
pos_add(int32_t
x, int32_t y,
const char *msg)
200 int32_t z = (uint32_t)
x + (uint32_t)y;
207 return pos_add(
x, y,
"monomial exponent overflow: pos int32_t + pos int32_t");
209static inline int32_t
pos_add_2(int32_t
x, int32_t y,
const char *msg)
212 int32_t z = (uint32_t)
x + (uint32_t)y;
220 x, y,
"monomial exponent overflow: pos int32_t + pos int32_t, packed 2");
222static inline int32_t
pos_add_4(int32_t
x, int32_t y,
const char *msg)
225 int32_t z = (uint32_t)
x + (uint32_t)y;
233 x, y,
"monomial exponent overflow: pos int32_t + pos int32_t, packed 4");
236static inline int32_t
mult(int32_t
x, int32_t y,
const char *msg)
238 int64_t z = (int64_t)
x * y;
239 int32_t w = (int32_t)z;
244static inline int32_t
mult(int32_t
x, int32_t y)
246 return mult(
x, y,
"monomial exponent overflow: int32_t * int32_t (mult)");
249static inline int32_t
mult_by(int32_t &
x, int32_t y,
const char *msg)
251 int64_t z = (int64_t)
x * y;
252 int32_t w = (int32_t)z;
257static inline int32_t
mult_by(int32_t &
x, int32_t y)
260 x, y,
"monomial exponent overflow: int32_t * int32_t (mult_by)");
263static inline int32_t
div(int32_t
x, int32_t y,
const char *msg)
269static inline int32_t
div(int32_t
x, int32_t y)
271 return div(
x, y,
"monomial exponent overflow: int32 / int32");
274static inline int32_t
div_by(int32_t &
x, int32_t y,
const char *msg)
280static inline int32_t
div_by(int32_t &
x, int32_t y)
282 return div_by(
x, y,
"monomial exponent overflow: int32 / int32");
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
static int32_t fits_31(int32_t x, const char *msg)
static int32_t mult(int32_t x, int32_t y, const char *msg)
static int32_t div_by(int32_t &x, int32_t y, const char *msg)
static int32_t over_4(int32_t x)
static int32_t mult_by(int32_t &x, int32_t y, const char *msg)
static int32_t sub_from(int32_t &x, int32_t y, const char *msg)
static int32_t pos_add(int32_t x, int32_t y, const char *msg)
static int32_t add(int32_t x, int32_t y, const char *msg)
static int32_t div(int32_t x, int32_t y, const char *msg)
static int32_t over_2(int32_t x)
static int32_t pos_add_4(int32_t x, int32_t y, const char *msg)
static int32_t fits_7(int32_t x, const char *msg)
static int32_t add_to(int32_t &x, int32_t y, const char *msg)
static int32_t sub(int32_t x, int32_t y, const char *msg)
static int32_t pos_add_2(int32_t x, int32_t y, const char *msg)
static int32_t fits_15(int32_t x, const char *msg)
static int32_t over_1(int32_t x)
static int32_t sub_pos(int32_t x, int32_t y, const char *msg)
static int32_t minus(int32_t x, const char *msg)