Add C code alternative to __builtin_popcount.
This commit is contained in:
parent
21d7fc58b6
commit
d2ae6a824f
|
@ -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;
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <io.h>
|
||||
#include <intrin.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#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,
|
||||
|
|
Loading…
Reference in New Issue