[libmath-prime-util-perl] 15/181: Have 32-bit use parallel bit count instead of 8-bit table
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:02 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.
commit 40e5b5f104792077b051feaead0bc4227337faa4
Author: Dana Jacobsen <dana at acm.org>
Date: Sun Dec 15 20:33:22 2013 -0800
Have 32-bit use parallel bit count instead of 8-bit table
---
lmo.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/lmo.c b/lmo.c
index 0e2111b..e903f24 100644
--- a/lmo.c
+++ b/lmo.c
@@ -80,13 +80,13 @@
/* UV is either uint32 or uint64 depending on Perl. We use this native size
* for the basic unit of the phi sieve. It can be easily overridden here. */
-typedef UV sword_t;
+typedef UV sword_t;
#define SWORD_BITS BITS_PER_WORD
#define SWORD_ONES UV_MAX
#define SWORD_MASKBIT(bits) (UVCONST(1) << ((bits) % SWORD_BITS))
#define SWORD_CLEAR(s,bits) s[bits/SWORD_BITS] &= ~SWORD_MASKBIT(bits)
-/* Compile with -march=native to get a large speedup on Nahalem and newer */
+/* Compile with -march=native to get a very large speedup on new processors */
#if SWORD_BITS == 64
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR > 1))
#define bitcount(b) __builtin_popcountll(b)
@@ -95,23 +95,17 @@ typedef UV sword_t;
b -= (b >> 1) & 0x5555555555555555;
b = (b & 0x3333333333333333) + ((b >> 2) & 0x3333333333333333);
b = (b + (b >> 4)) & 0x0f0f0f0f0f0f0f0f;
- return (b * 0x0101010101010101)>>56;
+ return (b * 0x0101010101010101) >> 56;
}
#endif
#else
-static const unsigned char byte_ones[256] =
- {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
-static sword_t bitcount(sword_t b) {
- return byte_ones[(b )&0xFF] + byte_ones[(b>> 8)&0xFF]
- + byte_ones[(b>>16)&0xFF] + byte_ones[(b>>24) ];
-}
+ /* An 8-bit table version is usually a little faster, but this is simpler. */
+ static sword_t bitcount(sword_t b) {
+ b -= (b >> 1) & 0x55555555;
+ b = (b & 0x33333333) + ((b >> 2) & 0x33333333);
+ b = (b + (b >> 4)) & 0x0f0f0f0f;
+ return (b * 0x01010101) >> 24;
+ }
#endif
@@ -219,7 +213,7 @@ static uint16* ft_create(uint32 max)
factor_table[0] = 65534;
for (i = 1; i < tableSize; ++i)
factor_table[i] = 65535;
-
+
/* Process each odd. */
for (i = 1; i < tableSize; ++i) {
uint32 factor, max_factor;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list