diff --git a/lib/src/atomic.h b/lib/src/atomic.h index 7bd0e850..16573242 100644 --- a/lib/src/atomic.h +++ b/lib/src/atomic.h @@ -3,7 +3,23 @@ #include -#ifdef _WIN32 +#ifdef __TINYC__ + +static inline size_t atomic_load(const volatile size_t *p) { + return *p; +} + +static inline uint32_t atomic_inc(volatile uint32_t *p) { + *p += 1; + return *p; +} + +static inline uint32_t atomic_dec(volatile uint32_t *p) { + *p-= 1; + return *p; +} + +#elif defined(_WIN32) #include diff --git a/lib/src/bits.h b/lib/src/bits.h index ce7a7155..ca8caf30 100644 --- a/lib/src/bits.h +++ b/lib/src/bits.h @@ -7,7 +7,20 @@ static inline uint32_t bitmask_for_index(uint16_t id) { return (1u << (31 - id)); } -#if defined _WIN32 && !defined __GNUC__ +#ifdef __TINYC__ + +// Algorithm taken from the Hacker's Delight book +// See also https://graphics.stanford.edu/~seander/bithacks.html +static inline uint32_t count_leading_zeros(uint32_t x) { + int count = 0; + if (x == 0) return 32; + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + count = (((x + (x >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; + return count; +} + +#elif defined _WIN32 && !defined __GNUC__ #include