1/* 2 * Copyright (c) 2006 Apple Computer, Inc. All rights reserved. 3 */ 4 5#ifndef __CHECKINT_H__ 6#define __CHECKINT_H__ 7 8/* ObjC++ Guard */ 9#if defined(__OBJC__) && defined(__cplusplus) 10#error "checkint.h does not support Objective C++" 11#elif defined(__cplusplus) 12#error "checkint.h does not support C++" 13#endif 14 15#include <stdint.h> 16#include <limits.h> 17 18__BEGIN_DECLS 19 20enum { 21 CHECKINT_NO_ERROR = 0, 22 CHECKINT_OVERFLOW_ERROR = (1 << 0), 23 CHECKINT_TYPE_ERROR = (1 << 1) 24}; 25 26#define check_int32_add(x, y, err) __checkint_int32_add(x,y,err) 27#define check_uint32_add(x, y, err) __checkint_uint32_add(x,y,err) 28#define check_int64_add(x, y, err) __checkint_int64_add(x,y,err) 29#define check_uint64_add(x, y, err) __checkint_uint64_add(x,y,err) 30 31#define check_int32_sub(x, y, err) __checkint_int32_sub(x,y,err) 32#define check_uint32_sub(x, y, err) __checkint_uint32_sub(x,y,err) 33#define check_int64_sub(x, y, err) __checkint_int64_sub(x,y,err) 34#define check_uint64_sub(x, y, err) __checkint_uint64_sub(x,y,err) 35 36#define check_int32_mul(x, y, err) __checkint_int32_mul(x,y,err) 37#define check_uint32_mul(x, y, err) __checkint_uint32_mul(x,y,err) 38#define check_int64_mul(x, y, err) __checkint_int64_mul(x,y,err) 39#define check_uint64_mul(x, y, err) __checkint_uint64_mul(x,y,err) 40 41#define check_int32_div(x, y, err) __checkint_int32_div(x,y,err) 42#define check_uint32_div(x, y, err) __checkint_uint32_div(x,y,err) 43#define check_int64_div(x, y, err) __checkint_int64_div(x,y,err) 44#define check_uint64_div(x, y, err) __checkint_uint64_div(x,y,err) 45 46/*** 47 * Private Interfaces 48 * 49 * Please do not directly use any interfaces below this point. They are 50 * considered an implementation detail of the above, supported, interfaces 51 * and are subject to change at any time without warning. 52 ***/ 53 54#define __CHECKINT_INLINE static inline __attribute__((always_inline)) 55 56__CHECKINT_INLINE int32_t 57__checkint_is_mixed_sign32(int32_t x, int32_t y) {return ((x ^ y) < 0);} 58 59__CHECKINT_INLINE int32_t 60__checkint_is_mixed_sign64(int64_t x, int64_t y) {return ((x ^ y) < 0);} 61 62__CHECKINT_INLINE int32_t 63__checkint_int32_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;} 64 65__CHECKINT_INLINE int32_t 66__checkint_uint32_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;} 67 68__CHECKINT_INLINE int32_t 69__checkint_int64_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;} 70 71__CHECKINT_INLINE int32_t 72__checkint_uint64_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;} 73 74__CHECKINT_INLINE int32_t 75__checkint_int32_add(int64_t x, int64_t y, int32_t* err) { 76 int64_t z = x + y; 77 if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) { 78 *err |= CHECKINT_OVERFLOW_ERROR; 79 } 80 if (z > INT32_MAX || z < INT32_MIN) *err |= CHECKINT_OVERFLOW_ERROR; 81 return (int32_t)z; 82} 83 84__CHECKINT_INLINE uint32_t 85__checkint_uint32_add(int64_t x, int64_t y, int32_t* err) { 86 int64_t z = x + y; 87 if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR; 88 if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR; 89 return (uint32_t)z; 90} 91 92__CHECKINT_INLINE int64_t 93__checkint_int64_add_signed_signed(int64_t x, int64_t y, int32_t* err) { 94 /* Mixed-sign additions cannot overflow */ 95 if (__checkint_is_mixed_sign64(x,y)) { 96 /* else, both arguments negative */ 97 } else if (y < 0) { 98 if (x < LLONG_MIN - y) *err |= CHECKINT_OVERFLOW_ERROR; 99 /* else, both arguments positive */ 100 } else { 101 if (LLONG_MAX - x < y) *err |= CHECKINT_OVERFLOW_ERROR; 102 } 103 return x + y; 104} 105 106__CHECKINT_INLINE int64_t 107__checkint_int64_add_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 108 if(((int64_t)(LLONG_MAX - y)) < x) 109 *err = *err | CHECKINT_OVERFLOW_ERROR; 110 return x + y; 111} 112 113__CHECKINT_INLINE int64_t 114__checkint_int64_add_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 115 return __checkint_int64_add_signed_unsigned(y, x, err); 116} 117 118__CHECKINT_INLINE int64_t 119__checkint_int64_add_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 120 int64_t diff = LLONG_MAX - y; 121 if(diff < 0 || ((uint64_t) diff) < x) 122 *err = *err | CHECKINT_OVERFLOW_ERROR; 123 return x + y; 124} 125 126__CHECKINT_INLINE uint64_t 127__checkint_uint64_add_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 128 if((ULLONG_MAX - y) < x) 129 *err = *err | CHECKINT_OVERFLOW_ERROR; 130 return x + y; 131} 132 133__CHECKINT_INLINE uint64_t 134__checkint_uint64_add_signed_signed(int64_t x, int64_t y, int32_t* err) { 135 if(((x < 0 && y >= 0) || (x >= 0 && y < 0)) && (x + y) < 0) 136 *err = *err | CHECKINT_OVERFLOW_ERROR; 137 else if(x < 0 && y < 0) 138 *err = *err | CHECKINT_OVERFLOW_ERROR; 139 return x + y; 140} 141 142__CHECKINT_INLINE uint64_t 143__checkint_uint64_add_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 144 if(x > 0) 145 return __checkint_uint64_add_unsigned_unsigned(x, y, err); 146 if((y < ((uint64_t)LLONG_MAX + 1)) && (((int64_t) (x + y)) < 0)) 147 *err = *err | CHECKINT_OVERFLOW_ERROR; 148 return x + y; 149} 150 151__CHECKINT_INLINE uint64_t 152__checkint_uint64_add_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 153 return __checkint_uint64_add_signed_unsigned(y, x, err); 154} 155 156__CHECKINT_INLINE int32_t 157__checkint_int32_sub(int64_t x, int64_t y, int32_t* err) { 158 if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) { 159 *err |= CHECKINT_OVERFLOW_ERROR; 160 } 161 int64_t z = x - y; 162 if (z > INT_MAX || z < INT_MIN) *err |= CHECKINT_OVERFLOW_ERROR; 163 return (int32_t)z; 164} 165 166__CHECKINT_INLINE uint32_t 167__checkint_uint32_sub(int64_t x, int64_t y, int32_t* err) { 168 int64_t z = x - y; 169 if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR; 170 if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR; 171 return (uint32_t)z; 172} 173 174__CHECKINT_INLINE int64_t 175__checkint_int64_sub_signed_signed(int64_t x, int64_t y, int32_t* err) { 176 if(__checkint_is_mixed_sign64(x, y)) 177 { 178 /* Positive x subtract a negative y */ 179 if(x >= 0) 180 { 181 if(x > LLONG_MAX + y) 182 *err = *err | CHECKINT_OVERFLOW_ERROR; 183 } 184 /* Negative x subtract a positive y */ 185 else 186 { 187 if(x < LLONG_MIN + y) 188 *err = *err | CHECKINT_OVERFLOW_ERROR; 189 } 190 } 191 /* Both negative, or both positive, no possible overflow */ 192 return x - y; 193} 194 195__CHECKINT_INLINE int64_t 196__checkint_int64_sub_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 197 if(x < ((int64_t)(LLONG_MIN + y))) 198 *err = *err | CHECKINT_OVERFLOW_ERROR; 199 return x - y; 200} 201 202__CHECKINT_INLINE int64_t 203__checkint_int64_sub_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 204 if(x > ((uint64_t)(LLONG_MAX + y)) || y == LLONG_MIN) 205 *err = *err | CHECKINT_OVERFLOW_ERROR; 206 return x - y; 207} 208 209__CHECKINT_INLINE int64_t 210__checkint_int64_sub_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 211 if(x > y && ((x - y) > LLONG_MAX)) 212 *err = *err | CHECKINT_OVERFLOW_ERROR; 213 else if(x < y && ((y - x - 1) > LLONG_MAX)) 214 *err = *err | CHECKINT_OVERFLOW_ERROR; 215 return x - y; 216} 217 218__CHECKINT_INLINE uint64_t 219__checkint_uint64_sub_signed_signed(int64_t x, int64_t y, int32_t* err) { 220 if(((x < 0 && y <= 0) || (x >= 0 && y > 0)) && (x - y) < 0) 221 *err = *err | CHECKINT_OVERFLOW_ERROR; 222 else if(x < 0 && y > 0) 223 *err = *err | CHECKINT_OVERFLOW_ERROR; 224 return x - y; 225} 226 227__CHECKINT_INLINE uint64_t 228__checkint_uint64_sub_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 229 if(y > ((uint64_t) LLONG_MAX + 1) || ((int64_t) y) > x) 230 *err = *err | CHECKINT_OVERFLOW_ERROR; 231 return x - y; 232} 233 234__CHECKINT_INLINE uint64_t 235__checkint_uint64_sub_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 236 if(x <= LLONG_MAX) 237 return __checkint_uint64_sub_signed_signed(x, y, err); 238 else if (y == LLONG_MIN || -y > ULLONG_MAX - x) 239 *err = *err | CHECKINT_OVERFLOW_ERROR; 240 return x - y; 241} 242 243__CHECKINT_INLINE uint64_t 244__checkint_uint64_sub_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 245 if(x < y) 246 *err = *err | CHECKINT_OVERFLOW_ERROR; 247 return x - y; 248} 249 250__CHECKINT_INLINE int32_t 251__checkint_int32_mul(int64_t x, int64_t y, int32_t* err) { 252 int64_t z = x * y; 253 if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) { 254 *err |= CHECKINT_OVERFLOW_ERROR; 255 } 256 if (z > INT_MAX || z < INT_MIN) *err |= CHECKINT_OVERFLOW_ERROR; 257 return (int32_t)z; 258} 259 260__CHECKINT_INLINE uint32_t 261__checkint_uint32_mul(int64_t x, int64_t y, int32_t* err) { 262 int64_t z = x * y; 263 if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR; 264 if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR; 265 return (uint32_t)z; 266} 267 268__CHECKINT_INLINE int64_t 269__checkint_int64_mul_signed_signed(int64_t x, int64_t y, int32_t* err) { 270 if(x == 0 || y == 0) return 0; 271 272 if(!__checkint_is_mixed_sign64(x, y)) 273 { 274 if(x > 0) 275 { 276 if(LLONG_MAX/x < y) 277 *err = *err | CHECKINT_OVERFLOW_ERROR; 278 } 279 else 280 { 281 if(x == LLONG_MIN || y == LLONG_MIN) 282 *err = *err | CHECKINT_OVERFLOW_ERROR; 283 if(LLONG_MAX/(-x) < (-y)) 284 *err = *err | CHECKINT_OVERFLOW_ERROR; 285 } 286 } 287 else 288 { 289 if(x < 0) 290 { 291 if(x < LLONG_MIN/y) 292 *err = *err | CHECKINT_OVERFLOW_ERROR; 293 } 294 else 295 if(y < LLONG_MIN/x) 296 *err = *err | CHECKINT_OVERFLOW_ERROR; 297 } 298 return x * y; 299} 300 301__CHECKINT_INLINE uint64_t 302__checkint_uint64_mul_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 303 if(x == 0) return 0; 304 305 if(ULLONG_MAX/x < y) 306 *err = *err | CHECKINT_OVERFLOW_ERROR; 307 return x * y; 308} 309 310 311__CHECKINT_INLINE int64_t 312__checkint_int64_mul_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 313 if(x == 0) return 0; 314 315 if(LLONG_MAX/x < y) 316 *err = *err | CHECKINT_OVERFLOW_ERROR; 317 return x * y; 318} 319 320__CHECKINT_INLINE int64_t 321__checkint_int64_mul_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 322 if(y == 0) return 0; 323 324 if(x >= 0) 325 return __checkint_int64_mul_unsigned_unsigned(x, y, err); 326 else 327 if(x < LLONG_MIN/y || x > LLONG_MAX/y) 328 *err = *err | CHECKINT_OVERFLOW_ERROR; 329 return x * y; 330} 331 332__CHECKINT_INLINE int64_t 333__checkint_int64_mul_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 334 return __checkint_int64_mul_signed_unsigned(y, x, err); 335} 336 337__CHECKINT_INLINE uint64_t 338__checkint_uint64_mul_signed_signed(int64_t x, int64_t y, int32_t* err) { 339 if((x < 0 && y > 0) || (x > 0 && y < 0)) 340 *err = *err | CHECKINT_OVERFLOW_ERROR; 341 else if(x > 0 && y > 0) 342 return __checkint_uint64_mul_unsigned_unsigned(x, y, err); 343 else 344 return __checkint_uint64_mul_unsigned_unsigned(-x, -y, err); 345 return x * y; 346} 347 348__CHECKINT_INLINE uint64_t 349__checkint_uint64_mul_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 350 if(x >= 0) 351 return __checkint_uint64_mul_unsigned_unsigned(x, y, err); 352 *err = *err | CHECKINT_OVERFLOW_ERROR; 353 return (uint64_t) (x * y); 354} 355 356__CHECKINT_INLINE uint64_t 357__checkint_uint64_mul_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 358 return __checkint_uint64_mul_signed_unsigned(y, x, err); 359} 360 361__CHECKINT_INLINE int32_t 362__checkint_int32_div_signed_signed(int32_t x, int32_t y, int32_t* err) { 363 if((x == INT_MIN) && y == -1) 364 *err = *err | CHECKINT_OVERFLOW_ERROR; 365 return x / y; 366} 367 368__CHECKINT_INLINE int32_t 369__checkint_int32_div_signed_unsigned(int32_t x, uint32_t y, int32_t* err) { 370 if(y <= INT_MAX) 371 return x / (int32_t) y; 372 return 0; 373} 374 375__CHECKINT_INLINE int32_t 376__checkint_int32_div_unsigned_signed(uint32_t x, int32_t y, int32_t* err) { 377 if(x == ((uint32_t) INT_MAX + 1) && y == -1) 378 return INT_MIN; 379 if(x > ((uint32_t) INT_MAX + 1) && y == -1) 380 *err = *err | CHECKINT_OVERFLOW_ERROR; 381 else if(x > INT_MAX && y == 1) 382 *err = *err | CHECKINT_OVERFLOW_ERROR; 383 if(x <= INT_MAX) 384 return ((int32_t) x) / y; 385 if(y > 0) 386 return x / y; 387 return -(x / (uint32_t) -y); 388} 389 390__CHECKINT_INLINE int32_t 391__checkint_int32_div_unsigned_unsigned(uint32_t x, uint32_t y, int32_t* err) { 392 uint32_t result = x / y; 393 if(result > INT_MAX) 394 *err = *err | CHECKINT_OVERFLOW_ERROR; 395 return x / y; 396} 397 398__CHECKINT_INLINE uint32_t 399__checkint_uint32_div_signed_signed(int32_t x, int32_t y, int32_t* err) { 400 int32_t result = x / y; 401 if(x == INT_MIN && y == -1) 402 return ((uint32_t) -x); 403 if(result < 0) 404 *err = *err | CHECKINT_OVERFLOW_ERROR; 405 if(x >= 0 && y > 0) 406 return x / y; 407 else if(x < 0 && y > 0) 408 return -((uint32_t) -x / y); 409 else if(x > 0 && y < 0) 410 return -(x / (uint32_t) -y); 411 else 412 return ((uint32_t) -x / (uint32_t) -y); 413} 414 415__CHECKINT_INLINE uint32_t 416__checkint_uint32_div_signed_unsigned(int32_t x, uint32_t y, int32_t* err) { 417 if(x < 0 && ((uint32_t) -x) >= y) 418 *err = *err | CHECKINT_OVERFLOW_ERROR; 419 if(x >= 0) 420 return x / y; 421 return -(((uint32_t) -x) / y); 422} 423 424__CHECKINT_INLINE uint32_t 425__checkint_uint32_div_unsigned_signed(uint32_t x, int32_t y, int32_t* err) { 426 if(y < 0 && ((uint32_t) -y) <= x) 427 *err = *err | CHECKINT_OVERFLOW_ERROR; 428 if(y > 0) 429 return x / y; 430 return -(x / ((uint32_t) -y)); 431} 432 433__CHECKINT_INLINE uint32_t 434__checkint_uint32_div_unsigned_unsigned(uint32_t x, uint32_t y, int32_t* err) { 435 return x / y; 436} 437 438__CHECKINT_INLINE int64_t 439__checkint_int64_div_signed_signed(int64_t x, int64_t y, int32_t* err) { 440 if((x == LLONG_MIN) && y == -1) 441 *err = *err | CHECKINT_OVERFLOW_ERROR; 442 return x / y; 443} 444 445__CHECKINT_INLINE int64_t 446__checkint_int64_div_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 447 if(y <= LLONG_MAX) 448 return x / (int64_t) y; 449 return 0; 450} 451 452__CHECKINT_INLINE int64_t 453__checkint_int64_div_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 454 if(x == ((uint64_t) LLONG_MAX + 1) && y == -1) 455 return LLONG_MIN; 456 if(x > ((uint64_t) LLONG_MAX + 1) && y == -1) 457 *err = *err | CHECKINT_OVERFLOW_ERROR; 458 else if(x > LLONG_MAX && y == 1) 459 *err = *err | CHECKINT_OVERFLOW_ERROR; 460 if(x <= LLONG_MAX) 461 return ((int64_t) x) / y; 462 if(y > 0) 463 return x / y; 464 return -(x / (uint64_t) -y); 465} 466 467__CHECKINT_INLINE int64_t 468__checkint_int64_div_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 469 uint64_t result = x / y; 470 if(result > LLONG_MAX) 471 *err = *err | CHECKINT_OVERFLOW_ERROR; 472 return x / y; 473} 474 475__CHECKINT_INLINE uint64_t 476__checkint_uint64_div_signed_signed(int64_t x, int64_t y, int32_t* err) { 477 int64_t result = x / y; 478 if(x == LLONG_MIN && y == -1) 479 return ((uint64_t)LLONG_MAX) + 1; 480 if(result < 0) 481 *err = *err | CHECKINT_OVERFLOW_ERROR; 482 if(x >= 0 && y > 0) 483 return x / y; 484 else if(x < 0 && y > 0) 485 return -((uint64_t) -x / y); 486 else if(x > 0 && y < 0) 487 return -(x / (uint64_t) -y); 488 else 489 return ((uint64_t) -x / (uint64_t) -y); 490} 491 492__CHECKINT_INLINE uint64_t 493__checkint_uint64_div_signed_unsigned(int64_t x, uint64_t y, int32_t* err) { 494 if(x < 0 && ((uint64_t) -x) >= y) 495 *err = *err | CHECKINT_OVERFLOW_ERROR; 496 if(x >= 0) 497 return x / y; 498 return -(((uint64_t) -x) / y); 499} 500 501__CHECKINT_INLINE uint64_t 502__checkint_uint64_div_unsigned_signed(uint64_t x, int64_t y, int32_t* err) { 503 if(y < 0 && ((uint64_t) -y) <= x) 504 *err = *err | CHECKINT_OVERFLOW_ERROR; 505 if(y > 0) 506 return x / y; 507 return -(x / ((uint64_t) -y)); 508} 509 510__CHECKINT_INLINE uint64_t 511__checkint_uint64_div_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) { 512 return x / y; 513} 514 515#undef __CHECKINT_INLINE 516 517/******/ 518 519#ifdef __GNUC__ 520#define __checkint_same_type(e1, e2) __builtin_types_compatible_p(__typeof__(e1), __typeof__(e2)) 521#define __checkint_cond_expr(c, e1, e2) __builtin_choose_expr(c, e1, e2) 522#else 523#error "need compiler support for __checkint_same_type() and __checkint_cond_expr()" 524#endif 525 526/******/ 527 528#define __checkint_is_signed(x) (__checkint_same_type(x, int8_t) || __checkint_same_type(x, int16_t) || __checkint_same_type(x, int32_t) || __checkint_same_type(x, int64_t) || __checkint_same_type(x, signed long)) 529#define __checkint_is_unsigned(x) (__checkint_same_type(x, uint8_t) || __checkint_same_type(x, uint16_t) || __checkint_same_type(x, uint32_t) || __checkint_same_type(x, uint64_t) || __checkint_same_type(x, uintptr_t) || __checkint_same_type(x, unsigned long)) 530 531#define __checkint_is_signed_signed(x, y) (__checkint_is_signed(x) && __checkint_is_signed(y)) 532#define __checkint_is_signed_unsigned(x, y) (__checkint_is_signed(x) && __checkint_is_unsigned(y)) 533#define __checkint_is_unsigned_signed(x, y) (__checkint_is_unsigned(x) && __checkint_is_signed(y)) 534#define __checkint_is_unsigned_unsigned(x, y) (__checkint_is_unsigned(x) && __checkint_is_unsigned(y)) 535 536/******/ 537 538#define __CHECKINT_SIGN_DEMUX(type,oper,x,y,err) \ 539 (__checkint_cond_expr(__checkint_is_signed_signed(x, y), __checkint_ ## type ## _ ## oper ## _signed_signed(x, y, err), \ 540 __checkint_cond_expr(__checkint_is_signed_unsigned(x, y), __checkint_ ## type ## _ ## oper ## _signed_unsigned(x, y, err), \ 541 __checkint_cond_expr(__checkint_is_unsigned_signed(x, y), __checkint_ ## type ## _ ## oper ## _unsigned_signed(x, y, err), \ 542 __checkint_cond_expr(__checkint_is_unsigned_unsigned(x, y), __checkint_ ## type ## _ ## oper ## _unsigned_unsigned(x, y, err), \ 543 __checkint_ ## type ## _type_error(err)))))) 544 545#define __checkint_int64_add(x,y,err) __CHECKINT_SIGN_DEMUX(int64,add,x,y,err) 546#define __checkint_uint64_add(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,add,x,y,err) 547 548#define __checkint_int64_sub(x,y,err) __CHECKINT_SIGN_DEMUX(int64,sub,x,y,err) 549#define __checkint_uint64_sub(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,sub,x,y,err) 550 551#define __checkint_int64_mul(x,y,err) __CHECKINT_SIGN_DEMUX(int64,mul,x,y,err) 552#define __checkint_uint64_mul(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,mul,x,y,err) 553 554#define __checkint_int32_div(x,y,err) __CHECKINT_SIGN_DEMUX(int32,div,x,y,err) 555#define __checkint_int64_div(x,y,err) __CHECKINT_SIGN_DEMUX(int64,div,x,y,err) 556#define __checkint_uint32_div(x,y,err) __CHECKINT_SIGN_DEMUX(uint32,div,x,y,err) 557#define __checkint_uint64_div(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,div,x,y,err) 558 559__END_DECLS 560 561#endif /* __CHECKINT_H__ */ 562