From d2ae6a824fe9ba71b527f4ba1dc783c351a63b15 Mon Sep 17 00:00:00 2001 From: Marius Greuel Date: Sat, 8 Jan 2022 16:08:35 +0100 Subject: [PATCH] Add C code alternative to __builtin_popcount. --- src/avrftdi_tpi.c | 21 +++++++++++++++++++-- src/msvc/msvc_compat.h | 14 -------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/avrftdi_tpi.c b/src/avrftdi_tpi.c index d82444e8..efb56266 100644 --- a/src/avrftdi_tpi.c +++ b/src/avrftdi_tpi.c @@ -103,11 +103,28 @@ avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p) #define TPI_PARITY_MASK 0x2000 +static inline int count1s(unsigned int x) +{ +#if defined(__GNUC__) + return __builtin_popcount(x); +#else + int count = 0; + + while (x) + { + count += x & 1; + x >>= 1; + } + + return count; +#endif +} + static uint16_t tpi_byte2frame(uint8_t byte) { uint16_t frame = 0xc00f; - int parity = __builtin_popcount(byte) & 1; + int parity = count1s(byte) & 1; frame |= ((byte << 5) & 0x1fe0); @@ -123,7 +140,7 @@ tpi_frame2byte(uint16_t frame, uint8_t * byte) /* drop idle and start bit(s) */ *byte = (frame >> 5) & 0xff; - int parity = __builtin_popcount(*byte) & 1; + int parity = count1s(*byte) & 1; int parity_rcvd = (frame & TPI_PARITY_MASK) ? 1 : 0; return parity != parity_rcvd; diff --git a/src/msvc/msvc_compat.h b/src/msvc/msvc_compat.h index bfc44a6f..eb3e026a 100644 --- a/src/msvc/msvc_compat.h +++ b/src/msvc/msvc_compat.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #pragma comment(lib, "advapi32.lib") @@ -35,19 +34,6 @@ #define setvbuf msvc_setvbuf -static inline int __builtin_popcount(unsigned int v) -{ - int count = 0; - - while (v) - { - count += v & 1; - v >>= 1; - } - - return count; -} - static inline int msvc_setvbuf( FILE* const public_stream, char* const buffer,