| ... | ... | @@ -79,6 +79,9 @@ |
| 79 | 79 | #elif defined(__I86__) |
| 80 | 80 | #define zig_x86_16 |
| 81 | 81 | #define zig_x86 |
| 82 | #elif defined (__ez80) |
| 83 | #define zig_ez80 |
| 84 | #define zig_z80 |
| 82 | 85 | #endif |
| 83 | 86 | |
| 84 | 87 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| ... | ... | @@ -409,6 +412,8 @@ |
| 409 | 412 | #define zig_trap() __asm__ volatile("int $0x3") |
| 410 | 413 | #elif defined(zig_x86) |
| 411 | 414 | #define zig_trap() __asm__ volatile("ud2") |
| 415 | #elif defined(zig_z80) |
| 416 | #define zig_trap() __asm__ volatile("rst 00h") |
| 412 | 417 | #else |
| 413 | 418 | #define zig_trap() zig_trap_unavailable |
| 414 | 419 | #endif |
| ... | ... | @@ -511,7 +516,7 @@ zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); |
| 511 | 516 | zig_extern void *memset (void *, int, size_t); |
| 512 | 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 | 521 | #include <limits.h> |
| 517 | 522 | |
| ... | ... | @@ -590,6 +595,16 @@ typedef signed long long int16_t; |
| 590 | 595 | #define INT16_MAX ( INT16_C(0x7FFF)) |
| 591 | 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 | 608 | #if SCHAR_MIN == ~0x7FFFFFFF && SCHAR_MAX == 0x7FFFFFFF && UCHAR_MAX == 0xFFFFFFFF |
| 594 | 609 | typedef unsigned char uint32_t; |
| 595 | 610 | typedef signed char int32_t; |
| ... | ... | @@ -620,6 +635,17 @@ typedef signed long long int32_t; |
| 620 | 635 | #define INT32_MAX ( INT32_C(0x7FFFFFFF)) |
| 621 | 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 | 649 | #if SCHAR_MIN == ~0x7FFFFFFFFFFFFFFF && SCHAR_MAX == 0x7FFFFFFFFFFFFFFF && UCHAR_MAX == 0xFFFFFFFFFFFFFFFF |
| 624 | 650 | typedef unsigned char uint64_t; |
| 625 | 651 | typedef signed char int64_t; |
| ... | ... | @@ -663,10 +689,18 @@ typedef ptrdiff_t intptr_t; |
| 663 | 689 | #define zig_maxInt_i16 INT16_MAX |
| 664 | 690 | #define zig_minInt_u16 UINT16_C(0) |
| 665 | 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 | 696 | #define zig_minInt_i32 INT32_MIN |
| 667 | 697 | #define zig_maxInt_i32 INT32_MAX |
| 668 | 698 | #define zig_minInt_u32 UINT32_C(0) |
| 669 | 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 | 704 | #define zig_minInt_i64 INT64_MIN |
| 671 | 705 | #define zig_maxInt_i64 INT64_MAX |
| 672 | 706 | #define zig_minInt_u64 UINT64_C(0) |
| ... | ... | @@ -786,6 +820,17 @@ zig_int_helpers(16, unsigned long long) |
| 786 | 820 | #else |
| 787 | 821 | zig_int_helpers(16, uint16_t) |
| 788 | 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 | 834 | #if UINT32_MAX <= UINT_MAX |
| 790 | 835 | zig_int_helpers(32, unsigned int) |
| 791 | 836 | #elif UINT32_MAX <= ULONG_MAX |
| ... | ... | @@ -795,6 +840,17 @@ zig_int_helpers(32, unsigned long long) |
| 795 | 840 | #else |
| 796 | 841 | zig_int_helpers(32, uint32_t) |
| 797 | 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 | 854 | #if UINT64_MAX <= UINT_MAX |
| 799 | 855 | zig_int_helpers(64, unsigned int) |
| 800 | 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 | 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 | 1028 | static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { |
| 913 | 1029 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 914 | 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 | 1049 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); |
| 934 | 1050 | } |
| 935 | 1051 | |
| 1052 | |
| 936 | 1053 | static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8_t bits) { |
| 937 | 1054 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 938 | 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 | 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 | 1193 | static inline bool zig_mulo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8_t bits) { |
| 1017 | 1194 | #if zig_has_builtin(mul_overflow) || defined(zig_gcc) |
| 1018 | 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 | 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 | 1361 | #define zig_int_builtins(w) \ |
| 1125 | 1362 | static inline bool zig_shlo_u##w(uint##w##_t *res, uint##w##_t lhs, uint8_t rhs, uint8_t bits) { \ |
| 1126 | 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 | 1417 | } |
| 1181 | 1418 | zig_int_builtins(8) |
| 1182 | 1419 | zig_int_builtins(16) |
| 1420 | #if defined(zig_ez80) |
| 1421 | zig_int_builtins(24) |
| 1422 | #endif |
| 1183 | 1423 | zig_int_builtins(32) |
| 1424 | #if defined(zig_ez80) |
| 1425 | zig_int_builtins(48) |
| 1426 | #endif |
| 1184 | 1427 | zig_int_builtins(64) |
| 1185 | 1428 | |
| 1186 | 1429 | #define zig_builtin8(name, val) __builtin_##name(val) |
| ... | ... | @@ -1189,6 +1432,11 @@ typedef unsigned int zig_Builtin8; |
| 1189 | 1432 | #define zig_builtin16(name, val) __builtin_##name(val) |
| 1190 | 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 | 1440 | #if INT_MIN <= INT32_MIN |
| 1193 | 1441 | #define zig_builtin32(name, val) __builtin_##name(val) |
| 1194 | 1442 | typedef unsigned int zig_Builtin32; |
| ... | ... | @@ -1197,6 +1445,11 @@ typedef unsigned int zig_Builtin32; |
| 1197 | 1445 | typedef unsigned long zig_Builtin32; |
| 1198 | 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 | 1453 | #if INT_MIN <= INT64_MIN |
| 1201 | 1454 | #define zig_builtin64(name, val) __builtin_##name(val) |
| 1202 | 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 | 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 | 1504 | static inline uint32_t zig_byte_swap_u32(uint32_t val, uint8_t bits) { |
| 1235 | 1505 | uint32_t full_res; |
| 1236 | 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 | 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 | 1536 | static inline uint64_t zig_byte_swap_u64(uint64_t val, uint8_t bits) { |
| 1250 | 1537 | uint64_t full_res; |
| 1251 | 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 | 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 | 1601 | static inline uint32_t zig_bit_reverse_u32(uint32_t val, uint8_t bits) { |
| 1298 | 1602 | uint32_t full_res; |
| 1299 | 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 | 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 | 1633 | static inline uint64_t zig_bit_reverse_u64(uint64_t val, uint8_t bits) { |
| 1313 | 1634 | uint64_t full_res; |
| 1314 | 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 | 1671 | #endif |
| 1351 | 1672 | zig_builtin_popcount(8) |
| 1352 | 1673 | zig_builtin_popcount(16) |
| 1674 | #if defined(zig_ez80) |
| 1675 | zig_builtin_popcount(24) |
| 1676 | #endif |
| 1353 | 1677 | zig_builtin_popcount(32) |
| 1678 | #if defined(zig_ez80) |
| 1679 | zig_builtin_popcount(48) |
| 1680 | #endif |
| 1354 | 1681 | zig_builtin_popcount(64) |
| 1355 | 1682 | |
| 1356 | 1683 | #define zig_builtin_ctz_common(w) \ |
| ... | ... | @@ -1375,7 +1702,13 @@ zig_builtin_popcount(64) |
| 1375 | 1702 | #endif |
| 1376 | 1703 | zig_builtin_ctz(8) |
| 1377 | 1704 | zig_builtin_ctz(16) |
| 1705 | #if defined(zig_ez80) |
| 1706 | zig_builtin_ctz(24) |
| 1707 | #endif |
| 1378 | 1708 | zig_builtin_ctz(32) |
| 1709 | #if defined(zig_ez80) |
| 1710 | zig_builtin_ctz(48) |
| 1711 | #endif |
| 1379 | 1712 | zig_builtin_ctz(64) |
| 1380 | 1713 | |
| 1381 | 1714 | #define zig_builtin_clz_common(w) \ |
| ... | ... | @@ -1400,7 +1733,13 @@ zig_builtin_ctz(64) |
| 1400 | 1733 | #endif |
| 1401 | 1734 | zig_builtin_clz(8) |
| 1402 | 1735 | zig_builtin_clz(16) |
| 1736 | #if defined(zig_ez80) |
| 1737 | zig_builtin_clz(24) |
| 1738 | #endif |
| 1403 | 1739 | zig_builtin_clz(32) |
| 1740 | #if defined(zig_ez80) |
| 1741 | zig_builtin_clz(48) |
| 1742 | #endif |
| 1404 | 1743 | zig_builtin_clz(64) |
| 1405 | 1744 | |
| 1406 | 1745 | /* ======================== 128-bit Integer Support ========================= */ |
| ... | ... | @@ -1981,6 +2320,20 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, uint8_t bits) { |
| 1981 | 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 | 2337 | /* ========================== Big Integer Support =========================== */ |
| 1985 | 2338 | |
| 1986 | 2339 | static inline uint16_t zig_int_bytes(uint16_t bits) { |