[BACK]Return to tst-addsub.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / tests / devel

Annotation of OpenXM_contrib/gmp/tests/devel/tst-addsub.c, Revision 1.1.1.1

1.1       ohara       1: /* Copyright 1996, 2001 Free Software Foundation, Inc.
                      2:
                      3: This file is part of the GNU MP Library.
                      4:
                      5: The GNU MP Library is free software; you can redistribute it and/or modify
                      6: it under the terms of the GNU Lesser General Public License as published by
                      7: the Free Software Foundation; either version 2.1 of the License, or (at your
                      8: option) any later version.
                      9:
                     10: The GNU MP Library is distributed in the hope that it will be useful, but
                     11: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
                     13: License for more details.
                     14:
                     15: You should have received a copy of the GNU Lesser General Public License
                     16: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
                     17: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                     18: MA 02111-1307, USA.
                     19: */
                     20:
                     21: #include <stdio.h>
                     22: #include <stdlib.h>
                     23: #include "gmp.h"
                     24: #include "gmp-impl.h"
                     25:
                     26: #define ADD 1
                     27: #define SUB 2
                     28:
                     29: #ifndef METHOD
                     30: #define METHOD ADD
                     31: #endif
                     32:
                     33: #if METHOD == ADD
                     34: #define REFCALL refmpn_add_n
                     35: #define TESTCALL mpn_add_n
                     36: #endif
                     37:
                     38: #if METHOD == SUB
                     39: #define REFCALL refmpn_sub_n
                     40: #define TESTCALL mpn_sub_n
                     41: #endif
                     42:
                     43: mp_limb_t refmpn_add_n ();
                     44: mp_limb_t refmpn_sub_n ();
                     45:
                     46: #define SIZE 100
                     47:
                     48: main (argc, argv)
                     49:      int argc;
                     50:      char **argv;
                     51: {
                     52:   mp_size_t alloc_size, max_size, size, i, cumul_size;
                     53:   mp_ptr s1, s2, dx, dy;
                     54:   int s1_align, s2_align, d_align;
                     55:   long pass, n_passes;
                     56:   mp_limb_t cx, cy;
                     57:
                     58:   max_size = SIZE;
                     59:   n_passes = 1000000;
                     60:
                     61:   argc--; argv++;
                     62:   if (argc)
                     63:     {
                     64:       max_size = atol (*argv);
                     65:       argc--; argv++;
                     66:     }
                     67:
                     68:   alloc_size = max_size + 32;
                     69:   s1 = malloc (alloc_size * BYTES_PER_MP_LIMB);
                     70:   s2 = malloc (alloc_size * BYTES_PER_MP_LIMB);
                     71:   dx = malloc (alloc_size * BYTES_PER_MP_LIMB);
                     72:   dy = malloc (alloc_size * BYTES_PER_MP_LIMB);
                     73:
                     74:   cumul_size = 0;
                     75:   for (pass = 0; pass < n_passes; pass++)
                     76:     {
                     77:       cumul_size += size;
                     78:       if (cumul_size >= 1000000)
                     79:        {
                     80:          cumul_size -= 1000000;
                     81:          printf ("%d ", pass); fflush (stdout);
                     82:        }
                     83:       s1_align = random () % 32;
                     84:       s2_align = random () % 32;
                     85:       d_align = random () % 32;
                     86:
                     87:       size = random () % max_size + 1;
                     88:
                     89:       mpn_random2 (s1 + s1_align, size);
                     90:       mpn_random2 (s2 + s2_align, size);
                     91:
                     92:       for (i = 0; i < alloc_size; i++)
                     93:        dx[i] = dy[i] = i + 0x9876500;
                     94:
                     95:       cx = TESTCALL (dx + d_align, s1 + s1_align, s2 + s2_align, size);
                     96:       cy = REFCALL (dy + d_align, s1 + s1_align, s2 + s2_align, size);
                     97:
                     98:       if (cx != cy || mpn_cmp (dx, dy, alloc_size) != 0)
                     99:        abort ();
                    100:     }
                    101:
                    102:   printf ("%d passes OK\n", n_passes);
                    103:   exit (0);
                    104: }
                    105:
                    106: mp_limb_t
                    107: #if __STDC__
                    108: refmpn_add_n (mp_ptr res_ptr,
                    109:              mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
                    110: #else
                    111: refmpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
                    112:      register mp_ptr res_ptr;
                    113:      register mp_srcptr s1_ptr;
                    114:      register mp_srcptr s2_ptr;
                    115:      mp_size_t size;
                    116: #endif
                    117: {
                    118:   register mp_limb_t x, y, cy;
                    119:   register mp_size_t j;
                    120:
                    121:   /* The loop counter and index J goes from -SIZE to -1.  This way
                    122:      the loop becomes faster.  */
                    123:   j = -size;
                    124:
                    125:   /* Offset the base pointers to compensate for the negative indices.  */
                    126:   s1_ptr -= j;
                    127:   s2_ptr -= j;
                    128:   res_ptr -= j;
                    129:
                    130:   cy = 0;
                    131:   do
                    132:     {
                    133:       y = s2_ptr[j];
                    134:       x = s1_ptr[j];
                    135:       y += cy;                 /* add previous carry to one addend */
                    136:       cy = (y < cy);           /* get out carry from that addition */
                    137:       y = x + y;               /* add other addend */
                    138:       cy = (y < x) + cy;       /* get out carry from that add, combine */
                    139:       res_ptr[j] = y;
                    140:     }
                    141:   while (++j != 0);
                    142:
                    143:   return cy;
                    144: }
                    145:
                    146: mp_limb_t
                    147: #if __STDC__
                    148: refmpn_sub_n (mp_ptr res_ptr,
                    149:               mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
                    150: #else
                    151: refmpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
                    152:      register mp_ptr res_ptr;
                    153:      register mp_srcptr s1_ptr;
                    154:      register mp_srcptr s2_ptr;
                    155:      mp_size_t size;
                    156: #endif
                    157: {
                    158:   register mp_limb_t x, y, cy;
                    159:   register mp_size_t j;
                    160:
                    161:   /* The loop counter and index J goes from -SIZE to -1.  This way
                    162:      the loop becomes faster.  */
                    163:   j = -size;
                    164:
                    165:   /* Offset the base pointers to compensate for the negative indices.  */
                    166:   s1_ptr -= j;
                    167:   s2_ptr -= j;
                    168:   res_ptr -= j;
                    169:
                    170:   cy = 0;
                    171:   do
                    172:     {
                    173:       y = s2_ptr[j];
                    174:       x = s1_ptr[j];
                    175:       y += cy;                 /* add previous carry to subtrahend */
                    176:       cy = (y < cy);           /* get out carry from that addition */
                    177:       y = x - y;               /* main subtract */
                    178:       cy = (y > x) + cy;       /* get out carry from the subtract, combine */
                    179:       res_ptr[j] = y;
                    180:     }
                    181:   while (++j != 0);
                    182:
                    183:   return cy;
                    184: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>