[libmath-prime-util-perl] 41/181: Don't use GCC's builting popcount unless we have asm. It can generate awful code.
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:04 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 ea60ec1ae91f07aee3960cf30edf3c9341e82ec2
Author: Dana Jacobsen <dana at acm.org>
Date: Mon Dec 23 11:35:49 2013 -0800
Don't use GCC's builting popcount unless we have asm. It can generate awful code.
---
lmo.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/lmo.c b/lmo.c
index 2591cf7..518876f 100644
--- a/lmo.c
+++ b/lmo.c
@@ -86,9 +86,12 @@ typedef UV sword_t;
#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 very large speedup on new processors */
+/* GCC 3.4-4.1 has broken 64-bit popcount. 4.2+ can generate awful code when
+ * it doesn't have asm. 4.8 seems to generate similar code to the below.
+ * Hence, only use the builtin when we have asm.
+ * Compile with -march=native to get a big speedup on newer processors. */
#if SWORD_BITS == 64
- #if defined(__GNUC__) && (__GNUC__> 4 || (__GNUC__== 4 && __GNUC_MINOR__> 1))
+ #if defined(__POPCNT__) && defined(__GNUC__) && (__GNUC__> 4 || (__GNUC__== 4 && __GNUC_MINOR__> 1))
#define bitcount(b) __builtin_popcountll(b)
#else
static sword_t bitcount(sword_t b) {
@@ -590,13 +593,14 @@ UV _XS_LMO_pi(UV n)
* phi(n / (x*primes[k+1]), k). The inner for loop can be parallelized. */
for (; k < step7_max; k++) {
remove_primes(k, k, &ss, primes);
- if (ss.prime_index[k] >= k+2) {
+ j = ss.prime_index[k];
+ if (j >= k+2) {
UV pk = primes[k+1];
- UV endj = ss.prime_index[k];
+ UV endj = j;
while (endj > 7 && endj-7 >= k+2 && pk*primes[endj-7] > least_divisor) endj -= 8;
while ( endj >= k+2 && pk*primes[endj ] > least_divisor) endj--;
/* Now that we know how far to go, do the summations */
- for (j = ss.prime_index[k]; j > endj; j--)
+ for ( ; j > endj; j--)
sum1 += sieve_phi(n / (pk*primes[j]));
ss.prime_index[k] = endj;
}
--
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