GMP 6.1.2 t-count_zeros failure on ARM with assertions
Niels Möller
nisse at lysator.liu.se
Wed Dec 27 16:28:17 UTC 2017
nisse at lysator.liu.se (Niels Möller) writes:
> Pushed now.
And below, a patch to delete all mention of COUNT_LEADING_ZEROS_0,
except for tune/many.pl, which I'm not familiar with. What do you think?
Regards,
/Niels
diff -Nprc2 gmp.0e10f8f34eb4/longlong.h gmp/longlong.h
*** gmp.0e10f8f34eb4/longlong.h 2017-12-27 17:23:38.383996985 +0100
--- gmp/longlong.h 2017-12-27 17:23:38.399997013 +0100
*************** see https://www.gnu.org/licenses/. */
*** 88,93 ****
5) count_leading_zeros(count, x) counts the number of zero-bits from the
msb to the first non-zero bit in the UWtype X. This is the number of
! steps X needs to be shifted left to set the msb. Undefined for X == 0,
! unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
--- 88,92 ----
5) count_leading_zeros(count, x) counts the number of zero-bits from the
msb to the first non-zero bit in the UWtype X. This is the number of
! steps X needs to be shifted left to set the msb. Undefined for X == 0.
6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
*************** long __MPN(count_leading_zeros) (UDItype
*** 411,415 ****
: "=r" (count) \
: "r" (x))
- #define COUNT_LEADING_ZEROS_0 32
#endif /* __a29k__ */
--- 410,413 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 947,951 ****
} while (0)
#define COUNT_LEADING_ZEROS_NEED_CLZ_TAB
- #define COUNT_LEADING_ZEROS_0 31 /* n==0 indistinguishable from n==1 */
#else /* ! pentiummmx || LONGLONG_STANDALONE */
--- 945,948 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 966,970 ****
(c) = 0x3FF + 31 - (__u.a[1] >> 20); \
} while (0)
- #define COUNT_LEADING_ZEROS_0 (0x3FF + 31)
#endif /* pentiummx */
--- 963,966 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1106,1110 ****
(count) = __cbtmp ^ 31; \
} while (0)
- #define COUNT_LEADING_ZEROS_0 (-32) /* sic */
#if defined (__i960mx) /* what is the proper symbol to test??? */
#define rshift_rhlc(r,h,l,c) \
--- 1102,1105 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1193,1197 ****
: "=d" (count) \
: "od" ((USItype) (x)), "n" (0))
- #define COUNT_LEADING_ZEROS_0 32
#endif
#endif /* mc68000 */
--- 1188,1191 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1212,1216 ****
(count) = __cbtmp ^ 31; \
} while (0)
- #define COUNT_LEADING_ZEROS_0 63 /* sic */
#if defined (__m88110__)
#define umul_ppmm(wh, wl, u, v) \
--- 1206,1209 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1370,1374 ****
#define count_leading_zeros(count, x) \
__asm__ ("cntlzw %0,%1" : "=r" (count) : "r" (x))
- #define COUNT_LEADING_ZEROS_0 32
#if HAVE_HOST_CPU_FAMILY_powerpc
#if __GMP_GNUC_PREREQ (4,4)
--- 1363,1366 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1487,1491 ****
#define count_leading_zeros(count, x) \
__asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
- #define COUNT_LEADING_ZEROS_0 64
#if __GMP_GNUC_PREREQ (4,8)
#define umul_ppmm(w1, w0, u, v) \
--- 1479,1482 ----
*************** extern UWtype __MPN(udiv_qrnnd) (UWtype
*** 1711,1716 ****
__asm__ ("scan %1,1,%0" : "=r" (count) : "r" (x))
/* Early sparclites return 63 for an argument of 0, but they warn that future
! implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0
! undefined. */
#endif /* __sparclite__ */
#endif /* __sparc_v8__ */
--- 1702,1706 ----
__asm__ ("scan %1,1,%0" : "=r" (count) : "r" (x))
/* Early sparclites return 63 for an argument of 0, but they warn that future
! implementations might change this. */
#endif /* __sparclite__ */
#endif /* __sparc_v8__ */
*************** __GMP_DECLSPEC UWtype __MPN(udiv_w_sdiv)
*** 2145,2149 ****
} while (0)
/* This version gives a well-defined value for zero. */
- #define COUNT_LEADING_ZEROS_0 (W_TYPE_SIZE - 1)
#define COUNT_LEADING_ZEROS_NEED_CLZ_TAB
#define COUNT_LEADING_ZEROS_SLOW
--- 2135,2138 ----
diff -Nprc2 gmp.0e10f8f34eb4/tests/t-count_zeros.c gmp/tests/t-count_zeros.c
*** gmp.0e10f8f34eb4/tests/t-count_zeros.c 2017-12-27 17:23:38.383996985 +0100
--- gmp/tests/t-count_zeros.c 2017-12-27 17:23:38.399997013 +0100
*************** check_various (void)
*** 59,66 ****
int i;
- #ifdef COUNT_LEADING_ZEROS_0
- check_clz (COUNT_LEADING_ZEROS_0, CNST_LIMB(0));
- #endif
-
for (i=0; i < GMP_LIMB_BITS; i++)
{
--- 59,62 ----
diff -Nprc2 gmp.0e10f8f34eb4/tune/common.c gmp/tune/common.c
*** gmp.0e10f8f34eb4/tune/common.c 2017-12-27 17:23:38.387996993 +0100
--- gmp/tune/common.c 2017-12-27 17:23:38.399997013 +0100
*************** speed_operator_mod (struct speed_params
*** 2595,2599 ****
int
speed_routine_count_zeros_setup (struct speed_params *s,
! mp_ptr xp, int leading, int zero)
{
int i, c;
--- 2595,2599 ----
int
speed_routine_count_zeros_setup (struct speed_params *s,
! mp_ptr xp, int leading)
{
int i, c;
*************** speed_routine_count_zeros_setup (struct
*** 2605,2612 ****
it to 1 for leading, or 0x800..00 for trailing. */
MPN_COPY (xp, s->xp_block, SPEED_BLOCK_SIZE);
! if (! zero)
! for (i = 0; i < SPEED_BLOCK_SIZE; i++)
! if (xp[i] == 0)
! xp[i] = leading ? 1 : GMP_LIMB_HIGHBIT;
}
else if (s->r == 1)
--- 2605,2611 ----
it to 1 for leading, or 0x800..00 for trailing. */
MPN_COPY (xp, s->xp_block, SPEED_BLOCK_SIZE);
! for (i = 0; i < SPEED_BLOCK_SIZE; i++)
! if (xp[i] == 0)
! xp[i] = leading ? 1 : GMP_LIMB_HIGHBIT;
}
else if (s->r == 1)
*************** double
*** 2648,2658 ****
speed_count_leading_zeros (struct speed_params *s)
{
! #ifdef COUNT_LEADING_ZEROS_0
! #define COUNT_LEADING_ZEROS_0_ALLOWED 1
! #else
! #define COUNT_LEADING_ZEROS_0_ALLOWED 0
! #endif
!
! SPEED_ROUTINE_COUNT_ZEROS_A (1, COUNT_LEADING_ZEROS_0_ALLOWED);
count_leading_zeros (c, n);
SPEED_ROUTINE_COUNT_ZEROS_B ();
--- 2647,2651 ----
speed_count_leading_zeros (struct speed_params *s)
{
! SPEED_ROUTINE_COUNT_ZEROS_A (1);
count_leading_zeros (c, n);
SPEED_ROUTINE_COUNT_ZEROS_B ();
*************** double
*** 2661,2665 ****
speed_count_trailing_zeros (struct speed_params *s)
{
! SPEED_ROUTINE_COUNT_ZEROS_A (0, 0);
count_trailing_zeros (c, n);
SPEED_ROUTINE_COUNT_ZEROS_B ();
--- 2654,2658 ----
speed_count_trailing_zeros (struct speed_params *s)
{
! SPEED_ROUTINE_COUNT_ZEROS_A (0);
count_trailing_zeros (c, n);
SPEED_ROUTINE_COUNT_ZEROS_B ();
diff -Nprc2 gmp.0e10f8f34eb4/tune/speed.h gmp/tune/speed.h
*** gmp.0e10f8f34eb4/tune/speed.h 2017-12-27 17:23:38.391996999 +0100
--- gmp/tune/speed.h 2017-12-27 17:23:38.399997013 +0100
*************** void mpz_powm_mod (mpz_ptr, mpz_srcptr,
*** 513,517 ****
void mpz_powm_redc (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
! int speed_routine_count_zeros_setup (struct speed_params *, mp_ptr, int, int);
--- 513,517 ----
void mpz_powm_redc (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
! int speed_routine_count_zeros_setup (struct speed_params *, mp_ptr, int);
*************** int speed_routine_count_zeros_setup (str
*** 3513,3517 ****
Give zero=1 if n=0 is allowed in the call, zero=0 if not. */
! #define SPEED_ROUTINE_COUNT_ZEROS_A(leading, zero) \
{ \
mp_ptr xp; \
--- 3513,3517 ----
Give zero=1 if n=0 is allowed in the call, zero=0 if not. */
! #define SPEED_ROUTINE_COUNT_ZEROS_A(leading) \
{ \
mp_ptr xp; \
*************** int speed_routine_count_zeros_setup (str
*** 3525,3529 ****
SPEED_TMP_ALLOC_LIMBS (xp, SPEED_BLOCK_SIZE, s->align_xp); \
\
! if (! speed_routine_count_zeros_setup (s, xp, leading, zero)) \
return -1.0; \
speed_operand_src (s, xp, SPEED_BLOCK_SIZE); \
--- 3525,3529 ----
SPEED_TMP_ALLOC_LIMBS (xp, SPEED_BLOCK_SIZE, s->align_xp); \
\
! if (! speed_routine_count_zeros_setup (s, xp, leading)) \
return -1.0; \
speed_operand_src (s, xp, SPEED_BLOCK_SIZE); \
*************** int speed_routine_count_zeros_setup (str
*** 3553,3572 ****
} \
! #define SPEED_ROUTINE_COUNT_ZEROS_C(call, leading, zero) \
do { \
! SPEED_ROUTINE_COUNT_ZEROS_A (leading, zero); \
call; \
SPEED_ROUTINE_COUNT_ZEROS_B (); \
} while (0) \
! #define SPEED_ROUTINE_COUNT_LEADING_ZEROS_C(call,zero) \
! SPEED_ROUTINE_COUNT_ZEROS_C (call, 1, zero)
#define SPEED_ROUTINE_COUNT_LEADING_ZEROS(fun) \
! SPEED_ROUTINE_COUNT_ZEROS_C (fun (c, n), 1, 0)
! #define SPEED_ROUTINE_COUNT_TRAILING_ZEROS_C(call,zero) \
! SPEED_ROUTINE_COUNT_ZEROS_C (call, 0, zero)
#define SPEED_ROUTINE_COUNT_TRAILING_ZEROS(call) \
! SPEED_ROUTINE_COUNT_ZEROS_C (fun (c, n), 0, 0)
--- 3553,3572 ----
} \
! #define SPEED_ROUTINE_COUNT_ZEROS_C(call, leading) \
do { \
! SPEED_ROUTINE_COUNT_ZEROS_A (leading); \
call; \
SPEED_ROUTINE_COUNT_ZEROS_B (); \
} while (0) \
! #define SPEED_ROUTINE_COUNT_LEADING_ZEROS_C(call) \
! SPEED_ROUTINE_COUNT_ZEROS_C (call, 1)
#define SPEED_ROUTINE_COUNT_LEADING_ZEROS(fun) \
! SPEED_ROUTINE_COUNT_ZEROS_C (fun (c, n), 1)
! #define SPEED_ROUTINE_COUNT_TRAILING_ZEROS_C(call) \
! SPEED_ROUTINE_COUNT_ZEROS_C (call, 0)
#define SPEED_ROUTINE_COUNT_TRAILING_ZEROS(call) \
! SPEED_ROUTINE_COUNT_ZEROS_C (fun (c, n), 0)
--
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.
More information about the gmp-bugs
mailing list