summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2022-03-15 22:45:03 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2022-03-15 22:45:03 +0100
commit67e05a6e95338d5f1087bb1e8dcaa3e14685e1fa (patch)
treee81fa434570a4be2191f595924d6ca670f4cf780
parent9fe209fe87034e04a72ba877d5a2e8c6eeeb2509 (diff)
downloadgmp-67e05a6e95338d5f1087bb1e8dcaa3e14685e1fa.tar.gz
mpn/generic/mul_fft.c: Use _bknp1, but not when tuning, to avoid "random" results
-rw-r--r--mpn/generic/mul_fft.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/mpn/generic/mul_fft.c b/mpn/generic/mul_fft.c
index bbc19986b..76a21068e 100644
--- a/mpn/generic/mul_fft.c
+++ b/mpn/generic/mul_fft.c
@@ -474,6 +474,7 @@ static void
mpn_fft_mul_modF_K (mp_ptr *ap, mp_ptr *bp, mp_size_t n, mp_size_t K)
{
int i;
+ unsigned k;
int sqr = (ap == bp);
TMP_DECL;
@@ -547,6 +548,33 @@ mpn_fft_mul_modF_K (mp_ptr *ap, mp_ptr *bp, mp_size_t n, mp_size_t K)
(*ap)[n] = cy;
}
}
+#if ! TUNE_PROGRAM_BUILD
+ else if (MPN_MULMOD_BKNP1_USABLE (n, k, MUL_FFT_MODF_THRESHOLD))
+ {
+ mp_ptr a;
+ mp_size_t n_k = n / k;
+
+ if (sqr)
+ {
+ mp_ptr tp = TMP_SALLOC_LIMBS (mpn_sqrmod_bknp1_itch (n));
+ for (i = 0; i < K; i++)
+ {
+ a = *ap++;
+ mpn_sqrmod_bknp1 (a, a, n_k, k, tp);
+ }
+ }
+ else
+ {
+ mp_ptr b, tp = TMP_SALLOC_LIMBS (mpn_mulmod_bknp1_itch (n));
+ for (i = 0; i < K; i++)
+ {
+ a = *ap++;
+ b = *bp++;
+ mpn_mulmod_bknp1 (a, a, b, n_k, k, tp);
+ }
+ }
+ }
+#endif
else
{
mp_ptr a, b, tp, tpn;