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:

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
Current view: top level - kernel/none - add.c (source / functions) Hit Total Coverage
Test: PARI/GP v2.18.1 lcov report (development 30640-c2c58e18c5) Lines: 187 187 100.0 %
Date: 2026-01-27 08:51:18 Functions: 10 10 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : #line 2 "../src/kernel/none/add.c"
       2             : /* Copyright (C) 2002-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             : INLINE GEN
      17  3818131155 : icopy_sign(GEN x, long sx)
      18             : {
      19  3818131155 :   GEN y=icopy(x);
      20  3827185561 :   setsigne(y,sx);
      21  3827185561 :   return y;
      22             : }
      23             : 
      24             : GEN
      25   304917862 : addsi_sign(long x, GEN y, long sy)
      26             : {
      27             :   long sx,ly;
      28             :   GEN z;
      29             : 
      30   304917862 :   if (!x) return icopy_sign(y, sy);
      31   289913743 :   if (!sy) return stoi(x);
      32   162683549 :   if (x<0) { sx=-1; x=-x; } else sx=1;
      33   162683549 :   if (sx==sy)
      34             :   {
      35    45421468 :     z = adduispec(x,y+2, lgefint(y)-2);
      36    45416508 :     setsigne(z,sy); return z;
      37             :   }
      38   117262081 :   ly=lgefint(y);
      39   117262081 :   if (ly==3)
      40             :   {
      41    16785661 :     const long d = (long)(uel(y,2) - (ulong)x);
      42    16785661 :     if (!d) return gen_0;
      43    15813267 :     z=cgeti(3);
      44    15810769 :     if (y[2] < 0 || d > 0) {
      45    13459838 :       z[1] = evalsigne(sy) | evallgefint(3);
      46    13459838 :       z[2] = d;
      47             :     }
      48             :     else {
      49     2350931 :       z[1] = evalsigne(-sy) | evallgefint(3);
      50     2350931 :       z[2] =-d;
      51             :     }
      52    15810769 :     return z;
      53             :   }
      54   100476420 :   z = subiuspec(y+2,x, ly-2);
      55   100601930 :   setsigne(z,sy); return z;
      56             : }
      57             : GEN
      58   212418228 : addui_sign(ulong x, GEN y, long sy)
      59             : {
      60             :   long ly;
      61             :   GEN z;
      62             : 
      63   212418228 :   if (!x) return icopy_sign(y, sy);
      64   209487885 :   if (!sy) return utoipos(x);
      65   201428238 :   if (sy == 1) return adduispec(x,y+2, lgefint(y)-2);
      66    94745934 :   ly=lgefint(y);
      67    94745934 :   if (ly==3)
      68             :   {
      69    27499698 :     const ulong t = y[2];
      70    27499698 :     if (x == t) return gen_0;
      71    25579551 :     z=cgeti(3);
      72    25579521 :     if (x < t) {
      73    23847872 :       z[1] = evalsigne(-1) | evallgefint(3);
      74    23847872 :       z[2] = t - x;
      75             :     }
      76             :     else {
      77     1731649 :       z[1] = evalsigne(1) | evallgefint(3);
      78     1731649 :       z[2] = x - t;
      79             :     }
      80    25579521 :     return z;
      81             :   }
      82    67246236 :   z = subiuspec(y+2,x, ly-2);
      83    67246498 :   setsigne(z,-1); return z;
      84             : }
      85             : 
      86             : /* return gen_0 when the sign is 0 */
      87             : GEN
      88 17998115068 : addii_sign(GEN x, long sx, GEN y, long sy)
      89             : {
      90             :   long lx,ly;
      91             :   GEN z;
      92             : 
      93 17998115068 :   if (!sx) return sy? icopy_sign(y, sy): gen_0;
      94 14270456224 :   if (!sy) return icopy_sign(x, sx);
      95 11600715691 :   lx = lgefint(x);
      96 11600715691 :   ly = lgefint(y);
      97 11600715691 :   if (sx==sy)
      98  6308818121 :     z = addiispec(x+2,y+2,lx-2,ly-2);
      99             :   else
     100             :   { /* sx != sy */
     101  5291897570 :     long i = cmpiispec(x+2,y+2,lx-2,ly-2);
     102  5370943528 :     if (!i) return gen_0;
     103             :     /* we must ensure |x| > |y| for subiispec */
     104  5094680784 :     if (i < 0) {
     105  2113405114 :       sx = sy;
     106  2113405114 :       z = subiispec(y+2,x+2,ly-2,lx-2);
     107             :     }
     108             :     else
     109  2981275670 :       z = subiispec(x+2,y+2,lx-2,ly-2);
     110             :   }
     111 11377657461 :   setsigne(z,sx); return z;
     112             : }
     113             : 
     114             : INLINE GEN
     115   376300251 : rcopy_sign(GEN x, long sx) { GEN y = rcopy(x); setsigne(y,sx); return y; }
     116             : 
     117             : GEN
     118   470951569 : addir_sign(GEN x, long sx, GEN y, long sy)
     119             : {
     120             :   long e, l, ly;
     121             :   GEN z;
     122             : 
     123   470951569 :   if (!sx) return rcopy_sign(y, sy);
     124   142491470 :   e = expo(y) - expi(x);
     125   142536305 :   if (!sy)
     126             :   {
     127      551234 :     if (e >= 0) return rcopy_sign(y, sy);
     128      551186 :     z = itor(x, nbits2prec(-e));
     129      551166 :     setsigne(z, sx); return z;
     130             :   }
     131             : 
     132   141985071 :   ly = lg(y);
     133   141985071 :   if (e > 0)
     134             :   {
     135    41055471 :     l = lg2prec(ly - divsBIL(e));
     136    41054132 :     if (l < LOWDEFAULTPREC) return rcopy_sign(y, sy);
     137             :   }
     138   100929600 :   else l = lg2prec(ly) + nbits2extraprec(-e);
     139   141573319 :   z = (GEN)avma;
     140   141573319 :   y = addrr_sign(itor(x,l), sx, y, sy);
     141  1414135448 :   ly = lg(y); while (ly--) *--z = y[ly];
     142   141556326 :   set_avma((pari_sp)z); return z;
     143             : }
     144             : 
     145             : static GEN
     146   476871323 : addsr_sign(long x, GEN y, long sy)
     147             : {
     148             :   long e, l, ly, sx;
     149             :   GEN z;
     150             : 
     151   476871323 :   if (!x) return rcopy_sign(y, sy);
     152   476858576 :   if (x < 0) { sx = -1; x = -x; } else sx = 1;
     153   476858576 :   e = expo(y) - expu(x);
     154   476795038 :   if (!sy)
     155             :   {
     156      502258 :     if (e >= 0) return rcopy_sign(y, sy);
     157      502230 :     if (sx == -1) x = -x;
     158      502230 :     return stor(x, nbits2prec(-e));
     159             :   }
     160             : 
     161   476292780 :   ly = lg(y);
     162   476292780 :   if (e > 0)
     163             :   {
     164     4762611 :     l = lg2prec(ly - divsBIL(e));
     165     4762580 :     if (l < LOWDEFAULTPREC) return rcopy_sign(y, sy);
     166             :   }
     167   471530169 :   else l = lg2prec(ly) + nbits2extraprec(-e);
     168   475298550 :   z = (GEN)avma;
     169   475298550 :   y = addrr_sign(stor(x,l), sx, y, sy);
     170  6288846856 :   ly = lg(y); while (ly--) *--z = y[ly];
     171   475548426 :   set_avma((pari_sp)z); return z;
     172             : }
     173             : 
     174             : GEN
     175   468131996 : addsr(long x, GEN y) { return addsr_sign(x, y, signe(y)); }
     176             : 
     177             : GEN
     178     8756198 : subsr(long x, GEN y) { return addsr_sign(x, y, -signe(y)); }
     179             : 
     180             : GEN
     181  4782108541 : addrr_sign(GEN x, long sx, GEN y, long sy)
     182             : {
     183  4782108541 :   long lx, ex = expo(x);
     184  4782108541 :   long ly, ey = expo(y), e = ey - ex;
     185             :   long i, j, lz, ez, m;
     186             :   int extend, f2;
     187             :   GEN z;
     188             :   LOCAL_OVERFLOW;
     189             : 
     190  4782108541 :   if (!sy)
     191             :   {
     192   297278965 :     if (!sx)
     193             :     {
     194    95959732 :       if (e > 0) ex = ey;
     195    95959732 :       return real_0_bit(ex);
     196             :     }
     197   201319233 :     if (e >= 0) return real_0_bit(ey);
     198   200296089 :     lz = nbits2lg(-e);
     199   200405590 :     lx = lg(x); if (lz > lx) lz = lx;
     200  1555690595 :     z = cgetg(lz, t_REAL); while(--lz) z[lz] = x[lz];
     201   200419276 :     setsigne(z,sx); return z;
     202             :   }
     203  4484829576 :   if (!sx)
     204             :   {
     205    25196589 :     if (e <= 0) return real_0_bit(ex);
     206    23743369 :     lz = nbits2lg(e);
     207    23743247 :     ly = lg(y); if (lz > ly) lz = ly;
     208   123467303 :     z = cgetg(lz, t_REAL); while (--lz) z[lz] = y[lz];
     209    23742287 :     setsigne(z,sy); return z;
     210             :   }
     211             : 
     212  4459632987 :   if (e < 0) { swap(x,y); lswap(sx,sy); ey=ex; e=-e; }
     213             :   /* now ey >= ex */
     214  4459632987 :   lx = lg(x);
     215  4459632987 :   ly = lg(y);
     216             :   /* If exponents differ, need to shift one argument, here x. If
     217             :    * extend = 1: extension of x,z by m < BIL bits (round to 1 word) */
     218             :   /* in this case, lz = lx + d + 1, otherwise lx + d */
     219  4459632987 :   extend = 0;
     220  4459632987 :   if (e)
     221             :   {
     222  3861755114 :     long d = dvmdsBIL(e, &m), l = ly-d;
     223  3858520467 :     if (l <= 2) return rcopy_sign(y, sy);
     224  3817286748 :     if (l > lx) { lz = lx + d + 1; extend = 1; }
     225  3037595935 :     else        { lz = ly; lx = l; }
     226  3817286748 :     if (m)
     227             :     { /* shift x right m bits */
     228  3803748223 :       const pari_sp av = avma;
     229  3803748223 :       const ulong sh = BITS_IN_LONG-m;
     230  3803748223 :       GEN p1 = x; x = new_chunk(lx + lz + 1);
     231  3799546555 :       shift_right(x,p1,2,lx, 0,m);
     232  3802381712 :       if (extend) uel(x,lx) = uel(p1,lx-1) << sh;
     233  3802381712 :       set_avma(av); /* HACK: cgetg(lz, t_REAL) will not overwrite x */
     234             :     }
     235             :   }
     236             :   else
     237             :   { /* d = 0 */
     238   597877873 :     m = 0;
     239   597877873 :     if (lx > ly) lx = ly;
     240   597877873 :     lz = lx;
     241             :   }
     242             : 
     243  4416766160 :   if (sx == sy)
     244             :   { /* addition */
     245  2284959404 :     i = lz-1;
     246  2284959404 :     j = lx-1;
     247  2284959404 :     if (extend) {
     248   464910233 :       ulong garde = addll(x[lx], y[i]);
     249   464910233 :       if (m < 4) /* don't extend for few correct bits */
     250    54004497 :         z = cgetg(--lz, t_REAL);
     251             :       else
     252             :       {
     253   410905736 :         z = cgetg(lz, t_REAL);
     254   411040333 :         z[i] = garde;
     255             :       }
     256             :     }
     257             :     else
     258             :     {
     259  1820049171 :       z = cgetg(lz, t_REAL);
     260  1821684790 :       z[i] = addll(x[j], y[i]); j--;
     261             :     }
     262  2283751328 :     i--;
     263 12874733965 :     for (; j>=2; i--,j--) z[i] = addllx(x[j],y[i]);
     264  2283751328 :     if (overflow)
     265             :     {
     266   537003464 :       z[1] = 1; /* stops since z[1] != 0 */
     267   538245463 :       for (;;) { z[i] = uel(y,i)+1; if (z[i--]) break; }
     268   537003464 :       if (i <= 0)
     269             :       {
     270   533393248 :         shift_right(z,z, 2,lz, 1,1);
     271   533590723 :         z[1] = evalsigne(sx) | evalexpo(ey+1); return z;
     272             :       }
     273             :     }
     274  2250018225 :     for (; i>=2; i--) z[i] = y[i];
     275  1750358080 :     z[1] = evalsigne(sx) | evalexpo(ey); return z;
     276             :   }
     277             : 
     278             :   /* subtraction */
     279  2131806756 :   if (e) f2 = 1;
     280             :   else
     281             :   {
     282   559831265 :     i = 2; while (i < lx && x[i] == y[i]) i++;
     283   337453470 :     if (i==lx) return real_0_bit(ey+1 - lg2prec(lx));
     284   316393486 :     f2 = (uel(y,i) > uel(x,i));
     285             :   }
     286             :   /* result is nonzero. f2 = (y > x) */
     287  2110746772 :   i = lz-1; z = cgetg(lz, t_REAL);
     288  2108501221 :   if (f2)
     289             :   {
     290  1971363738 :     j = lx-1;
     291  1971363738 :     if (extend) z[i] = subll(y[i], x[lx]);
     292  1656885093 :     else        z[i] = subll(y[i], x[j--]);
     293 12611771870 :     for (i--; j>=2; i--) z[i] = subllx(y[i], x[j--]);
     294  1971363738 :     if (overflow) /* stops since y[1] != 0 */
     295    66464349 :       for (;;) { z[i] = uel(y,i)-1; if (y[i--]) break; }
     296  2330423682 :     for (; i>=2; i--) z[i] = y[i];
     297  1971363738 :     sx = sy;
     298             :   }
     299             :   else
     300             :   {
     301   137137483 :     if (extend) z[i] = subll(x[lx], y[i]);
     302   137137483 :     else        z[i] = subll(x[i],  y[i]);
     303   762621529 :     for (i--; i>=2; i--) z[i] = subllx(x[i], y[i]);
     304             :   }
     305             : 
     306  2259649614 :   x = z+2; i = 0; while (!x[i]) i++;
     307  2108501221 :   lz -= i; z += i;
     308  2108501221 :   j = bfffo(z[2]); /* need to shift left by j bits to normalize mantissa */
     309  2108501221 :   ez = ey - (j | (i * BITS_IN_LONG));
     310  2108501221 :   if (extend)
     311             :   { /* z was extended by d+1 words [should be e bits = d words + m bits] */
     312             :     /* not worth keeping extra word if less than 5 significant bits in there */
     313   314863005 :     if (m - j < 5 && lz > 3)
     314   168349604 :     { /* shorten z */
     315   168347147 :       ulong last = (ulong)z[--lz]; /* cancelled word */
     316             : 
     317             :       /* if we need to shift anyway, shorten from left
     318             :        * If not, shorten from right, neutralizing last word of z */
     319   168347147 :       if (j == 0)
     320             :         /* stackdummy((pari_sp)(z + lz+1), (pari_sp)(z + lz)); */
     321    13754125 :         z[lz] = evaltyp(t_VECSMALL) | _evallg(1);
     322             :       else
     323             :       {
     324   154593022 :         GEN t = z;
     325   154593022 :         z++; shift_left(z,t,2,lz-1, last,j);
     326             :       }
     327   168349604 :       if ((last<<j) & HIGHBIT)
     328             :       { /* round up */
     329    61325567 :         i = lz-1;
     330    61756960 :         while (++((ulong*)z)[i] == 0 && i > 1) i--;
     331    61325567 :         if (i == 1) { ez++; z[2] = (long)HIGHBIT; }
     332             :       }
     333             :     }
     334   146515858 :     else if (j) shift_left(z,z,2,lz-1, 0,j);
     335             :   }
     336  1793638216 :   else if (j) shift_left(z,z,2,lz-1, 0,j);
     337  2109350775 :   z[1] = evalsigne(sx) | evalexpo(ez);
     338  2115804948 :   z[0] = evaltyp(t_REAL) | evallg(lz);
     339  2114622566 :   set_avma((pari_sp)z); return z;
     340             : }

Generated by: LCOV version 1.16