|
90 | 90 |
|
91 | 91 | #define UNSIGNED_INTEGER_MAX(T) ((T)~(T)0) |
92 | 92 |
|
| 93 | +#ifndef MUL_OVERFLOW_SIGNED_INTEGER_P |
93 | 94 | #if __has_builtin(__builtin_mul_overflow_p) |
94 | 95 | # define MUL_OVERFLOW_P(a, b) \ |
95 | 96 | __builtin_mul_overflow_p((a), (b), (__typeof__(a * b))0) |
|
131 | 132 | # define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX) |
132 | 133 | # define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX) |
133 | 134 | #endif |
| 135 | +#endif |
| 136 | + |
| 137 | +#ifndef ADD_OVERFLOW_SIGNED_INTEGER_P |
| 138 | +#if __has_builtin(__builtin_add_overflow_p) |
| 139 | +# define ADD_OVERFLOW_P(a, b) \ |
| 140 | + __builtin_add_overflow_p((a), (b), (__typeof__(a * b))0) |
| 141 | +#elif __has_builtin(__builtin_add_overflow) |
| 142 | +# define ADD_OVERFLOW_P(a, b) \ |
| 143 | + __extension__ ({ __typeof__(a) c; __builtin_add_overflow((a), (b), &c); }) |
| 144 | +#endif |
| 145 | + |
| 146 | +#define ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \ |
| 147 | + (a) > 0 ? (b) > (max) - (a) : (b) < (min) - (a)) |
| 148 | + |
| 149 | +#if __has_builtin(__builtin_add_overflow_p) |
| 150 | +/* __builtin_add_overflow_p can take bitfield */ |
| 151 | +/* and GCC permits bitfields for integers other than int */ |
| 152 | +# define ADD_OVERFLOW_FIXNUM_P(a, b) \ |
| 153 | + __extension__ ({ \ |
| 154 | + struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \ |
| 155 | + __builtin_add_overflow_p((a), (b), c.fixnum); \ |
| 156 | + }) |
| 157 | +#else |
| 158 | +# define ADD_OVERFLOW_FIXNUM_P(a, b) \ |
| 159 | + ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX) |
| 160 | +#endif |
| 161 | + |
| 162 | +#if defined(ADD_OVERFLOW_P) && defined(USE___BUILTIN_ADD_OVERFLOW_LONG_LONG) |
| 163 | +# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_P(a, b) |
| 164 | +#else |
| 165 | +# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX) |
| 166 | +#endif |
| 167 | + |
| 168 | +#ifdef ADD_OVERFLOW_P |
| 169 | +# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_P(a, b) |
| 170 | +# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_P(a, b) |
| 171 | +#else |
| 172 | +# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX) |
| 173 | +# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX) |
| 174 | +#endif |
| 175 | +#endif |
| 176 | + |
| 177 | +#ifndef SUB_OVERFLOW_SIGNED_INTEGER_P |
| 178 | +#if __has_builtin(__builtin_sub_overflow_p) |
| 179 | +# define SUB_OVERFLOW_P(a, b) \ |
| 180 | + __builtin_sub_overflow_p((a), (b), (__typeof__(a * b))0) |
| 181 | +#elif __has_builtin(__builtin_sub_overflow) |
| 182 | +# define SUB_OVERFLOW_P(a, b) \ |
| 183 | + __extension__ ({ __typeof__(a) c; __builtin_sub_overflow((a), (b), &c); }) |
| 184 | +#endif |
| 185 | + |
| 186 | +#define SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \ |
| 187 | + (b) > 0 ? (a) < (min) + (b) : (a) > (max) + (b)) |
| 188 | + |
| 189 | +#if __has_builtin(__builtin_sub_overflow_p) |
| 190 | +/* __builtin_sub_overflow_p can take bitfield */ |
| 191 | +/* and GCC permits bitfields for integers other than int */ |
| 192 | +# define SUB_OVERFLOW_FIXNUM_P(a, b) \ |
| 193 | + __extension__ ({ \ |
| 194 | + struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \ |
| 195 | + __builtin_sub_overflow_p((a), (b), c.fixnum); \ |
| 196 | + }) |
| 197 | +#else |
| 198 | +# define SUB_OVERFLOW_FIXNUM_P(a, b) \ |
| 199 | + SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX) |
| 200 | +#endif |
| 201 | + |
| 202 | +#if defined(SUB_OVERFLOW_P) && defined(USE___BUILTIN_SUB_OVERFLOW_LONG_LONG) |
| 203 | +# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_P(a, b) |
| 204 | +#else |
| 205 | +# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX) |
| 206 | +#endif |
| 207 | + |
| 208 | +#ifdef SUB_OVERFLOW_P |
| 209 | +# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_P(a, b) |
| 210 | +# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_P(a, b) |
| 211 | +#else |
| 212 | +# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX) |
| 213 | +# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX) |
| 214 | +#endif |
| 215 | +#endif |
134 | 216 |
|
135 | 217 | #ifdef HAVE_UINT128_T |
136 | 218 | # define bit_length(x) \ |
|
0 commit comments