@@ -1298,7 +1298,66 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t
12981298 return overflow ;
12991299#endif
13001300}
1301- /* TODO: clevor zig_mulo_*24 */
1301+
1302+ #if defined(zig_ez80 )
1303+ static inline bool zig_mulo_u24 (uint24_t * res , uint24_t lhs , uint24_t rhs , uint8_t bits ) {
1304+ #if zig_has_builtin (mul_overflow ) || defined(zig_gcc )
1305+ uint24_t full_res ;
1306+ bool overflow = __builtin_mul_overflow (lhs , rhs , & full_res );
1307+ * res = zig_wrap_u24 (full_res , bits );
1308+ return overflow || full_res < zig_minInt_u (24 , bits ) || full_res > zig_maxInt_u (24 , bits );
1309+ #else
1310+ uint32_t full_res ;
1311+ bool overflow = zig_mulo_u32 (& full_res , lhs , rhs , bits );
1312+ * res = (uint24_t )full_res ;
1313+ return overflow ;
1314+ #endif
1315+ }
1316+
1317+ static inline bool zig_mulo_i24 (int24_t * res , int24_t lhs , int24_t rhs , uint8_t bits ) {
1318+ #if zig_has_builtin (mul_overflow ) || defined(zig_gcc )
1319+ int24_t full_res ;
1320+ bool overflow = __builtin_mul_overflow (lhs , rhs , & full_res );
1321+ * res = zig_wrap_i24 (full_res , bits );
1322+ return overflow || full_res < zig_minInt_i (24 , bits ) || full_res > zig_maxInt_i (24 , bits );
1323+ #else
1324+ int32_t full_res ;
1325+ bool overflow = zig_mulo_i32 (& full_res , lhs , rhs , bits );
1326+ * res = (int24_t )full_res ;
1327+ return overflow ;
1328+ #endif
1329+ }
1330+ #endif
1331+
1332+ #if defined(zig_ez80 )
1333+ static inline bool zig_mulo_u48 (uint48_t * res , uint48_t lhs , uint48_t rhs , uint8_t bits ) {
1334+ #if zig_has_builtin (mul_overflow ) || defined(zig_gcc )
1335+ uint48_t full_res ;
1336+ bool overflow = __builtin_mul_overflow (lhs , rhs , & full_res );
1337+ * res = zig_wrap_u48 (full_res , bits );
1338+ return overflow || full_res < zig_minInt_u (48 , bits ) || full_res > zig_maxInt_u (48 , bits );
1339+ #else
1340+ uint64_t full_res ;
1341+ bool overflow = zig_mulo_u64 (& full_res , lhs , rhs , bits );
1342+ * res = (uint48_t )full_res ;
1343+ return overflow ;
1344+ #endif
1345+ }
1346+
1347+ static inline bool zig_mulo_i48 (int48_t * res , int48_t lhs , int48_t rhs , uint8_t bits ) {
1348+ #if zig_has_builtin (mul_overflow ) || defined(zig_gcc )
1349+ int48_t full_res ;
1350+ bool overflow = __builtin_mul_overflow (lhs , rhs , & full_res );
1351+ * res = zig_wrap_i48 (full_res , bits );
1352+ return overflow || full_res < zig_minInt_i (48 , bits ) || full_res > zig_maxInt_i (48 , bits );
1353+ #else
1354+ int64_t full_res ;
1355+ bool overflow = zig_mulo_i64 (& full_res , lhs , rhs , bits );
1356+ * res = (int48_t )full_res ;
1357+ return overflow ;
1358+ #endif
1359+ }
1360+ #endif
13021361
13031362#define zig_int_builtins (w ) \
13041363 static inline bool zig_shlo_u##w(uint##w##_t *res, uint##w##_t lhs, uint8_t rhs, uint8_t bits) { \
@@ -1426,7 +1485,22 @@ static inline int16_t zig_byte_swap_i16(int16_t val, uint8_t bits) {
14261485 return zig_wrap_i16 ((int16_t )zig_byte_swap_u16 ((uint16_t )val , bits ), bits );
14271486}
14281487
1429- /* TODO: clevor zig_byte_swap_*24 */
1488+ #if defined(zig_ez80 )
1489+ static inline uint16_t zig_byte_swap_u24 (uint24_t val , uint8_t bits ) {
1490+ uint24_t full_res ;
1491+ #if zig_has_builtin (bswap16 ) || defined(zig_gcc )
1492+ full_res = __builtin_bswap24 (val );
1493+ #else
1494+ full_res = (uint24_t )zig_byte_swap_u8 ((uint8_t )(val >> 0 ), 8 ) << 16 |
1495+ (uint24_t )zig_byte_swap_u16 ((uint16_t )(val >> 8 ), 16 ) >> 0 ;
1496+ #endif
1497+ return zig_wrap_u24 (full_res >> (24 - bits ), bits );
1498+ }
1499+
1500+ static inline int16_t zig_byte_swap_i24 (int24_t val , uint8_t bits ) {
1501+ return zig_wrap_i24 ((int24_t )zig_byte_swap_u24 ((uint24_t )val , bits ), bits );
1502+ }
1503+ #endif
14301504
14311505static inline uint32_t zig_byte_swap_u32 (uint32_t val , uint8_t bits ) {
14321506 uint32_t full_res ;
@@ -1443,7 +1517,22 @@ static inline int32_t zig_byte_swap_i32(int32_t val, uint8_t bits) {
14431517 return zig_wrap_i32 ((int32_t )zig_byte_swap_u32 ((uint32_t )val , bits ), bits );
14441518}
14451519
1446- /* TODO: clevor zig_byte_swap_*48 */
1520+ #if defined(zig_ez80 )
1521+ static inline uint32_t zig_byte_swap_u48 (uint48_t val , uint8_t bits ) {
1522+ uint48_t full_res ;
1523+ #if zig_has_builtin (bswap48 ) || defined(zig_gcc )
1524+ full_res = __builtin_bswap48 (val );
1525+ #else
1526+ full_res = (uint48_t )zig_byte_swap_u24 ((uint24_t )(val >> 0 ), 24 ) << 24 |
1527+ (uint48_t )zig_byte_swap_u24 ((uint24_t )(val >> 24 ), 24 ) >> 0 ;
1528+ #endif
1529+ return zig_wrap_u48 (full_res >> (48 - bits ), bits );
1530+ }
1531+
1532+ static inline int32_t zig_byte_swap_i48 (int48_t val , uint8_t bits ) {
1533+ return zig_wrap_i48 ((int48_t )zig_byte_swap_u48 ((uint48_t )val , bits ), bits );
1534+ }
1535+ #endif
14471536
14481537static inline uint64_t zig_byte_swap_u64 (uint64_t val , uint8_t bits ) {
14491538 uint64_t full_res ;
@@ -1493,7 +1582,22 @@ static inline int16_t zig_bit_reverse_i16(int16_t val, uint8_t bits) {
14931582 return zig_wrap_i16 ((int16_t )zig_bit_reverse_u16 ((uint16_t )val , bits ), bits );
14941583}
14951584
1496- /* TODO: clevor zig_byte_reverse_*24 */
1585+ #if defined(zig_ez80 )
1586+ static inline uint24_t zig_bit_reverse_u24 (uint24_t val , uint8_t bits ) {
1587+ uint24_t full_res ;
1588+ #if zig_has_builtin (bitreverse24 )
1589+ full_res = __builtin_bitreverse24 (val );
1590+ #else
1591+ full_res = (uint24_t )zig_bit_reverse_u8 ((uint8_t )(val >> 0 ), 8 ) << 16 |
1592+ (uint24_t )zig_bit_reverse_u16 ((uint16_t )(val >> 8 ), 16 ) >> 0 ;
1593+ #endif
1594+ return zig_wrap_u24 (full_res >> (24 - bits ), bits );
1595+ }
1596+
1597+ static inline int16_t zig_bit_reverse_i16 (int16_t val , uint8_t bits ) {
1598+ return zig_wrap_i16 ((int16_t )zig_bit_reverse_u16 ((uint16_t )val , bits ), bits );
1599+ }
1600+ #endif
14971601
14981602static inline uint32_t zig_bit_reverse_u32 (uint32_t val , uint8_t bits ) {
14991603 uint32_t full_res ;
@@ -1510,7 +1614,22 @@ static inline int32_t zig_bit_reverse_i32(int32_t val, uint8_t bits) {
15101614 return zig_wrap_i32 ((int32_t )zig_bit_reverse_u32 ((uint32_t )val , bits ), bits );
15111615}
15121616
1513- /* TODO: clevor zig_byte_reverse_*48 */
1617+ #if defined(zig_ez80 )
1618+ static inline uint32_t zig_bit_reverse_u48 (uint48_t val , uint8_t bits ) {
1619+ uint48_t full_res ;
1620+ #if zig_has_builtin (bitreverse32 )
1621+ full_res = __builtin_bitreverse48 (val );
1622+ #else
1623+ full_res = (uint48_t )zig_bit_reverse_u24 ((uint24_t )(val >> 0 ), 24 ) << 24 |
1624+ (uint48_t )zig_bit_reverse_u24 ((uint24_t )(val >> 24 ), 24 ) >> 0 ;
1625+ #endif
1626+ return zig_wrap_u32 (full_res >> (48 - bits ), bits );
1627+ }
1628+
1629+ static inline int32_t zig_bit_reverse_i48 (int48_t val , uint8_t bits ) {
1630+ return zig_wrap_i48 ((int48_t )zig_bit_reverse_u48 ((uint48_t )val , bits ), bits );
1631+ }
1632+ #endif
15141633
15151634static inline uint64_t zig_bit_reverse_u64 (uint64_t val , uint8_t bits ) {
15161635 uint64_t full_res ;
@@ -4215,11 +4334,11 @@ typedef int zig_memory_order;
42154334 return val; \
42164335 }
42174336
4337+ /* The eZ80 does not support atomics beyond 8 bits */
42184338zig_msvc_atomics ( u8 , uint8_t , char , 8 , 8 )
42194339zig_msvc_atomics ( i8 , int8_t , char , 8 , 8 )
42204340zig_msvc_atomics (u16 , uint16_t , short , 16 , 16 )
42214341zig_msvc_atomics (i16 , int16_t , short , 16 , 16 )
4222- /* TODO: clevor zig_msvc_atomics(u24)? */
42234342zig_msvc_atomics (u32 , uint32_t , long , , 32 )
42244343zig_msvc_atomics (i32 , int32_t , long , , 32 )
42254344
0 commit comments