| ... | ... | @@ -6,6 +6,16 @@ |
| 6 | 6 | #include <stddef.h> |
| 7 | 7 | #include <stdint.h> |
| 8 | 8 | |
| 9 | #if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L |
| 10 | #if __STDC_VERSION__ >= 199901L |
| 11 | #include <stdbool.h> |
| 12 | #else |
| 13 | typedef char bool; |
| 14 | #define false 0 |
| 15 | #define true 1 |
| 16 | #endif |
| 17 | #endif |
| 18 | |
| 9 | 19 | #if defined(__has_builtin) |
| 10 | 20 | #define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin) |
| 11 | 21 | #else |
| ... | ... | @@ -136,8 +146,8 @@ |
| 136 | 146 | #define memory_order_acq_rel __ATOMIC_ACQ_REL |
| 137 | 147 | #define memory_order_seq_cst __ATOMIC_SEQ_CST |
| 138 | 148 | #define zig_atomic(type) type |
| 139 | | #define zig_cmpxchg_strong(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, zig_false, succ, fail) |
| 140 | | #define zig_cmpxchg_weak(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, zig_true , succ, fail) |
| 149 | #define zig_cmpxchg_strong(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, false, succ, fail) |
| 150 | #define zig_cmpxchg_weak(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, true , succ, fail) |
| 141 | 151 | #define zig_atomicrmw_xchg(obj, arg, order) __atomic_exchange_n(obj, arg, order) |
| 142 | 152 | #define zig_atomicrmw_add(obj, arg, order) __atomic_fetch_add (obj, arg, order) |
| 143 | 153 | #define zig_atomicrmw_sub(obj, arg, order) __atomic_fetch_sub (obj, arg, order) |
| ... | ... | @@ -189,20 +199,6 @@ |
| 189 | 199 | |
| 190 | 200 | #define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T)) |
| 191 | 201 | |
| 192 | | #if defined(__cplusplus) |
| 193 | | typedef bool zig_bool; |
| 194 | | #define zig_false false |
| 195 | | #define zig_true true |
| 196 | | #else |
| 197 | | #if __STDC_VERSION__ >= 199901L |
| 198 | | typedef _Bool zig_bool; |
| 199 | | #else |
| 200 | | typedef char zig_bool; |
| 201 | | #endif |
| 202 | | #define zig_false ((zig_bool)0) |
| 203 | | #define zig_true ((zig_bool)1) |
| 204 | | #endif |
| 205 | | |
| 206 | 202 | typedef uintptr_t zig_usize; |
| 207 | 203 | typedef intptr_t zig_isize; |
| 208 | 204 | typedef signed short int zig_c_short; |
| ... | ... | @@ -330,10 +326,10 @@ zig_int_helpers(16) |
| 330 | 326 | zig_int_helpers(32) |
| 331 | 327 | zig_int_helpers(64) |
| 332 | 328 | |
| 333 | | static inline zig_bool zig_addo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 329 | static inline bool zig_addo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 334 | 330 | #if zig_has_builtin(add_overflow) |
| 335 | 331 | zig_u32 full_res; |
| 336 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 332 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 337 | 333 | *res = zig_wrap_u32(full_res, bits); |
| 338 | 334 | return overflow || full_res < zig_minInt(u32, bits) || full_res > zig_maxInt(u32, bits); |
| 339 | 335 | #else |
| ... | ... | @@ -349,14 +345,14 @@ static inline void zig_vaddo_u32(zig_u8 *ov, zig_u32 *res, int n, |
| 349 | 345 | } |
| 350 | 346 | |
| 351 | 347 | zig_extern zig_i32 __addosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow); |
| 352 | | static inline zig_bool zig_addo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 348 | static inline bool zig_addo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 353 | 349 | #if zig_has_builtin(add_overflow) |
| 354 | 350 | zig_i32 full_res; |
| 355 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 351 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 356 | 352 | #else |
| 357 | 353 | zig_c_int overflow_int; |
| 358 | 354 | zig_u32 full_res = __addosi4(lhs, rhs, &overflow_int); |
| 359 | | zig_bool overflow = overflow_int != 0; |
| 355 | bool overflow = overflow_int != 0; |
| 360 | 356 | #endif |
| 361 | 357 | *res = zig_wrap_i32(full_res, bits); |
| 362 | 358 | return overflow || full_res < zig_minInt(i32, bits) || full_res > zig_maxInt(i32, bits); |
| ... | ... | @@ -368,10 +364,10 @@ static inline void zig_vaddo_i32(zig_u8 *ov, zig_i32 *res, int n, |
| 368 | 364 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_i32(&res[i], lhs[i], rhs[i], bits); |
| 369 | 365 | } |
| 370 | 366 | |
| 371 | | static inline zig_bool zig_addo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 367 | static inline bool zig_addo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 372 | 368 | #if zig_has_builtin(add_overflow) |
| 373 | 369 | zig_u64 full_res; |
| 374 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 370 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 375 | 371 | *res = zig_wrap_u64(full_res, bits); |
| 376 | 372 | return overflow || full_res < zig_minInt(u64, bits) || full_res > zig_maxInt(u64, bits); |
| 377 | 373 | #else |
| ... | ... | @@ -387,14 +383,14 @@ static inline void zig_vaddo_u64(zig_u8 *ov, zig_u64 *res, int n, |
| 387 | 383 | } |
| 388 | 384 | |
| 389 | 385 | zig_extern zig_i64 __addodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow); |
| 390 | | static inline zig_bool zig_addo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 386 | static inline bool zig_addo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 391 | 387 | #if zig_has_builtin(add_overflow) |
| 392 | 388 | zig_i64 full_res; |
| 393 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 389 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 394 | 390 | #else |
| 395 | 391 | zig_c_int overflow_int; |
| 396 | 392 | zig_u64 full_res = __addodi4(lhs, rhs, &overflow_int); |
| 397 | | zig_bool overflow = overflow_int != 0; |
| 393 | bool overflow = overflow_int != 0; |
| 398 | 394 | #endif |
| 399 | 395 | *res = zig_wrap_i64(full_res, bits); |
| 400 | 396 | return overflow || full_res < zig_minInt(i64, bits) || full_res > zig_maxInt(i64, bits); |
| ... | ... | @@ -406,10 +402,10 @@ static inline void zig_vaddo_i64(zig_u8 *ov, zig_i64 *res, int n, |
| 406 | 402 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_i64(&res[i], lhs[i], rhs[i], bits); |
| 407 | 403 | } |
| 408 | 404 | |
| 409 | | static inline zig_bool zig_addo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 405 | static inline bool zig_addo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 410 | 406 | #if zig_has_builtin(add_overflow) |
| 411 | 407 | zig_u8 full_res; |
| 412 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 408 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 413 | 409 | *res = zig_wrap_u8(full_res, bits); |
| 414 | 410 | return overflow || full_res < zig_minInt(u8, bits) || full_res > zig_maxInt(u8, bits); |
| 415 | 411 | #else |
| ... | ... | @@ -423,10 +419,10 @@ static inline void zig_vaddo_u8(zig_u8 *ov, zig_u8 *res, int n, |
| 423 | 419 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_u8(&res[i], lhs[i], rhs[i], bits); |
| 424 | 420 | } |
| 425 | 421 | |
| 426 | | static inline zig_bool zig_addo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 422 | static inline bool zig_addo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 427 | 423 | #if zig_has_builtin(add_overflow) |
| 428 | 424 | zig_i8 full_res; |
| 429 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 425 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 430 | 426 | *res = zig_wrap_i8(full_res, bits); |
| 431 | 427 | return overflow || full_res < zig_minInt(i8, bits) || full_res > zig_maxInt(i8, bits); |
| 432 | 428 | #else |
| ... | ... | @@ -440,10 +436,10 @@ static inline void zig_vaddo_i8(zig_u8 *ov, zig_i8 *res, int n, |
| 440 | 436 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_i8(&res[i], lhs[i], rhs[i], bits); |
| 441 | 437 | } |
| 442 | 438 | |
| 443 | | static inline zig_bool zig_addo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 439 | static inline bool zig_addo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 444 | 440 | #if zig_has_builtin(add_overflow) |
| 445 | 441 | zig_u16 full_res; |
| 446 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 442 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 447 | 443 | *res = zig_wrap_u16(full_res, bits); |
| 448 | 444 | return overflow || full_res < zig_minInt(u16, bits) || full_res > zig_maxInt(u16, bits); |
| 449 | 445 | #else |
| ... | ... | @@ -457,10 +453,10 @@ static inline void zig_vaddo_u16(zig_u8 *ov, zig_u16 *res, int n, |
| 457 | 453 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_u16(&res[i], lhs[i], rhs[i], bits); |
| 458 | 454 | } |
| 459 | 455 | |
| 460 | | static inline zig_bool zig_addo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 456 | static inline bool zig_addo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 461 | 457 | #if zig_has_builtin(add_overflow) |
| 462 | 458 | zig_i16 full_res; |
| 463 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 459 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 464 | 460 | *res = zig_wrap_i16(full_res, bits); |
| 465 | 461 | return overflow || full_res < zig_minInt(i16, bits) || full_res > zig_maxInt(i16, bits); |
| 466 | 462 | #else |
| ... | ... | @@ -474,10 +470,10 @@ static inline void zig_vaddo_i16(zig_u8 *ov, zig_i16 *res, int n, |
| 474 | 470 | for (int i = 0; i < n; ++i) ov[i] = zig_addo_i16(&res[i], lhs[i], rhs[i], bits); |
| 475 | 471 | } |
| 476 | 472 | |
| 477 | | static inline zig_bool zig_subo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 473 | static inline bool zig_subo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 478 | 474 | #if zig_has_builtin(sub_overflow) |
| 479 | 475 | zig_u32 full_res; |
| 480 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 476 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 481 | 477 | *res = zig_wrap_u32(full_res, bits); |
| 482 | 478 | return overflow || full_res < zig_minInt(u32, bits) || full_res > zig_maxInt(u32, bits); |
| 483 | 479 | #else |
| ... | ... | @@ -493,14 +489,14 @@ static inline void zig_vsubo_u32(zig_u8 *ov, zig_u32 *res, int n, |
| 493 | 489 | } |
| 494 | 490 | |
| 495 | 491 | zig_extern zig_i32 __subosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow); |
| 496 | | static inline zig_bool zig_subo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 492 | static inline bool zig_subo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 497 | 493 | #if zig_has_builtin(sub_overflow) |
| 498 | 494 | zig_i32 full_res; |
| 499 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 495 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 500 | 496 | #else |
| 501 | 497 | zig_c_int overflow_int; |
| 502 | 498 | zig_u32 full_res = __subosi4(lhs, rhs, &overflow_int); |
| 503 | | zig_bool overflow = overflow_int != 0; |
| 499 | bool overflow = overflow_int != 0; |
| 504 | 500 | #endif |
| 505 | 501 | *res = zig_wrap_i32(full_res, bits); |
| 506 | 502 | return overflow || full_res < zig_minInt(i32, bits) || full_res > zig_maxInt(i32, bits); |
| ... | ... | @@ -512,10 +508,10 @@ static inline void zig_vsubo_i32(zig_u8 *ov, zig_i32 *res, int n, |
| 512 | 508 | for (int i = 0; i < n; ++i) ov[i] = zig_subo_i32(&res[i], lhs[i], rhs[i], bits); |
| 513 | 509 | } |
| 514 | 510 | |
| 515 | | static inline zig_bool zig_subo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 511 | static inline bool zig_subo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 516 | 512 | #if zig_has_builtin(sub_overflow) |
| 517 | 513 | zig_u64 full_res; |
| 518 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 514 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 519 | 515 | *res = zig_wrap_u64(full_res, bits); |
| 520 | 516 | return overflow || full_res < zig_minInt(u64, bits) || full_res > zig_maxInt(u64, bits); |
| 521 | 517 | #else |
| ... | ... | @@ -531,14 +527,14 @@ static inline void zig_vsubo_u64(zig_u8 *ov, zig_u64 *res, int n, |
| 531 | 527 | } |
| 532 | 528 | |
| 533 | 529 | zig_extern zig_i64 __subodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow); |
| 534 | | static inline zig_bool zig_subo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 530 | static inline bool zig_subo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 535 | 531 | #if zig_has_builtin(sub_overflow) |
| 536 | 532 | zig_i64 full_res; |
| 537 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 533 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 538 | 534 | #else |
| 539 | 535 | zig_c_int overflow_int; |
| 540 | 536 | zig_u64 full_res = __subodi4(lhs, rhs, &overflow_int); |
| 541 | | zig_bool overflow = overflow_int != 0; |
| 537 | bool overflow = overflow_int != 0; |
| 542 | 538 | #endif |
| 543 | 539 | *res = zig_wrap_i64(full_res, bits); |
| 544 | 540 | return overflow || full_res < zig_minInt(i64, bits) || full_res > zig_maxInt(i64, bits); |
| ... | ... | @@ -550,10 +546,10 @@ static inline void zig_vsubo_i64(zig_u8 *ov, zig_i64 *res, int n, |
| 550 | 546 | for (int i = 0; i < n; ++i) ov[i] = zig_subo_i64(&res[i], lhs[i], rhs[i], bits); |
| 551 | 547 | } |
| 552 | 548 | |
| 553 | | static inline zig_bool zig_subo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 549 | static inline bool zig_subo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 554 | 550 | #if zig_has_builtin(sub_overflow) |
| 555 | 551 | zig_u8 full_res; |
| 556 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 552 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 557 | 553 | *res = zig_wrap_u8(full_res, bits); |
| 558 | 554 | return overflow || full_res < zig_minInt(u8, bits) || full_res > zig_maxInt(u8, bits); |
| 559 | 555 | #else |
| ... | ... | @@ -567,10 +563,10 @@ static inline void zig_vsubo_u8(zig_u8 *ov, zig_u8 *res, int n, |
| 567 | 563 | for (int i = 0; i < n; ++i) ov[i] = zig_subo_u8(&res[i], lhs[i], rhs[i], bits); |
| 568 | 564 | } |
| 569 | 565 | |
| 570 | | static inline zig_bool zig_subo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 566 | static inline bool zig_subo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 571 | 567 | #if zig_has_builtin(sub_overflow) |
| 572 | 568 | zig_i8 full_res; |
| 573 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 569 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 574 | 570 | *res = zig_wrap_i8(full_res, bits); |
| 575 | 571 | return overflow || full_res < zig_minInt(i8, bits) || full_res > zig_maxInt(i8, bits); |
| 576 | 572 | #else |
| ... | ... | @@ -585,10 +581,10 @@ static inline void zig_vsubo_i8(zig_u8 *ov, zig_i8 *res, int n, |
| 585 | 581 | } |
| 586 | 582 | |
| 587 | 583 | |
| 588 | | static inline zig_bool zig_subo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 584 | static inline bool zig_subo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 589 | 585 | #if zig_has_builtin(sub_overflow) |
| 590 | 586 | zig_u16 full_res; |
| 591 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 587 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 592 | 588 | *res = zig_wrap_u16(full_res, bits); |
| 593 | 589 | return overflow || full_res < zig_minInt(u16, bits) || full_res > zig_maxInt(u16, bits); |
| 594 | 590 | #else |
| ... | ... | @@ -603,10 +599,10 @@ static inline void zig_vsubo_u16(zig_u8 *ov, zig_u16 *res, int n, |
| 603 | 599 | } |
| 604 | 600 | |
| 605 | 601 | |
| 606 | | static inline zig_bool zig_subo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 602 | static inline bool zig_subo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 607 | 603 | #if zig_has_builtin(sub_overflow) |
| 608 | 604 | zig_i16 full_res; |
| 609 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 605 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 610 | 606 | *res = zig_wrap_i16(full_res, bits); |
| 611 | 607 | return overflow || full_res < zig_minInt(i16, bits) || full_res > zig_maxInt(i16, bits); |
| 612 | 608 | #else |
| ... | ... | @@ -620,10 +616,10 @@ static inline void zig_vsubo_i16(zig_u8 *ov, zig_i16 *res, int n, |
| 620 | 616 | for (int i = 0; i < n; ++i) ov[i] = zig_subo_i16(&res[i], lhs[i], rhs[i], bits); |
| 621 | 617 | } |
| 622 | 618 | |
| 623 | | static inline zig_bool zig_mulo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 619 | static inline bool zig_mulo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) { |
| 624 | 620 | #if zig_has_builtin(mul_overflow) |
| 625 | 621 | zig_u32 full_res; |
| 626 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 622 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 627 | 623 | *res = zig_wrap_u32(full_res, bits); |
| 628 | 624 | return overflow || full_res < zig_minInt(u32, bits) || full_res > zig_maxInt(u32, bits); |
| 629 | 625 | #else |
| ... | ... | @@ -639,14 +635,14 @@ static inline void zig_vmulo_u32(zig_u8 *ov, zig_u32 *res, int n, |
| 639 | 635 | } |
| 640 | 636 | |
| 641 | 637 | zig_extern zig_i32 __mulosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow); |
| 642 | | static inline zig_bool zig_mulo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 638 | static inline bool zig_mulo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) { |
| 643 | 639 | #if zig_has_builtin(mul_overflow) |
| 644 | 640 | zig_i32 full_res; |
| 645 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 641 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 646 | 642 | #else |
| 647 | 643 | zig_c_int overflow_int; |
| 648 | 644 | zig_u32 full_res = __mulosi4(lhs, rhs, &overflow_int); |
| 649 | | zig_bool overflow = overflow_int != 0; |
| 645 | bool overflow = overflow_int != 0; |
| 650 | 646 | #endif |
| 651 | 647 | *res = zig_wrap_i32(full_res, bits); |
| 652 | 648 | return overflow || full_res < zig_minInt(i32, bits) || full_res > zig_maxInt(i32, bits); |
| ... | ... | @@ -658,10 +654,10 @@ static inline void zig_vmulo_i32(zig_u8 *ov, zig_i32 *res, int n, |
| 658 | 654 | for (int i = 0; i < n; ++i) ov[i] = zig_mulo_i32(&res[i], lhs[i], rhs[i], bits); |
| 659 | 655 | } |
| 660 | 656 | |
| 661 | | static inline zig_bool zig_mulo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 657 | static inline bool zig_mulo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) { |
| 662 | 658 | #if zig_has_builtin(mul_overflow) |
| 663 | 659 | zig_u64 full_res; |
| 664 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 660 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 665 | 661 | *res = zig_wrap_u64(full_res, bits); |
| 666 | 662 | return overflow || full_res < zig_minInt(u64, bits) || full_res > zig_maxInt(u64, bits); |
| 667 | 663 | #else |
| ... | ... | @@ -677,14 +673,14 @@ static inline void zig_vmulo_u64(zig_u8 *ov, zig_u64 *res, int n, |
| 677 | 673 | } |
| 678 | 674 | |
| 679 | 675 | zig_extern zig_i64 __mulodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow); |
| 680 | | static inline zig_bool zig_mulo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 676 | static inline bool zig_mulo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) { |
| 681 | 677 | #if zig_has_builtin(mul_overflow) |
| 682 | 678 | zig_i64 full_res; |
| 683 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 679 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 684 | 680 | #else |
| 685 | 681 | zig_c_int overflow_int; |
| 686 | 682 | zig_u64 full_res = __mulodi4(lhs, rhs, &overflow_int); |
| 687 | | zig_bool overflow = overflow_int != 0; |
| 683 | bool overflow = overflow_int != 0; |
| 688 | 684 | #endif |
| 689 | 685 | *res = zig_wrap_i64(full_res, bits); |
| 690 | 686 | return overflow || full_res < zig_minInt(i64, bits) || full_res > zig_maxInt(i64, bits); |
| ... | ... | @@ -696,10 +692,10 @@ static inline void zig_vmulo_i64(zig_u8 *ov, zig_i64 *res, int n, |
| 696 | 692 | for (int i = 0; i < n; ++i) ov[i] = zig_mulo_i64(&res[i], lhs[i], rhs[i], bits); |
| 697 | 693 | } |
| 698 | 694 | |
| 699 | | static inline zig_bool zig_mulo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 695 | static inline bool zig_mulo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) { |
| 700 | 696 | #if zig_has_builtin(mul_overflow) |
| 701 | 697 | zig_u8 full_res; |
| 702 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 698 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 703 | 699 | *res = zig_wrap_u8(full_res, bits); |
| 704 | 700 | return overflow || full_res < zig_minInt(u8, bits) || full_res > zig_maxInt(u8, bits); |
| 705 | 701 | #else |
| ... | ... | @@ -713,10 +709,10 @@ static inline void zig_vmulo_u8(zig_u8 *ov, zig_u8 *res, int n, |
| 713 | 709 | for (int i = 0; i < n; ++i) ov[i] = zig_mulo_u8(&res[i], lhs[i], rhs[i], bits); |
| 714 | 710 | } |
| 715 | 711 | |
| 716 | | static inline zig_bool zig_mulo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 712 | static inline bool zig_mulo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) { |
| 717 | 713 | #if zig_has_builtin(mul_overflow) |
| 718 | 714 | zig_i8 full_res; |
| 719 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 715 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 720 | 716 | *res = zig_wrap_i8(full_res, bits); |
| 721 | 717 | return overflow || full_res < zig_minInt(i8, bits) || full_res > zig_maxInt(i8, bits); |
| 722 | 718 | #else |
| ... | ... | @@ -730,10 +726,10 @@ static inline void zig_vmulo_i8(zig_u8 *ov, zig_i8 *res, int n, |
| 730 | 726 | for (int i = 0; i < n; ++i) ov[i] = zig_mulo_i8(&res[i], lhs[i], rhs[i], bits); |
| 731 | 727 | } |
| 732 | 728 | |
| 733 | | static inline zig_bool zig_mulo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 729 | static inline bool zig_mulo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) { |
| 734 | 730 | #if zig_has_builtin(mul_overflow) |
| 735 | 731 | zig_u16 full_res; |
| 736 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 732 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 737 | 733 | *res = zig_wrap_u16(full_res, bits); |
| 738 | 734 | return overflow || full_res < zig_minInt(u16, bits) || full_res > zig_maxInt(u16, bits); |
| 739 | 735 | #else |
| ... | ... | @@ -747,10 +743,10 @@ static inline void zig_vmulo_u16(zig_u8 *ov, zig_u16 *res, int n, |
| 747 | 743 | for (int i = 0; i < n; ++i) ov[i] = zig_mulo_u16(&res[i], lhs[i], rhs[i], bits); |
| 748 | 744 | } |
| 749 | 745 | |
| 750 | | static inline zig_bool zig_mulo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 746 | static inline bool zig_mulo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) { |
| 751 | 747 | #if zig_has_builtin(mul_overflow) |
| 752 | 748 | zig_i16 full_res; |
| 753 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 749 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 754 | 750 | *res = zig_wrap_i16(full_res, bits); |
| 755 | 751 | return overflow || full_res < zig_minInt(i16, bits) || full_res > zig_maxInt(i16, bits); |
| 756 | 752 | #else |
| ... | ... | @@ -797,12 +793,12 @@ static inline void zig_vmulo_i16(zig_u8 *ov, zig_i16 *res, int n, |
| 797 | 793 | return zig_wrap_i##w((zig_i##w)((zig_u##w)lhs * (zig_u##w)rhs), bits); \ |
| 798 | 794 | } \ |
| 799 | 795 | \ |
| 800 | | static inline zig_bool zig_shlo_u##w(zig_u##w *res, zig_u##w lhs, zig_u8 rhs, zig_u8 bits) { \ |
| 796 | static inline bool zig_shlo_u##w(zig_u##w *res, zig_u##w lhs, zig_u8 rhs, zig_u8 bits) { \ |
| 801 | 797 | *res = zig_shlw_u##w(lhs, rhs, bits); \ |
| 802 | 798 | return (lhs & zig_maxInt_u##w << (bits - rhs)) != zig_as_u##w(0); \ |
| 803 | 799 | } \ |
| 804 | 800 | \ |
| 805 | | static inline zig_bool zig_shlo_i##w(zig_i##w *res, zig_i##w lhs, zig_u8 rhs, zig_u8 bits) { \ |
| 801 | static inline bool zig_shlo_i##w(zig_i##w *res, zig_i##w lhs, zig_u8 rhs, zig_u8 bits) { \ |
| 806 | 802 | *res = zig_shlw_i##w(lhs, rhs, bits); \ |
| 807 | 803 | zig_i##w mask = (zig_i##w)(zig_maxInt_u##w << (bits - rhs - 1)); \ |
| 808 | 804 | return (lhs & mask) != zig_as_i##w(0) && (lhs & mask) != mask; \ |
| ... | ... | @@ -1327,22 +1323,22 @@ static inline zig_i128 zig_mulw_i128(zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1327 | 1323 | |
| 1328 | 1324 | #if zig_has_int128 |
| 1329 | 1325 | |
| 1330 | | static inline zig_bool zig_shlo_u128(zig_u128 *res, zig_u128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1326 | static inline bool zig_shlo_u128(zig_u128 *res, zig_u128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1331 | 1327 | *res = zig_shlw_u128(lhs, rhs, bits); |
| 1332 | 1328 | return zig_and_u128(lhs, zig_shl_u128(zig_maxInt_u128, bits - rhs)) != zig_as_u128(0, 0); |
| 1333 | 1329 | } |
| 1334 | 1330 | |
| 1335 | | static inline zig_bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1331 | static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1336 | 1332 | *res = zig_shlw_i128(lhs, rhs, bits); |
| 1337 | 1333 | zig_i128 mask = zig_bitcast_i128(zig_shl_u128(zig_maxInt_u128, bits - rhs - zig_as_u8(1))); |
| 1338 | 1334 | return zig_cmp_i128(zig_and_i128(lhs, mask), zig_as_i128(0, 0)) != zig_as_i32(0) && |
| 1339 | 1335 | zig_cmp_i128(zig_and_i128(lhs, mask), mask) != zig_as_i32(0); |
| 1340 | 1336 | } |
| 1341 | 1337 | |
| 1342 | | static inline zig_bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1338 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1343 | 1339 | #if zig_has_builtin(add_overflow) |
| 1344 | 1340 | zig_u128 full_res; |
| 1345 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 1341 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 1346 | 1342 | *res = zig_wrap_u128(full_res, bits); |
| 1347 | 1343 | return overflow || full_res < zig_minInt(u128, bits) || full_res > zig_maxInt(u128, bits); |
| 1348 | 1344 | #else |
| ... | ... | @@ -1352,23 +1348,23 @@ static inline zig_bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, |
| 1352 | 1348 | } |
| 1353 | 1349 | |
| 1354 | 1350 | zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1355 | | static inline zig_bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1351 | static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1356 | 1352 | #if zig_has_builtin(add_overflow) |
| 1357 | 1353 | zig_i128 full_res; |
| 1358 | | zig_bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 1354 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 1359 | 1355 | #else |
| 1360 | 1356 | zig_c_int overflow_int; |
| 1361 | 1357 | zig_i128 full_res = __addoti4(lhs, rhs, &overflow_int); |
| 1362 | | zig_bool overflow = overflow_int != 0; |
| 1358 | bool overflow = overflow_int != 0; |
| 1363 | 1359 | #endif |
| 1364 | 1360 | *res = zig_wrap_i128(full_res, bits); |
| 1365 | 1361 | return overflow || full_res < zig_minInt(i128, bits) || full_res > zig_maxInt(i128, bits); |
| 1366 | 1362 | } |
| 1367 | 1363 | |
| 1368 | | static inline zig_bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1364 | static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1369 | 1365 | #if zig_has_builtin(sub_overflow) |
| 1370 | 1366 | zig_u128 full_res; |
| 1371 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 1367 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 1372 | 1368 | *res = zig_wrap_u128(full_res, bits); |
| 1373 | 1369 | return overflow || full_res < zig_minInt(u128, bits) || full_res > zig_maxInt(u128, bits); |
| 1374 | 1370 | #else |
| ... | ... | @@ -1378,23 +1374,23 @@ static inline zig_bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, |
| 1378 | 1374 | } |
| 1379 | 1375 | |
| 1380 | 1376 | zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1381 | | static inline zig_bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1377 | static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1382 | 1378 | #if zig_has_builtin(sub_overflow) |
| 1383 | 1379 | zig_i128 full_res; |
| 1384 | | zig_bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 1380 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 1385 | 1381 | #else |
| 1386 | 1382 | zig_c_int overflow_int; |
| 1387 | 1383 | zig_i128 full_res = __suboti4(lhs, rhs, &overflow_int); |
| 1388 | | zig_bool overflow = overflow_int != 0; |
| 1384 | bool overflow = overflow_int != 0; |
| 1389 | 1385 | #endif |
| 1390 | 1386 | *res = zig_wrap_i128(full_res, bits); |
| 1391 | 1387 | return overflow || full_res < zig_minInt(i128, bits) || full_res > zig_maxInt(i128, bits); |
| 1392 | 1388 | } |
| 1393 | 1389 | |
| 1394 | | static inline zig_bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1390 | static inline bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1395 | 1391 | #if zig_has_builtin(mul_overflow) |
| 1396 | 1392 | zig_u128 full_res; |
| 1397 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 1393 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 1398 | 1394 | *res = zig_wrap_u128(full_res, bits); |
| 1399 | 1395 | return overflow || full_res < zig_minInt(u128, bits) || full_res > zig_maxInt(u128, bits); |
| 1400 | 1396 | #else |
| ... | ... | @@ -1404,14 +1400,14 @@ static inline zig_bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, |
| 1404 | 1400 | } |
| 1405 | 1401 | |
| 1406 | 1402 | zig_extern zig_i128 __muloti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1407 | | static inline zig_bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1403 | static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1408 | 1404 | #if zig_has_builtin(mul_overflow) |
| 1409 | 1405 | zig_i128 full_res; |
| 1410 | | zig_bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 1406 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| 1411 | 1407 | #else |
| 1412 | 1408 | zig_c_int overflow_int; |
| 1413 | 1409 | zig_i128 full_res = __muloti4(lhs, rhs, &overflow); |
| 1414 | | zig_bool overflow = overflow_int != 0; |
| 1410 | bool overflow = overflow_int != 0; |
| 1415 | 1411 | #endif |
| 1416 | 1412 | *res = zig_wrap_i128(full_res, bits); |
| 1417 | 1413 | return overflow || full_res < zig_minInt(i128, bits) || full_res > zig_maxInt(i128, bits); |
| ... | ... | @@ -1419,12 +1415,12 @@ static inline zig_bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, |
| 1419 | 1415 | |
| 1420 | 1416 | #else /* zig_has_int128 */ |
| 1421 | 1417 | |
| 1422 | | static inline zig_bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { |
| 1418 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { |
| 1423 | 1419 | return zig_addo_u64(&res->hi, lhs.hi, rhs.hi, UINT64_MAX) | |
| 1424 | 1420 | zig_addo_u64(&res->hi, res->hi, zig_addo_u64(&res->lo, lhs.lo, rhs.lo, UINT64_MAX)); |
| 1425 | 1421 | } |
| 1426 | 1422 | |
| 1427 | | static inline zig_bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { |
| 1423 | static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { |
| 1428 | 1424 | return zig_subo_u64(&res->hi, lhs.hi, rhs.hi, UINT64_MAX) | |
| 1429 | 1425 | zig_subo_u64(&res->hi, res->hi, zig_subo_u64(&res->lo, lhs.lo, rhs.lo, UINT64_MAX)); |
| 1430 | 1426 | } |