diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2022-01-05 18:19:17 +0100 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2022-01-05 18:19:17 +0100 |
commit | 8bc636d74baf89c5edf02501ea478588623a3750 (patch) | |
tree | 69b7c3375d1f7e273e967fd0315de3c8d480656f /gen-sieve.c | |
parent | 80f8687c11422ed3cbf82f5202a40f8cf9b80940 (diff) | |
download | gmp-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.c | 75 |
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; } |