diff options
author | Stephen Fisher <sfisher@sdf.org> | 2014-12-22 13:50:10 -0700 |
---|---|---|
committer | Stephen Fisher <sfisher@sdf.org> | 2014-12-23 00:22:23 +0000 |
commit | 3d62d2c396aa016d97f788205978f4fdba2d4d4b (patch) | |
tree | 161f97d511c7449b0caf17ab87edef4b0280a573 /wsutil/popcount.c | |
parent | 59b4ab53fcf08db3daa7461b463ca47e83e55079 (diff) |
Move popcount() to an optionally built part of wsutil for systems that
provide their own popcount().
Change-Id: Ic26f3b50cf0bd2b4af0d42e9c27488ebbac1ab33
Reviewed-on: https://code.wireshark.org/review/5998
Petri-Dish: Stephen Fisher <sfisher@sdf.org>
Reviewed-by: Stephen Fisher <sfisher@sdf.org>
Diffstat (limited to 'wsutil/popcount.c')
-rw-r--r-- | wsutil/popcount.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/wsutil/popcount.c b/wsutil/popcount.c new file mode 100644 index 0000000000..04a0ade032 --- /dev/null +++ b/wsutil/popcount.c @@ -0,0 +1,42 @@ +/* popcount.c + * + * popcount() replacement function for systems that don't provide their own. + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include "wsutil/popcount.h" + +int +popcount(unsigned int mask) +{ +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) + /* GCC 3.4 or newer */ + return __builtin_popcount(mask); +#else + /* HACKMEM 169 */ + unsigned long y; + + y = (mask >> 1) &033333333333; + y = mask - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); +#endif +} |