| ... | @@ -79,6 +79,9 @@ | ... | @@ -79,6 +79,9 @@ |
| 79 | #elif defined(__I86__) | 79 | #elif defined(__I86__) |
| 80 | #define zig_x86_16 | 80 | #define zig_x86_16 |
| 81 | #define zig_x86 | 81 | #define zig_x86 |
| | 82 | #elif defined (__ez80) |
| | 83 | #define zig_ez80 |
| | 84 | #define zig_z80 |
| 82 | #endif | 85 | #endif |
| 83 | | 86 | |
| 84 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | 87 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| ... | @@ -409,6 +412,8 @@ | ... | @@ -409,6 +412,8 @@ |
| 409 | #define zig_trap() __asm__ volatile("int $0x3") | 412 | #define zig_trap() __asm__ volatile("int $0x3") |
| 410 | #elif defined(zig_x86) | 413 | #elif defined(zig_x86) |
| 411 | #define zig_trap() __asm__ volatile("ud2") | 414 | #define zig_trap() __asm__ volatile("ud2") |
| | 415 | #elif defined(zig_z80) |
| | 416 | #define zig_trap() __asm__ volatile("rst 00h") |
| 412 | #else | 417 | #else |
| 413 | #define zig_trap() zig_trap_unavailable | 418 | #define zig_trap() zig_trap_unavailable |
| 414 | #endif | 419 | #endif |
| ... | @@ -511,7 +516,7 @@ zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); | ... | @@ -511,7 +516,7 @@ zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); |
| 511 | zig_extern void *memset (void *, int, size_t); | 516 | zig_extern void *memset (void *, int, size_t); |
| 512 | zig_extern void *memmove (void *, void const *, size_t); | 517 | zig_extern void *memmove (void *, void const *, size_t); |
| 513 | | 518 | |
| 514 | /* ================ Bool and 8/16/32/64-bit Integer Support ================= */ | 519 | /* ================ Bool and 8/16/24/32/48/64-bit Integer Support ================= */ |
| 515 | | 520 | |
| 516 | #include <limits.h> | 521 | #include <limits.h> |
| 517 | | 522 | |
| ... | @@ -590,6 +595,16 @@ typedef signed long long int16_t; | ... | @@ -590,6 +595,16 @@ typedef signed long long int16_t; |
| 590 | #define INT16_MAX ( INT16_C(0x7FFF)) | 595 | #define INT16_MAX ( INT16_C(0x7FFF)) |
| 591 | #define UINT16_MAX ( INT16_C(0xFFFF)) | 596 | #define UINT16_MAX ( INT16_C(0xFFFF)) |
| 592 | | 597 | |
| | 598 | #if defined(zig_ez80) |
| | 599 | typedef unsigned int uint24_t; |
| | 600 | typedef signed int int24_t; |
| | 601 | #define INT24_C(c) c |
| | 602 | #define UINT24_C(c) c##U |
| | 603 | #endif |
| | 604 | #define INT24_MIN (~INT24_C(0x7FFF)) |
| | 605 | #define INT24_MAX ( INT24_C(0x7FFF)) |
| | 606 | #define UINT24_MAX ( INT24_C(0xFFFF)) |
| | 607 | |
| 593 | #if SCHAR_MIN == ~0x7FFFFFFF && SCHAR_MAX == 0x7FFFFFFF && UCHAR_MAX == 0xFFFFFFFF | 608 | #if SCHAR_MIN == ~0x7FFFFFFF && SCHAR_MAX == 0x7FFFFFFF && UCHAR_MAX == 0xFFFFFFFF |
| 594 | typedef unsigned char uint32_t; | 609 | typedef unsigned char uint32_t; |
| 595 | typedef signed char int32_t; | 610 | typedef signed char int32_t; |
| ... | @@ -620,6 +635,17 @@ typedef signed long long int32_t; | ... | @@ -620,6 +635,17 @@ typedef signed long long int32_t; |
| 620 | #define INT32_MAX ( INT32_C(0x7FFFFFFF)) | 635 | #define INT32_MAX ( INT32_C(0x7FFFFFFF)) |
| 621 | #define UINT32_MAX ( INT32_C(0xFFFFFFFF)) | 636 | #define UINT32_MAX ( INT32_C(0xFFFFFFFF)) |
| 622 | | 637 | |
| | 638 | #if defined(zig_ez80) |
| | 639 | typedef unsigned __int48 uint48_t; |
| | 640 | typedef signed __int48 int48_t; |
| | 641 | #define INT48_C(c) c |
| | 642 | /* no suffix */ |
| | 643 | #define UINT48_C(c) ((uint48_t)(c)) |
| | 644 | #endif |
| | 645 | #define INT48_MIN (~INT48_C(0x7FFFFFFFFFFF)) |
| | 646 | #define INT48_MAX ( INT48_C(0x7FFFFFFFFFFF)) |
| | 647 | #define UINT48_MAX ( INT48_C(0xFFFFFFFFFFFF)) |
| | 648 | |
| 623 | #if SCHAR_MIN == ~0x7FFFFFFFFFFFFFFF && SCHAR_MAX == 0x7FFFFFFFFFFFFFFF && UCHAR_MAX == 0xFFFFFFFFFFFFFFFF | 649 | #if SCHAR_MIN == ~0x7FFFFFFFFFFFFFFF && SCHAR_MAX == 0x7FFFFFFFFFFFFFFF && UCHAR_MAX == 0xFFFFFFFFFFFFFFFF |
| 624 | typedef unsigned char uint64_t; | 650 | typedef unsigned char uint64_t; |
| 625 | typedef signed char int64_t; | 651 | typedef signed char int64_t; |
| ... | @@ -663,10 +689,18 @@ typedef ptrdiff_t intptr_t; | ... | @@ -663,10 +689,18 @@ typedef ptrdiff_t intptr_t; |
| 663 | #define zig_maxInt_i16 INT16_MAX | 689 | #define zig_maxInt_i16 INT16_MAX |
| 664 | #define zig_minInt_u16 UINT16_C(0) | 690 | #define zig_minInt_u16 UINT16_C(0) |
| 665 | #define zig_maxInt_u16 UINT16_MAX | 691 | #define zig_maxInt_u16 UINT16_MAX |
| | 692 | #define zig_minInt_i24 INT24_MIN |
| | 693 | #define zig_maxInt_i24 INT24_MAX |
| | 694 | #define zig_minInt_u24 UINT24_C(0) |
| | 695 | #define zig_maxInt_u24 UINT24_MAX |
| 666 | #define zig_minInt_i32 INT32_MIN | 696 | #define zig_minInt_i32 INT32_MIN |
| 667 | #define zig_maxInt_i32 INT32_MAX | 697 | #define zig_maxInt_i32 INT32_MAX |
| 668 | #define zig_minInt_u32 UINT32_C(0) | 698 | #define zig_minInt_u32 UINT32_C(0) |
| 669 | #define zig_maxInt_u32 UINT32_MAX | 699 | #define zig_maxInt_u32 UINT32_MAX |
| | 700 | #define zig_minInt_i48 INT48_MIN |
| | 701 | #define zig_maxInt_i48 INT48_MAX |
| | 702 | #define zig_minInt_u48 UINT48_C(0) |
| | 703 | #define zig_maxInt_u48 UINT48_MAX |
| 670 | #define zig_minInt_i64 INT64_MIN | 704 | #define zig_minInt_i64 INT64_MIN |
| 671 | #define zig_maxInt_i64 INT64_MAX | 705 | #define zig_maxInt_i64 INT64_MAX |
| 672 | #define zig_minInt_u64 UINT64_C(0) | 706 | #define zig_minInt_u64 UINT64_C(0) |
| ... | @@ -786,6 +820,17 @@ zig_int_helpers(16, unsigned long long) | ... | @@ -786,6 +820,17 @@ zig_int_helpers(16, unsigned long long) |
| 786 | #else | 820 | #else |
| 787 | zig_int_helpers(16, uint16_t) | 821 | zig_int_helpers(16, uint16_t) |
| 788 | #endif | 822 | #endif |
| | 823 | #if defined(zig_ez80) |
| | 824 | #if UINT24_MAX <= UINT_MAX |
| | 825 | zig_int_helpers(24, unsigned int) |
| | 826 | #elif UINT24_MAX <= ULONG_MAX |
| | 827 | zig_int_helpers(24, unsigned long) |
| | 828 | #elif UINT24_MAX <= ULLONG_MAX |
| | 829 | zig_int_helpers(24, unsigned long long) |
| | 830 | #else |
| | 831 | zig_int_helpers(24, uint24_t) |
| | 832 | #endif |
| | 833 | #endif |
| 789 | #if UINT32_MAX <= UINT_MAX | 834 | #if UINT32_MAX <= UINT_MAX |
| 790 | zig_int_helpers(32, unsigned int) | 835 | zig_int_helpers(32, unsigned int) |
| 791 | #elif UINT32_MAX <= ULONG_MAX | 836 | #elif UINT32_MAX <= ULONG_MAX |
| ... | @@ -795,6 +840,17 @@ zig_int_helpers(32, unsigned long long) | ... | @@ -795,6 +840,17 @@ zig_int_helpers(32, unsigned long long) |
| 795 | #else | 840 | #else |
| 796 | zig_int_helpers(32, uint32_t) | 841 | zig_int_helpers(32, uint32_t) |
| 797 | #endif | 842 | #endif |
| | 843 | #if defined(zig_ez80) |
| | 844 | #if UINT24_MAX <= UINT_MAX |
| | 845 | zig_int_helpers(48, unsigned int) |
| | 846 | #elif UINT24_MAX <= ULONG_MAX |
| | 847 | zig_int_helpers(48, unsigned long) |
| | 848 | #elif UINT24_MAX <= ULLONG_MAX |
| | 849 | zig_int_helpers(48, unsigned long long) |
| | 850 | #else |
| | 851 | zig_int_helpers(48, uint48_t) |
| | 852 | #endif |
| | 853 | #endif |
| 798 | #if UINT64_MAX <= UINT_MAX | 854 | #if UINT64_MAX <= UINT_MAX |
| 799 | zig_int_helpers(64, unsigned int) | 855 | zig_int_helpers(64, unsigned int) |
| 800 | #elif UINT64_MAX <= ULONG_MAX | 856 | #elif UINT64_MAX <= ULONG_MAX |
| ... | @@ -909,6 +965,66 @@ static inline bool zig_addo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t | ... | @@ -909,6 +965,66 @@ static inline bool zig_addo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t |
| 909 | #endif | 965 | #endif |
| 910 | } | 966 | } |
| 911 | | 967 | |
| | 968 | #if defined(zig_ez80) |
| | 969 | static inline bool zig_addo_u24(uint24_t *res, uint24_t lhs, uint24_t rhs, uint8_t bits) { |
| | 970 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| | 971 | uint24_t full_res; |
| | 972 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| | 973 | *res = zig_wrap_u24(full_res, bits); |
| | 974 | return overflow || full_res < zig_minInt_u(24, bits) || full_res > zig_maxInt_u(24, bits); |
| | 975 | #else |
| | 976 | uint32_t full_res; |
| | 977 | bool overflow = zig_addo_u32(&full_res, lhs, rhs, bits); |
| | 978 | *res = (uint24_t)full_res; |
| | 979 | return overflow; |
| | 980 | #endif |
| | 981 | } |
| | 982 | |
| | 983 | static inline bool zig_addo_i24(int24_t *res, int24_t lhs, int24_t rhs, uint8_t bits) { |
| | 984 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| | 985 | int24_t full_res; |
| | 986 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| | 987 | *res = zig_wrap_i24(full_res, bits); |
| | 988 | return overflow || full_res < zig_minInt_i(24, bits) || full_res > zig_maxInt_i(24, bits); |
| | 989 | #else |
| | 990 | int32_t full_res; |
| | 991 | bool overflow = zig_addo_i32(&full_res, lhs, rhs, bits); |
| | 992 | *res = (int24_t)full_res; |
| | 993 | return overflow; |
| | 994 | #endif |
| | 995 | } |
| | 996 | #endif |
| | 997 | |
| | 998 | #if defined(zig_ez80) |
| | 999 | static inline bool zig_addo_u48(uint48_t *res, uint48_t lhs, uint48_t rhs, uint8_t bits) { |
| | 1000 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| | 1001 | uint48_t full_res; |
| | 1002 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| | 1003 | *res = zig_wrap_u48(full_res, bits); |
| | 1004 | return overflow || full_res < zig_minInt_u(48, bits) || full_res > zig_maxInt_u(48, bits); |
| | 1005 | #else |
| | 1006 | uint64_t full_res; |
| | 1007 | bool overflow = zig_addo_u64(&full_res, lhs, rhs, bits); |
| | 1008 | *res = (uint48_t)full_res; |
| | 1009 | return overflow; |
| | 1010 | #endif |
| | 1011 | } |
| | 1012 | |
| | 1013 | static inline bool zig_addo_i48(int48_t *res, int48_t lhs, int48_t rhs, uint8_t bits) { |
| | 1014 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| | 1015 | int48_t full_res; |
| | 1016 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| | 1017 | *res = zig_wrap_i48(full_res, bits); |
| | 1018 | return overflow || full_res < zig_minInt_i(48, bits) || full_res > zig_maxInt_i(48, bits); |
| | 1019 | #else |
| | 1020 | int64_t full_res; |
| | 1021 | bool overflow = zig_addo_i64(&full_res, lhs, rhs, bits); |
| | 1022 | *res = (int48_t)full_res; |
| | 1023 | return overflow; |
| | 1024 | #endif |
| | 1025 | } |
| | 1026 | #endif |
| | 1027 | |
| 912 | static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { | 1028 | static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { |
| 913 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) | 1029 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 914 | uint32_t full_res; | 1030 | uint32_t full_res; |
| ... | @@ -933,6 +1049,7 @@ static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t | ... | @@ -933,6 +1049,7 @@ static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t |
| 933 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); | 1049 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); |
| 934 | } | 1050 | } |
| 935 | | 1051 | |
| | 1052 | |
| 936 | static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8_t bits) { | 1053 | static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8_t bits) { |
| 937 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) | 1054 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 938 | uint64_t full_res; | 1055 | uint64_t full_res; |
| ... | @@ -1013,6 +1130,66 @@ static inline bool zig_subo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t | ... | @@ -1013,6 +1130,66 @@ static inline bool zig_subo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t |
| 1013 | #endif | 1130 | #endif |
| 1014 | } | 1131 | } |
| 1015 | | 1132 | |
| | 1133 | #if defined(zig_ez80) |
| | 1134 | static inline bool zig_subo_u24(uint24_t *res, uint24_t lhs, uint24_t rhs, uint8_t bits) { |
| | 1135 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| | 1136 | uint24_t full_res; |
| | 1137 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| | 1138 | *res = zig_wrap_u24(full_res, bits); |
| | 1139 | return overflow || full_res < zig_minInt_u(24, bits) || full_res > zig_maxInt_u(24, bits); |
| | 1140 | #else |
| | 1141 | uint32_t full_res; |
| | 1142 | bool overflow = zig_subo_u32(&full_res, lhs, rhs, bits); |
| | 1143 | *res = (uint24_t)full_res; |
| | 1144 | return overflow; |
| | 1145 | #endif |
| | 1146 | } |
| | 1147 | |
| | 1148 | static inline bool zig_subo_i24(int24_t *res, int24_t lhs, int24_t rhs, uint8_t bits) { |
| | 1149 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| | 1150 | int24_t full_res; |
| | 1151 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| | 1152 | *res = zig_wrap_i24(full_res, bits); |
| | 1153 | return overflow || full_res < zig_minInt_i(24, bits) || full_res > zig_maxInt_i(24, bits); |
| | 1154 | #else |
| | 1155 | int32_t full_res; |
| | 1156 | bool overflow = zig_subo_i32(&full_res, lhs, rhs, bits); |
| | 1157 | *res = (int24_t)full_res; |
| | 1158 | return overflow; |
| | 1159 | #endif |
| | 1160 | } |
| | 1161 | #endif |
| | 1162 | |
| | 1163 | #if defined(zig_ez80) |
| | 1164 | static inline bool zig_subo_u48(uint48_t *res, uint48_t lhs, uint48_t rhs, uint8_t bits) { |
| | 1165 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| | 1166 | uint48_t full_res; |
| | 1167 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| | 1168 | *res = zig_wrap_u48(full_res, bits); |
| | 1169 | return overflow || full_res < zig_minInt_u(48, bits) || full_res > zig_maxInt_u(48, bits); |
| | 1170 | #else |
| | 1171 | uint64_t full_res; |
| | 1172 | bool overflow = zig_subo_u64(&full_res, lhs, rhs, bits); |
| | 1173 | *res = (uint48_t)full_res; |
| | 1174 | return overflow; |
| | 1175 | #endif |
| | 1176 | } |
| | 1177 | |
| | 1178 | static inline bool zig_subo_i48(int48_t *res, int48_t lhs, int48_t rhs, uint8_t bits) { |
| | 1179 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| | 1180 | int48_t full_res; |
| | 1181 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| | 1182 | *res = zig_wrap_i48(full_res, bits); |
| | 1183 | return overflow || full_res < zig_minInt_i(48, bits) || full_res > zig_maxInt_i(48, bits); |
| | 1184 | #else |
| | 1185 | int64_t full_res; |
| | 1186 | bool overflow = zig_subo_i64(&full_res, lhs, rhs, bits); |
| | 1187 | *res = (int48_t)full_res; |
| | 1188 | return overflow; |
| | 1189 | #endif |
| | 1190 | } |
| | 1191 | #endif |
| | 1192 | |
| 1016 | static inline bool zig_mulo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { | 1193 | static inline bool zig_mulo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { |
| 1017 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) | 1194 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| 1018 | uint32_t full_res; | 1195 | uint32_t full_res; |
| ... | @@ -1121,6 +1298,66 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t | ... | @@ -1121,6 +1298,66 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t |
| 1121 | #endif | 1298 | #endif |
| 1122 | } | 1299 | } |
| 1123 | | 1300 | |
| | 1301 | #if defined(zig_ez80) |
| | 1302 | static inline bool zig_mulo_u24(uint24_t *res, uint24_t lhs, uint24_t rhs, uint8_t bits) { |
| | 1303 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| | 1304 | uint24_t full_res; |
| | 1305 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| | 1306 | *res = zig_wrap_u24(full_res, bits); |
| | 1307 | return overflow || full_res < zig_minInt_u(24, bits) || full_res > zig_maxInt_u(24, bits); |
| | 1308 | #else |
| | 1309 | uint32_t full_res; |
| | 1310 | bool overflow = zig_mulo_u32(&full_res, lhs, rhs, bits); |
| | 1311 | *res = (uint24_t)full_res; |
| | 1312 | return overflow; |
| | 1313 | #endif |
| | 1314 | } |
| | 1315 | |
| | 1316 | static inline bool zig_mulo_i24(int24_t *res, int24_t lhs, int24_t rhs, uint8_t bits) { |
| | 1317 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| | 1318 | int24_t full_res; |
| | 1319 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| | 1320 | *res = zig_wrap_i24(full_res, bits); |
| | 1321 | return overflow || full_res < zig_minInt_i(24, bits) || full_res > zig_maxInt_i(24, bits); |
| | 1322 | #else |
| | 1323 | int32_t full_res; |
| | 1324 | bool overflow = zig_mulo_i32(&full_res, lhs, rhs, bits); |
| | 1325 | *res = (int24_t)full_res; |
| | 1326 | return overflow; |
| | 1327 | #endif |
| | 1328 | } |
| | 1329 | #endif |
| | 1330 | |
| | 1331 | #if defined(zig_ez80) |
| | 1332 | static inline bool zig_mulo_u48(uint48_t *res, uint48_t lhs, uint48_t rhs, uint8_t bits) { |
| | 1333 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| | 1334 | uint48_t full_res; |
| | 1335 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| | 1336 | *res = zig_wrap_u48(full_res, bits); |
| | 1337 | return overflow || full_res < zig_minInt_u(48, bits) || full_res > zig_maxInt_u(48, bits); |
| | 1338 | #else |
| | 1339 | uint64_t full_res; |
| | 1340 | bool overflow = zig_mulo_u64(&full_res, lhs, rhs, bits); |
| | 1341 | *res = (uint48_t)full_res; |
| | 1342 | return overflow; |
| | 1343 | #endif |
| | 1344 | } |
| | 1345 | |
| | 1346 | static inline bool zig_mulo_i48(int48_t *res, int48_t lhs, int48_t rhs, uint8_t bits) { |
| | 1347 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| | 1348 | int48_t full_res; |
| | 1349 | bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res); |
| | 1350 | *res = zig_wrap_i48(full_res, bits); |
| | 1351 | return overflow || full_res < zig_minInt_i(48, bits) || full_res > zig_maxInt_i(48, bits); |
| | 1352 | #else |
| | 1353 | int64_t full_res; |
| | 1354 | bool overflow = zig_mulo_i64(&full_res, lhs, rhs, bits); |
| | 1355 | *res = (int48_t)full_res; |
| | 1356 | return overflow; |
| | 1357 | #endif |
| | 1358 | } |
| | 1359 | #endif |
| | 1360 | |
| 1124 | #define zig_int_builtins(w) \ | 1361 | #define zig_int_builtins(w) \ |
| 1125 | static inline bool zig_shlo_u##w(uint##w##_t *res, uint##w##_t lhs, uint8_t rhs, uint8_t bits) { \ | 1362 | static inline bool zig_shlo_u##w(uint##w##_t *res, uint##w##_t lhs, uint8_t rhs, uint8_t bits) { \ |
| 1126 | *res = zig_shlw_u##w(lhs, rhs, bits); \ | 1363 | *res = zig_shlw_u##w(lhs, rhs, bits); \ |
| ... | @@ -1180,7 +1417,13 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t | ... | @@ -1180,7 +1417,13 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t |
| 1180 | } | 1417 | } |
| 1181 | zig_int_builtins(8) | 1418 | zig_int_builtins(8) |
| 1182 | zig_int_builtins(16) | 1419 | zig_int_builtins(16) |
| | 1420 | #if defined(zig_ez80) |
| | 1421 | zig_int_builtins(24) |
| | 1422 | #endif |
| 1183 | zig_int_builtins(32) | 1423 | zig_int_builtins(32) |
| | 1424 | #if defined(zig_ez80) |
| | 1425 | zig_int_builtins(48) |
| | 1426 | #endif |
| 1184 | zig_int_builtins(64) | 1427 | zig_int_builtins(64) |
| 1185 | | 1428 | |
| 1186 | #define zig_builtin8(name, val) __builtin_##name(val) | 1429 | #define zig_builtin8(name, val) __builtin_##name(val) |
| ... | @@ -1189,6 +1432,11 @@ typedef unsigned int zig_Builtin8; | ... | @@ -1189,6 +1432,11 @@ typedef unsigned int zig_Builtin8; |
| 1189 | #define zig_builtin16(name, val) __builtin_##name(val) | 1432 | #define zig_builtin16(name, val) __builtin_##name(val) |
| 1190 | typedef unsigned int zig_Builtin16; | 1433 | typedef unsigned int zig_Builtin16; |
| 1191 | | 1434 | |
| | 1435 | #if defined(zig_ez80) |
| | 1436 | #define zig_builtin24(name, val) __builtin_##name(val) |
| | 1437 | typedef unsigned int zig_Builtin24; |
| | 1438 | #endif |
| | 1439 | |
| 1192 | #if INT_MIN <= INT32_MIN | 1440 | #if INT_MIN <= INT32_MIN |
| 1193 | #define zig_builtin32(name, val) __builtin_##name(val) | 1441 | #define zig_builtin32(name, val) __builtin_##name(val) |
| 1194 | typedef unsigned int zig_Builtin32; | 1442 | typedef unsigned int zig_Builtin32; |
| ... | @@ -1197,6 +1445,11 @@ typedef unsigned int zig_Builtin32; | ... | @@ -1197,6 +1445,11 @@ typedef unsigned int zig_Builtin32; |
| 1197 | typedef unsigned long zig_Builtin32; | 1445 | typedef unsigned long zig_Builtin32; |
| 1198 | #endif | 1446 | #endif |
| 1199 | | 1447 | |
| | 1448 | #if defined(zig_ez80) |
| | 1449 | #define zig_builtin48(name, val) __builtin_##name(val) |
| | 1450 | typedef unsigned long long zig_Builtin48; |
| | 1451 | #endif |
| | 1452 | |
| 1200 | #if INT_MIN <= INT64_MIN | 1453 | #if INT_MIN <= INT64_MIN |
| 1201 | #define zig_builtin64(name, val) __builtin_##name(val) | 1454 | #define zig_builtin64(name, val) __builtin_##name(val) |
| 1202 | typedef unsigned int zig_Builtin64; | 1455 | typedef unsigned int zig_Builtin64; |
| ... | @@ -1231,6 +1484,23 @@ static inline int16_t zig_byte_swap_i16(int16_t val, uint8_t bits) { | ... | @@ -1231,6 +1484,23 @@ static inline int16_t zig_byte_swap_i16(int16_t val, uint8_t bits) { |
| 1231 | return zig_wrap_i16((int16_t)zig_byte_swap_u16((uint16_t)val, bits), bits); | 1484 | return zig_wrap_i16((int16_t)zig_byte_swap_u16((uint16_t)val, bits), bits); |
| 1232 | } | 1485 | } |
| 1233 | | 1486 | |
| | 1487 | #if defined(zig_ez80) |
| | 1488 | static inline uint16_t zig_byte_swap_u24(uint24_t val, uint8_t bits) { |
| | 1489 | uint24_t full_res; |
| | 1490 | #if zig_has_builtin(bswap24) || defined(zig_gcc) |
| | 1491 | full_res = __builtin_bswap24(val); |
| | 1492 | #else |
| | 1493 | full_res = (uint24_t)zig_byte_swap_u8((uint8_t)(val >> 0), 8) << 16 | |
| | 1494 | (uint24_t)zig_byte_swap_u16((uint16_t)(val >> 8), 16) >> 0; |
| | 1495 | #endif |
| | 1496 | return zig_wrap_u24(full_res >> (24 - bits), bits); |
| | 1497 | } |
| | 1498 | |
| | 1499 | static inline int16_t zig_byte_swap_i24(int24_t val, uint8_t bits) { |
| | 1500 | return zig_wrap_i24((int24_t)zig_byte_swap_u24((uint24_t)val, bits), bits); |
| | 1501 | } |
| | 1502 | #endif |
| | 1503 | |
| 1234 | static inline uint32_t zig_byte_swap_u32(uint32_t val, uint8_t bits) { | 1504 | static inline uint32_t zig_byte_swap_u32(uint32_t val, uint8_t bits) { |
| 1235 | uint32_t full_res; | 1505 | uint32_t full_res; |
| 1236 | #if zig_has_builtin(bswap32) || defined(zig_gcc) | 1506 | #if zig_has_builtin(bswap32) || defined(zig_gcc) |
| ... | @@ -1246,6 +1516,23 @@ static inline int32_t zig_byte_swap_i32(int32_t val, uint8_t bits) { | ... | @@ -1246,6 +1516,23 @@ static inline int32_t zig_byte_swap_i32(int32_t val, uint8_t bits) { |
| 1246 | return zig_wrap_i32((int32_t)zig_byte_swap_u32((uint32_t)val, bits), bits); | 1516 | return zig_wrap_i32((int32_t)zig_byte_swap_u32((uint32_t)val, bits), bits); |
| 1247 | } | 1517 | } |
| 1248 | | 1518 | |
| | 1519 | #if defined(zig_ez80) |
| | 1520 | static inline uint32_t zig_byte_swap_u48(uint48_t val, uint8_t bits) { |
| | 1521 | uint48_t full_res; |
| | 1522 | #if zig_has_builtin(bswap48) || defined(zig_gcc) |
| | 1523 | full_res = __builtin_bswap48(val); |
| | 1524 | #else |
| | 1525 | full_res = (uint48_t)zig_byte_swap_u24((uint24_t)(val >> 0), 24) << 24 | |
| | 1526 | (uint48_t)zig_byte_swap_u24((uint24_t)(val >> 24), 24) >> 0; |
| | 1527 | #endif |
| | 1528 | return zig_wrap_u48(full_res >> (48 - bits), bits); |
| | 1529 | } |
| | 1530 | |
| | 1531 | static inline int32_t zig_byte_swap_i48(int48_t val, uint8_t bits) { |
| | 1532 | return zig_wrap_i48((int48_t)zig_byte_swap_u48((uint48_t)val, bits), bits); |
| | 1533 | } |
| | 1534 | #endif |
| | 1535 | |
| 1249 | static inline uint64_t zig_byte_swap_u64(uint64_t val, uint8_t bits) { | 1536 | static inline uint64_t zig_byte_swap_u64(uint64_t val, uint8_t bits) { |
| 1250 | uint64_t full_res; | 1537 | uint64_t full_res; |
| 1251 | #if zig_has_builtin(bswap64) || defined(zig_gcc) | 1538 | #if zig_has_builtin(bswap64) || defined(zig_gcc) |
| ... | @@ -1294,6 +1581,23 @@ static inline int16_t zig_bit_reverse_i16(int16_t val, uint8_t bits) { | ... | @@ -1294,6 +1581,23 @@ static inline int16_t zig_bit_reverse_i16(int16_t val, uint8_t bits) { |
| 1294 | return zig_wrap_i16((int16_t)zig_bit_reverse_u16((uint16_t)val, bits), bits); | 1581 | return zig_wrap_i16((int16_t)zig_bit_reverse_u16((uint16_t)val, bits), bits); |
| 1295 | } | 1582 | } |
| 1296 | | 1583 | |
| | 1584 | #if defined(zig_ez80) |
| | 1585 | static inline uint24_t zig_bit_reverse_u24(uint24_t val, uint8_t bits) { |
| | 1586 | uint24_t full_res; |
| | 1587 | #if zig_has_builtin(bitreverse24) |
| | 1588 | full_res = __builtin_bitreverse24(val); |
| | 1589 | #else |
| | 1590 | full_res = (uint24_t)zig_bit_reverse_u8((uint8_t)(val >> 0), 8) << 16 | |
| | 1591 | (uint24_t)zig_bit_reverse_u16((uint16_t)(val >> 8), 16) >> 0; |
| | 1592 | #endif |
| | 1593 | return zig_wrap_u24(full_res >> (24 - bits), bits); |
| | 1594 | } |
| | 1595 | |
| | 1596 | static inline int24_t zig_bit_reverse_i24(int24_t val, uint8_t bits) { |
| | 1597 | return zig_wrap_i24((int24_t)zig_bit_reverse_u24((uint24_t)val, bits), bits); |
| | 1598 | } |
| | 1599 | #endif |
| | 1600 | |
| 1297 | static inline uint32_t zig_bit_reverse_u32(uint32_t val, uint8_t bits) { | 1601 | static inline uint32_t zig_bit_reverse_u32(uint32_t val, uint8_t bits) { |
| 1298 | uint32_t full_res; | 1602 | uint32_t full_res; |
| 1299 | #if zig_has_builtin(bitreverse32) | 1603 | #if zig_has_builtin(bitreverse32) |
| ... | @@ -1309,6 +1613,23 @@ static inline int32_t zig_bit_reverse_i32(int32_t val, uint8_t bits) { | ... | @@ -1309,6 +1613,23 @@ static inline int32_t zig_bit_reverse_i32(int32_t val, uint8_t bits) { |
| 1309 | return zig_wrap_i32((int32_t)zig_bit_reverse_u32((uint32_t)val, bits), bits); | 1613 | return zig_wrap_i32((int32_t)zig_bit_reverse_u32((uint32_t)val, bits), bits); |
| 1310 | } | 1614 | } |
| 1311 | | 1615 | |
| | 1616 | #if defined(zig_ez80) |
| | 1617 | static inline uint32_t zig_bit_reverse_u48(uint48_t val, uint8_t bits) { |
| | 1618 | uint48_t full_res; |
| | 1619 | #if zig_has_builtin(bitreverse48) |
| | 1620 | full_res = __builtin_bitreverse48(val); |
| | 1621 | #else |
| | 1622 | full_res = (uint48_t)zig_bit_reverse_u24((uint24_t)(val >> 0), 24) << 24 | |
| | 1623 | (uint48_t)zig_bit_reverse_u24((uint24_t)(val >> 24), 24) >> 0; |
| | 1624 | #endif |
| | 1625 | return zig_wrap_u32(full_res >> (48 - bits), bits); |
| | 1626 | } |
| | 1627 | |
| | 1628 | static inline int32_t zig_bit_reverse_i48(int48_t val, uint8_t bits) { |
| | 1629 | return zig_wrap_i48((int48_t)zig_bit_reverse_u48((uint48_t)val, bits), bits); |
| | 1630 | } |
| | 1631 | #endif |
| | 1632 | |
| 1312 | static inline uint64_t zig_bit_reverse_u64(uint64_t val, uint8_t bits) { | 1633 | static inline uint64_t zig_bit_reverse_u64(uint64_t val, uint8_t bits) { |
| 1313 | uint64_t full_res; | 1634 | uint64_t full_res; |
| 1314 | #if zig_has_builtin(bitreverse64) | 1635 | #if zig_has_builtin(bitreverse64) |
| ... | @@ -1350,7 +1671,13 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) { | ... | @@ -1350,7 +1671,13 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) { |
| 1350 | #endif | 1671 | #endif |
| 1351 | zig_builtin_popcount(8) | 1672 | zig_builtin_popcount(8) |
| 1352 | zig_builtin_popcount(16) | 1673 | zig_builtin_popcount(16) |
| | 1674 | #if defined(zig_ez80) |
| | 1675 | zig_builtin_popcount(24) |
| | 1676 | #endif |
| 1353 | zig_builtin_popcount(32) | 1677 | zig_builtin_popcount(32) |
| | 1678 | #if defined(zig_ez80) |
| | 1679 | zig_builtin_popcount(48) |
| | 1680 | #endif |
| 1354 | zig_builtin_popcount(64) | 1681 | zig_builtin_popcount(64) |
| 1355 | | 1682 | |
| 1356 | #define zig_builtin_ctz_common(w) \ | 1683 | #define zig_builtin_ctz_common(w) \ |
| ... | @@ -1375,7 +1702,13 @@ zig_builtin_popcount(64) | ... | @@ -1375,7 +1702,13 @@ zig_builtin_popcount(64) |
| 1375 | #endif | 1702 | #endif |
| 1376 | zig_builtin_ctz(8) | 1703 | zig_builtin_ctz(8) |
| 1377 | zig_builtin_ctz(16) | 1704 | zig_builtin_ctz(16) |
| | 1705 | #if defined(zig_ez80) |
| | 1706 | zig_builtin_ctz(24) |
| | 1707 | #endif |
| 1378 | zig_builtin_ctz(32) | 1708 | zig_builtin_ctz(32) |
| | 1709 | #if defined(zig_ez80) |
| | 1710 | zig_builtin_ctz(48) |
| | 1711 | #endif |
| 1379 | zig_builtin_ctz(64) | 1712 | zig_builtin_ctz(64) |
| 1380 | | 1713 | |
| 1381 | #define zig_builtin_clz_common(w) \ | 1714 | #define zig_builtin_clz_common(w) \ |
| ... | @@ -1400,7 +1733,13 @@ zig_builtin_ctz(64) | ... | @@ -1400,7 +1733,13 @@ zig_builtin_ctz(64) |
| 1400 | #endif | 1733 | #endif |
| 1401 | zig_builtin_clz(8) | 1734 | zig_builtin_clz(8) |
| 1402 | zig_builtin_clz(16) | 1735 | zig_builtin_clz(16) |
| | 1736 | #if defined(zig_ez80) |
| | 1737 | zig_builtin_clz(24) |
| | 1738 | #endif |
| 1403 | zig_builtin_clz(32) | 1739 | zig_builtin_clz(32) |
| | 1740 | #if defined(zig_ez80) |
| | 1741 | zig_builtin_clz(48) |
| | 1742 | #endif |
| 1404 | zig_builtin_clz(64) | 1743 | zig_builtin_clz(64) |
| 1405 | | 1744 | |
| 1406 | /* ======================== 128-bit Integer Support ========================= */ | 1745 | /* ======================== 128-bit Integer Support ========================= */ |
| ... | @@ -1981,6 +2320,20 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, uint8_t bits) { | ... | @@ -1981,6 +2320,20 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, uint8_t bits) { |
| 1981 | return zig_bitCast_i128(zig_bit_reverse_u128(zig_bitCast_u128(val), bits)); | 2320 | return zig_bitCast_i128(zig_bit_reverse_u128(zig_bitCast_u128(val), bits)); |
| 1982 | } | 2321 | } |
| 1983 | | 2322 | |
| | 2323 | #if zig_has_int128 |
| | 2324 | #define zig_switch_int128(operand) switch (operand) |
| | 2325 | #define zig_switch_prong_begin_int128() |
| | 2326 | #define zig_switch_case_int128(Type, operand, value) case value: |
| | 2327 | #define zig_switch_prong_end_int128() |
| | 2328 | #define zig_switch_default_int128() default: |
| | 2329 | #else // zig_has_int128 |
| | 2330 | #define zig_switch_int128(operand) |
| | 2331 | #define zig_switch_prong_begin_int128() if (0 |
| | 2332 | #define zig_switch_case_int128(Type, operand, value) || (zig_cmp_##Type(operand, value) == 0) |
| | 2333 | #define zig_switch_prong_end_int128() ) |
| | 2334 | #define zig_switch_default_int128() |
| | 2335 | #endif // zig_has_int128 |
| | 2336 | |
| 1984 | /* ========================== Big Integer Support =========================== */ | 2337 | /* ========================== Big Integer Support =========================== */ |
| 1985 | | 2338 | |
| 1986 | static inline uint16_t zig_int_bytes(uint16_t bits) { | 2339 | static inline uint16_t zig_int_bytes(uint16_t bits) { |