summaryrefslogtreecommitdiff
path: root/libpsx/src/libc/strings.c
blob: 76a5f9f4b17e0f752f7045bf11402dd0170584ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdlib.h>
#include <strings.h>
#include <stdint.h>

#define ffs_func(func_name, type) \
\
int func_name(type value) \
{ \
	int i; \
	int nbits = sizeof(type) * 8;\
	\
	for(i = 0; i < nbits && !(value & ((type)1 << i) ); i++);\
	\
	return (i == nbits) ? 0 : (i + 1);\
}

ffs_func(ffs, int);
ffs_func(ffsl, long);
ffs_func(ffsll, long long);

#define popcount_func(func_name, type)	\
\
unsigned int func_name(type value) \
{ \
	int i, bitcnt; \
	int nbits = sizeof(type) * 8; \
	\
	for(i = 0, bitcnt = 0; i < nbits; i++) \
	{\
		if( value & ((type)1 << i) )\
			bitcnt++;\
	}\
	\
	return bitcnt;\
}

popcount_func(popcount, unsigned int);
popcount_func(popcountl, unsigned long);
popcount_func(popcountll, unsigned long long);
popcount_func(popcount32, uint32_t);
popcount_func(popcount64, uint64_t);