Skip to content

Commit 6119381

Browse files
committed
Finish the lib/zig.h intrinsics
(yay)
1 parent 45ff1e0 commit 6119381

File tree

1 file changed

+125
-6
lines changed

1 file changed

+125
-6
lines changed

lib/zig.h

Lines changed: 125 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

14311505
static 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

14481537
static 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

14981602
static 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

15151634
static 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 */
42184338
zig_msvc_atomics( u8, uint8_t, char, 8, 8)
42194339
zig_msvc_atomics( i8, int8_t, char, 8, 8)
42204340
zig_msvc_atomics(u16, uint16_t, short, 16, 16)
42214341
zig_msvc_atomics(i16, int16_t, short, 16, 16)
4222-
/* TODO: clevor zig_msvc_atomics(u24)? */
42234342
zig_msvc_atomics(u32, uint32_t, long, , 32)
42244343
zig_msvc_atomics(i32, int32_t, long, , 32)
42254344

0 commit comments

Comments
 (0)