Add C code alternative to __builtin_popcount.

This commit is contained in:
Marius Greuel 2022-01-08 16:08:35 +01:00
parent 21d7fc58b6
commit d2ae6a824f
2 changed files with 19 additions and 16 deletions

View File

@ -103,11 +103,28 @@ avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p)
#define TPI_PARITY_MASK 0x2000 #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 static uint16_t
tpi_byte2frame(uint8_t byte) tpi_byte2frame(uint8_t byte)
{ {
uint16_t frame = 0xc00f; uint16_t frame = 0xc00f;
int parity = __builtin_popcount(byte) & 1; int parity = count1s(byte) & 1;
frame |= ((byte << 5) & 0x1fe0); frame |= ((byte << 5) & 0x1fe0);
@ -123,7 +140,7 @@ tpi_frame2byte(uint16_t frame, uint8_t * byte)
/* drop idle and start bit(s) */ /* drop idle and start bit(s) */
*byte = (frame >> 5) & 0xff; *byte = (frame >> 5) & 0xff;
int parity = __builtin_popcount(*byte) & 1; int parity = count1s(*byte) & 1;
int parity_rcvd = (frame & TPI_PARITY_MASK) ? 1 : 0; int parity_rcvd = (frame & TPI_PARITY_MASK) ? 1 : 0;
return parity != parity_rcvd; return parity != parity_rcvd;

View File

@ -21,7 +21,6 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <io.h> #include <io.h>
#include <intrin.h>
#include <malloc.h> #include <malloc.h>
#pragma comment(lib, "advapi32.lib") #pragma comment(lib, "advapi32.lib")
@ -35,19 +34,6 @@
#define setvbuf msvc_setvbuf #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( static inline int msvc_setvbuf(
FILE* const public_stream, FILE* const public_stream,
char* const buffer, char* const buffer,