Code coverage tests
This page documents the degree to which the PARI/GP source code is tested by
our public test suite, distributed with the source distribution in directory
src/test/
. This is measured by the gcov utility; we then
process gcov output using the lcov frond-end.
We test a few variants depending on Configure
flags
on the pari.math.u-bordeaux.fr
machine (x86_64
architecture), and agregate them in the final report:
- with GMP kernel
- with GMP kernel using --mt=pthread
- with native kernel, including micro-assembler code
- with native kernel, without micro-assembler
- with native kernel, without micro-assembler, disabling GCC extensions
(DISABLE_INLINE)
- with GMP kernel, emulating an
x86_32
architecture at
Configure time via setarch
The target is to exceed 90% coverage for all mathematical modules
(given that branches depending on DEBUGLEVEL
or DEBUGMEM
are not covered). This script is
run to produce the results below.
LCOV - code coverage report |
|
|
|
|
Line data Source code
1 : #line 2 "../src/kernel/gmp/gcd.c"
2 : /* Copyright (C) 2000-2003 The PARI group.
3 :
4 : This file is part of the PARI/GP package.
5 :
6 : PARI/GP is free software; you can redistribute it and/or modify it under the
7 : terms of the GNU General Public License as published by the Free Software
8 : Foundation; either version 2 of the License, or (at your option) any later
9 : version. It is distributed in the hope that it will be useful, but WITHOUT
10 : ANY WARRANTY WHATSOEVER.
11 :
12 : Check the License for details. You should have received a copy of it, along
13 : with the package; see the file 'COPYING'. If not, write to the Free Software
14 : Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
15 :
16 : /* assume y > x > 0. return y mod x */
17 : static ulong
18 36698611 : resiu(GEN y, ulong x)
19 : {
20 36698611 : return mpn_mod_1(LIMBS(y), NLIMBS(y), x);
21 : }
22 :
23 : GEN
24 836885375 : gcdii(GEN a, GEN b)
25 : {
26 : long v, w;
27 : pari_sp av;
28 : GEN t;
29 :
30 836885375 : switch (abscmpii(a,b))
31 : {
32 237134347 : case 0: return absi(a);
33 295644957 : case -1: swap(a,b);
34 : }
35 599717524 : if (!signe(b)) return absi(a);
36 : /* here |a|>|b|>0. Try single precision first */
37 343230949 : if (lgefint(a)==3)
38 284075185 : return igcduu((ulong)a[2], (ulong)b[2]);
39 59155764 : if (lgefint(b)==3)
40 : {
41 36698682 : ulong u = resiu(a,(ulong)b[2]);
42 36698993 : if (!u) return absi(b);
43 22104177 : return igcduu((ulong)b[2], u);
44 : }
45 : /* larger than gcd: "set_avma(av)" gerepile (erasing t) is valid */
46 22457082 : av = avma; (void)new_chunk(lgefint(b)+1); /* HACK */
47 22479360 : t = remii(a,b);
48 22479869 : if (!signe(t)) { set_avma(av); return absi(b); }
49 :
50 15506081 : a = b; b = t;
51 15506081 : v = vali(a); a = shifti(a,-v); setabssign(a);
52 15505531 : w = vali(b); b = shifti(b,-w); setabssign(b);
53 15505403 : if (w < v) v = w;
54 15505403 : switch(abscmpii(a,b))
55 : {
56 312094 : case 0: set_avma(av); a=shifti(a,v); return a;
57 3295272 : case -1: swap(a,b);
58 : }
59 15193232 : if (is_pm1(b)) { set_avma(av); return int2n(v); }
60 : {
61 : /* general case */
62 : /*This serve two purposes: 1) mpn_gcd destroy its input and need an extra
63 : * limb 2) this allows us to use icopy instead of gerepile later. NOTE: we
64 : * must put u before d else the final icopy could fail.
65 : */
66 15058824 : GEN res= cgeti(lgefint(a)+1);
67 15058597 : GEN ca = icopy_ef(a,lgefint(a)+1);
68 15058042 : GEN cb = icopy_ef(b,lgefint(b)+1);
69 15058324 : long l = mpn_gcd(LIMBS(res), LIMBS(ca), NLIMBS(ca), LIMBS(cb), NLIMBS(cb));
70 15059808 : res[1] = evalsigne(1)|evallgefint(l+2);
71 15059808 : set_avma(av);
72 15059687 : return shifti(res,v);
73 : }
74 : }
|