Path: blob/master/libs/compiler-rt/lib/builtins/popcountsi2.c
12346 views
/* ===-- popcountsi2.c - Implement __popcountsi2 ---------------------------===1*2* The LLVM Compiler Infrastructure3*4* This file is dual licensed under the MIT and the University of Illinois Open5* Source Licenses. See LICENSE.TXT for details.6*7* ===----------------------------------------------------------------------===8*9* This file implements __popcountsi2 for the compiler_rt library.10*11* ===----------------------------------------------------------------------===12*/1314#include "int_lib.h"1516/* Returns: count of 1 bits */1718COMPILER_RT_ABI si_int19__popcountsi2(si_int a)20{21su_int x = (su_int)a;22x = x - ((x >> 1) & 0x55555555);23/* Every 2 bits holds the sum of every pair of bits */24x = ((x >> 2) & 0x33333333) + (x & 0x33333333);25/* Every 4 bits holds the sum of every 4-set of bits (3 significant bits) */26x = (x + (x >> 4)) & 0x0F0F0F0F;27/* Every 8 bits holds the sum of every 8-set of bits (4 significant bits) */28x = (x + (x >> 16));29/* The lower 16 bits hold two 8 bit sums (5 significant bits).*/30/* Upper 16 bits are garbage */31return (x + (x >> 8)) & 0x0000003F; /* (6 significant bits) */32}333435