summaryrefslogtreecommitdiff
path: root/gen-sieve.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2022-01-05 18:19:17 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2022-01-05 18:19:17 +0100
commit8bc636d74baf89c5edf02501ea478588623a3750 (patch)
tree69b7c3375d1f7e273e967fd0315de3c8d480656f /gen-sieve.c
parent80f8687c11422ed3cbf82f5202a40f8cf9b80940 (diff)
downloadgmp-8bc636d74baf89c5edf02501ea478588623a3750.tar.gz
gen-sieve.c: Generate at compile-time masks used by primesieve.c .
Diffstat (limited to 'gen-sieve.c')
-rw-r--r--gen-sieve.c75
1 files changed, 73 insertions, 2 deletions
diff --git a/gen-sieve.c b/gen-sieve.c
index 8fac3413f..713391802 100644
--- a/gen-sieve.c
+++ b/gen-sieve.c
@@ -2,7 +2,7 @@
Contributed to the GNU project by Marco Bodrato.
-Copyright 2021 Free Software Foundation, Inc.
+Copyright 2021, 2022 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
@@ -86,12 +86,82 @@ generate (int limb_bits, int limit)
printf ("#define PRIMESIEVE_NUMBEROF_TABLE %d\n", c);
printf ("/* #define PRIMESIEVE_PRIMES_IN_TABLE %d */\n", totpc);
- printf ("/* #define PRIMESIEVE_HIGHEST_PRIME %d */\n", maxprime);
+ printf ("#define PRIMESIEVE_HIGHEST_PRIME %d\n", maxprime);
printf ("/* #define PRIMESIEVE_FIRST_UNCHECKED %d */\n", bit_to_n (limit));
return c;
}
+void
+setmask (mpz_t mask, int a, int b)
+{
+ mpz_set_ui (mask, 0);
+ for (unsigned i = 0; i < 2 * a * b; ++i)
+ if ((bit_to_n (i) % a == 0) || (bit_to_n (i) % b == 0))
+ mpz_setbit (mask, i);
+}
+
+void
+gen_sieve_masks (int limb_bits) {
+ mpz_t mask, limb;
+
+ mpz_init (mask);
+ mpz_init (limb);
+
+ printf ("\n");
+ if (limb_bits > 60 && limb_bits < 91)
+ {
+ setmask (mask, 5, 11);
+
+ mpz_tdiv_r_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_MASK1 CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ mpz_tdiv_q_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_MASKT CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+
+ setmask (mask, 7, 13);
+
+ mpz_tdiv_r_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_2MSK1 CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ mpz_tdiv_q_2exp (mask, mask, limb_bits);
+ mpz_tdiv_r_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_2MSK2 CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ mpz_tdiv_q_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_2MSKT CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ }
+ else if (limb_bits > 23 && limb_bits < 36)
+ {
+ setmask (mask, 5, 7);
+
+ mpz_tdiv_r_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_MASK1 CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ mpz_tdiv_q_2exp (mask, mask, limb_bits);
+ mpz_tdiv_r_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_MASK2 CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ mpz_tdiv_q_2exp (limb, mask, limb_bits);
+ printf ("#define SIEVE_MASKT CNST_LIMB(0x");
+ mpz_out_str (stdout, -16, limb);
+ printf (")\n");
+ }
+ printf ("\n");
+
+ mpz_clear (limb);
+ mpz_clear (mask);
+}
+
/* 5*2 = 10
7*2 = 14
5*7*2 = 70 (2*35, 3*24, 4*18, 5*14...)
@@ -118,6 +188,7 @@ main (int argc, char *argv[])
if (limit % limb_bits != 0)
limit += limb_bits - limit % limb_bits;
generate (limb_bits, limit);
+ gen_sieve_masks (limb_bits);
return 0;
}