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 <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,