예제 #1
0
inline uint64_t popcount(uint64_t x){
  return __builtin_popcountl(x);
}
예제 #2
0
파일: funcspec-3.c 프로젝트: Alexpux/GCC
static
long sse42_pop_l (long a)
{
  return __builtin_popcountl (a);
}
예제 #3
0
파일: funcspec-3.c 프로젝트: Alexpux/GCC
static
long generic_pop_l (long a)
{
  return __builtin_popcountl (a);
}
예제 #4
0
// Number of bits set in n
inline uintptr_t popcount(uintptr_t n)
{ return __builtin_popcountl(n); }
inline int population_count<unsigned long>(unsigned long word) {  // NOLINT(runtime/int)
  return __builtin_popcountl(word);
}
예제 #6
0
int main(int argc, char *argv[]){
	// Theign:
	minibloom_t*	bloom;
	minibloomfile_t bloomfile_in;
	minibloomfile_t bloomfile_out;
	minibloomfile_t*bloomfiles;
	// Thrall:
	char*		progname= argv[0];
	char*		outfilename;
	char*		infilename;
	int		ch;
	int		err;
	int		action = 0;
	int		i;

	while ((ch = getopt(argc, argv, "a:o:")) != -1) {
		switch (ch) {
		case 'a':
			action |= MINIBLOOMGLUE_APPEND;
			outfilename = optarg;
			break;
		case 'o':
			action |= MINIBLOOMGLUE_CREATE;
			outfilename = optarg;
			break;
		default:
			usage(progname);
			exit(0);
		}
	}
	argc -= optind;
	argv += optind;
	if (!argc){
		usage(progname);
		exit(1);
	}
	// One of create and append should be set:
	if (!(action & MINIBLOOMGLUE_CREATE) && !(action & MINIBLOOMGLUE_APPEND)){
		badarg("Need an output filename: -o outfile infile infile infile...");
	}
	// We need input files:
	if (0 == argc){
		printf("No input files.  Nothing to do.\n");
		exit (0);
	}
	infilename= argv[0]; // and successive entries.

	// MAKE OR LOAD OUTPUT FILE:
	if (action & MINIBLOOMGLUE_APPEND) {
		// Load existing bloom filter:
		err = miniload(&bloomfile_out, outfilename, action & MINIBLOOMGLUE_APPEND);
			if (err) die(err);
	} else {
		// Create a new bloom filter with the same parameters as the first input:
		err = miniload(&bloomfile_in, infilename, 0);
			if (err) die(err);
		err = miniblankclone(&bloomfile_out, outfilename, bloomfile_in.bloom);
			if (err) die(err);
		err = miniclose(&bloomfile_in);
			if (err) die(err);
	}
	bloom = bloomfile_out.bloom;

	// Load all the input files:
	bloomfiles = (minibloomfile_t *) malloc(sizeof(minibloomfile_t) * argc);
	for(i=0; i<argc; i++){
		err = miniload(&bloomfiles[i], argv[i], 0);
			if (err) {
				fprintf(stderr,"ERROR: failed to load %d/%d: %s\n", i+1, argc, argv[i]);
				die(err);
			}
			if (  (bloomfiles[i].bloom->nfuncs	!= bloom->nfuncs)
			   && (bloomfiles[i].bloom->bytesperbloom!= bloom->bytesperbloom)
			   )  {
				fprintf	(stderr
					, "ERROR: The bloom files don't all have the same parameters:\n"
					  " funcs  bytes/fun  filename\n"
					  "  % 3ld % 10ld %s\n"
					  "  % 3ld % 10ld %s\n"
					  "BAILING OUT...\n"
					, (uint64_t)bloomfiles[i].bloom->nfuncs, (uint64_t)bloomfiles[i].bloom->bytesperbloom, argv[i]
					, (uint64_t)bloomfiles[0].bloom->nfuncs, (uint64_t)bloomfiles[0].bloom->bytesperbloom, argv[0]
					);
			}
	}

	// Glue them all together:
	{
		uint64_t** pointers;
		uint64_t*  pointer;
		uint64_t   chunk;
		uint8_t    dribble;
		int i;
		size_t counter, size, limit;
		uint64_t   weight=0;
		pointer = (uint64_t *)(bloom->blooms);
		pointers = (uint64_t**) malloc(sizeof(uint64_t*)*argc);
		for (i=0; i<argc; i++){
			pointers[i] = (uint64_t*)(bloomfiles[i].bloom->blooms);
		}
		size  = bloom->bytesperbloom * bloom->nfuncs;
		limit = size>>3;
		// Octets:
		for (counter=0; counter<limit; counter++){
			chunk = pointers[0][counter];
			for(i=1; i<argc; i++){
				chunk |= pointers[i][counter];
			}
			pointer[counter] = chunk;
			weight += __builtin_popcountl(chunk);
		}
		// Bytes:
		for (counter <<=3;counter<size;counter++){
			dribble = bloomfiles[0].bloom->blooms[counter];
			for(i=1; i<argc; i++){
				dribble |= bloomfiles[i].bloom->blooms[counter];
			}
			bloom->blooms[counter] = dribble;
			weight += __builtin_popcountl(dribble);
		}
		bloom->density = weight;
		// Other values:
		bloom->entries = bloomfiles[0].bloom->entries;
		for (i=1; i<argc; i++){
			bloom->entries += bloomfiles[i].bloom->entries;
		}
	}

	// WRITE OR CLOSE:
	miniclose(&bloomfile_out);
	for (i=0;i<argc;i++){
		miniclose(&bloomfiles[i]);
	}

	// FIN
	return 0;
}
예제 #7
0
파일: popcount.hpp 프로젝트: dnovick/Sprout
		inline SPROUT_CONSTEXPR int
		popcount(unsigned long n) {
			return __builtin_popcountl(n);
		}
int main() {
  unsigned long seven = 7;
  assert(__builtin_popcountl(seven) == 3);
}
예제 #9
0
inline size_t population_count<uint32_t>(uint32_t i)
{
	return __builtin_popcountl(i);
}
예제 #10
0
파일: dpopcount.c 프로젝트: rgmabs19357/gcc
int dpopcount(unsigned long x)
{
  if (__builtin_popcountl (x))
    return x;
  return -1;
}